Check out what’s new from Firebase at Google I/O 2022. Learn more

गेम लूप टेस्ट के साथ शुरुआत करें

जब गेमिंग ऐप्स विभिन्न UI फ़्रेमवर्क पर बनाए जाते हैं, तो गेम परीक्षण को स्वचालित करना कठिन हो सकता है। गेम लूप परीक्षण आपको अपने मूल परीक्षणों को टेस्ट लैब के साथ एकीकृत करने और उन्हें आपके द्वारा चुने गए उपकरणों पर आसानी से चलाने की अनुमति देता है। एक गेम लूप परीक्षण एक वास्तविक खिलाड़ी के कार्यों का अनुकरण करते हुए आपके गेमिंग ऐप के माध्यम से आपका परीक्षण चलाता है। यह मार्गदर्शिका आपको गेम लूप परीक्षण चलाने का तरीका दिखाती है, फिर Firebase कंसोल में अपने परीक्षा परिणाम देखें और प्रबंधित करें।

अपने गेम इंजन के आधार पर, आप एकल या एकाधिक लूप के साथ परीक्षण लागू कर सकते हैं। लूप आपके गेमिंग ऐप पर आपके परीक्षण का पूर्ण या आंशिक रन-थ्रू है। गेम लूप का उपयोग इसके लिए किया जा सकता है:

  • अपने गेम का एक स्तर उसी तरह चलाएं जैसे कोई अंतिम उपयोगकर्ता इसे खेलता है। आप या तो उपयोगकर्ता के इनपुट को स्क्रिप्ट कर सकते हैं, उपयोगकर्ता को निष्क्रिय रहने दे सकते हैं, या उपयोगकर्ता को एआई से बदल सकते हैं यदि यह आपके गेम में समझ में आता है (उदाहरण के लिए, मान लें कि आपके पास रेस कार गेमिंग ऐप है और पहले से ही एआई लागू है। आप कर सकते हैं आसानी से उपयोगकर्ता के इनपुट के लिए एआई ड्राइवर को चार्ज करें)।
  • यह देखने के लिए कि डिवाइस इसका समर्थन करते हैं या नहीं, अपने गेम को उच्चतम गुणवत्ता सेटिंग पर चलाएं।
  • एक तकनीकी परीक्षण चलाएं (कई शेडर्स संकलित करें, उन्हें निष्पादित करें, जांचें कि आउटपुट अपेक्षित है, आदि)।

आप गेम लूप परीक्षण को एकल परीक्षण उपकरण, परीक्षण उपकरणों के सेट या परीक्षण लैब पर चला सकते हैं। हालांकि, हम आभासी उपकरणों पर गेम लूप परीक्षण चलाने की अनुशंसा नहीं करते हैं क्योंकि उनके पास भौतिक उपकरणों की तुलना में कम ग्राफिक्स फ्रेम दर है।

शुरू करने से पहले

किसी परीक्षण को लागू करने के लिए, आपको पहले अपने ऐप को गेम लूप परीक्षणों के लिए कॉन्फ़िगर करना होगा।

  1. अपने ऐप मेनिफेस्ट में, अपनी गतिविधि में एक नया इंटेंट फ़िल्टर जोड़ें :

    <activity android:name=".MyActivity">
       <intent-filter>
           <action android:name="com.google.intent.action.TEST_LOOP"/>
           <category android:name="android.intent.category.DEFAULT"/>
           <data android:mimeType="application/javascript"/>
       </intent-filter>
       <intent-filter>
          ... (other intent filters here)
       </intent-filter>
    </activity>
    

    यह टेस्ट लैब को आपके गेम को एक विशिष्ट इरादे से ट्रिगर करके लॉन्च करने की अनुमति देता है।

  2. आपके कोड में (हम onCreate मेथड डिक्लेरेशन के अंदर अनुशंसा करते हैं), निम्नलिखित जोड़ें:

    Java

    Intent launchIntent = getIntent();
    if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) {
        int scenario = launchIntent.getIntExtra("scenario", 0);
        // Code to handle your game loop here
    }

    Kotlin+KTX

    val launchIntent = intent
    if (launchIntent.action == "com.google.intent.action.TEST_LOOP") {
        val scenario = launchIntent.getIntExtra("scenario", 0)
        // Code to handle your game loop here
    }

    यह आपकी गतिविधि को इसे लॉन्च करने वाले इरादे की जांच करने की अनुमति देता है। आप चाहें तो इस कोड को बाद में भी जोड़ सकते हैं (उदाहरण के लिए, अपने गेम इंजन को शुरू में लोड करने के बाद)।

  3. अनुशंसित: परीक्षण के अंत में, जोड़ें:

    Java

    yourActivity.finish();

    Kotlin+KTX

    yourActivity.finish()

    गेम लूप परीक्षण पूरा होने पर यह आपका ऐप बंद कर देता है। अगला लूप शुरू करने के लिए परीक्षण आपके ऐप के UI ढांचे पर निर्भर करता है, और आपके ऐप को बंद करने से यह पता चलता है कि परीक्षण समाप्त हो गया है।

गेम लूप टेस्ट बनाएं और चलाएं

गेम लूप परीक्षणों के लिए अपना ऐप कॉन्फ़िगर करने के बाद, आप तुरंत एक परीक्षण बना सकते हैं और इसे अपने गेमिंग ऐप में चला सकते हैं। आप या तो फायरबेस कंसोल या gcloud कमांड लाइन इंटरफेस (CLI) का उपयोग करके या टेस्ट लूप मैनेजर का उपयोग करके किसी स्थानीय डिवाइस पर टेस्ट लैब में एक परीक्षण चलाने का विकल्प चुन सकते हैं।

स्थानीय डिवाइस पर चलाएं

टेस्ट लैब का टेस्ट लूप मैनेजर एक ओपन सोर्स ऐप है जो गेम लूप टेस्ट को एकीकृत करने और उन्हें आपके स्थानीय उपकरणों पर चलाने में आपकी मदद करता है। यह आपकी गुणवत्ता आश्वासन टीम को उनके उपकरणों पर समान गेम लूप चलाने की भी अनुमति देता है।

टेस्ट लूप मैनेजर का उपयोग करके स्थानीय डिवाइस पर परीक्षण चलाने के लिए:

  1. फोन या टैबलेट पर टेस्ट लूप मैनेजर डाउनलोड करें और इसे चलाकर इंस्टॉल करें:
    adb install testloopmanager.apk
  2. अपने डिवाइस पर, अपने फ़ोन या टैबलेट पर टेस्ट लूप ऐप्स ऐप खोलें। ऐप आपके डिवाइस पर ऐप्स की एक सूची प्रदर्शित करता है जिसे गेम लूप के साथ चलाया जा सकता है। यदि आपको अपना गेमिंग ऐप यहां नहीं दिखाई देता है, तो सुनिश्चित करें कि आपका इंटेंट फ़िल्टर आपके आरंभ करने से पहले अनुभाग के पहले चरण में वर्णित एक से मेल खाता है।
  3. अपना गेमिंग ऐप चुनें, फिर जितने लूप आप चलाना चाहते हैं, उन्हें चुनें। नोट: इस चरण में, आप केवल एक लूप के बजाय लूप का एक सबसेट चलाना चुन सकते हैं। एक साथ कई लूप चलाने के बारे में अधिक जानकारी के लिए, वैकल्पिक सुविधाएँ देखें।
  4. रन टेस्ट पर क्लिक करें। आपका परीक्षण तुरंत चलना शुरू हो जाता है।

टेस्ट लैब में चलाएं

आप Firebase कंसोल या gcloud CLI का उपयोग करके टेस्ट लैब में गेम लूप परीक्षण चला सकते हैं। शुरू करने से पहले, अगर आपने पहले से ऐसा नहीं किया है, तो फायरबेस कंसोल खोलें और एक प्रोजेक्ट बनाएं।

फायरबेस कंसोल का प्रयोग करें

  1. फायरबेस कंसोल में, बाएं पैनल से लैब टेस्ट पर क्लिक करें।
  2. अपना पहला परीक्षण चलाएँ पर क्लिक करें (या यदि आपके प्रोजेक्ट ने पहले एक परीक्षण चलाया है तो एक परीक्षण चलाएँ)।
  3. परीक्षण प्रकार के रूप में गेम लूप का चयन करें और फिर जारी रखें पर क्लिक करें।
  4. ब्राउज़ करें क्लिक करें, और फिर अपने ऐप की .apk फ़ाइल में ब्राउज़ करें। नोट: इस चरण में, आप केवल एक लूप के बजाय लूप का एक सबसेट चलाना चुन सकते हैं। एक साथ कई लूप चलाने के बारे में अधिक जानकारी के लिए, वैकल्पिक सुविधाएँ देखें।
  5. जारी रखें पर क्लिक करें।
  6. अपने ऐप का परीक्षण करने के लिए उपयोग करने के लिए भौतिक उपकरणों का चयन करें।
  7. परीक्षण प्रारंभ करें क्लिक करें.

Firebase कंसोल के साथ आरंभ करने के बारे में अधिक जानकारी के लिए, Firebase कंसोल के साथ परीक्षण प्रारंभ करें देखें।

gcloud कमांड-लाइन (CLI) का उपयोग करें

  1. यदि आपने पहले से नहीं किया है, तो Google क्लाउड एसडीके डाउनलोड और इंस्टॉल करें।

  2. अपने Google खाते का उपयोग करके gcloud CLI में लॉग इन करें:

    gcloud auth login

  3. अपना Firebase प्रोजेक्ट gcloud में सेट करें, जहां PROJECT_ID आपके Firebase प्रोजेक्ट की आईडी है:

    gcloud config set project PROJECT_ID
    
  4. अपना पहला परीक्षण चलाएँ:

    gcloud firebase test android run \
     --type=game-loop --app=<var>path-to-apk</var> \
     --device model=herolte,version=23
    

gcloud CLI के साथ आरंभ करने के बारे में अधिक जानकारी के लिए, gcloud कमांड लाइन से परीक्षण प्रारंभ करें देखें।

वैकल्पिक विशेषताएं

टेस्ट लैब कई वैकल्पिक सुविधाएँ प्रदान करता है जो आपको आउटपुट डेटा लिखने की क्षमता, कई गेम लूप के लिए समर्थन, और संबंधित लूप के लिए लेबल सहित अपने परीक्षणों को और अधिक अनुकूलित करने देती हैं।

आउटपुट डेटा लिखें

आपका गेम लूप परीक्षण launchIntent.getData() विधि में निर्दिष्ट फ़ाइल में आउटपुट लिख सकता है। एक परीक्षण चलाने के बाद, आप इस आउटपुट डेटा को फायरबेस कंसोल के टेस्ट लैब सेक्शन में एक्सेस कर सकते हैं ( गेम लूप टेस्ट आउटपुट फ़ाइल उदाहरण देखें )।

फ़ाइल साझा करना में वर्णित ऐप्स के बीच फ़ाइल साझा करने के लिए परीक्षण लैब सर्वोत्तम प्रथाओं का पालन करता है। आपकी गतिविधि की onCreate() विधि में, जहां आपका इरादा स्थित है, आप निम्न कोड चलाकर अपनी डेटा आउटपुट फ़ाइल की जांच कर सकते हैं:

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    // ...
}

Kotlin+KTX

val launchIntent = intent
val logFile = launchIntent.data
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    // ...
}

यदि आप अपने गेम ऐप के सी ++ पक्ष से फ़ाइल को लिखना चाहते हैं, तो आप फ़ाइल पथ के बजाय फ़ाइल डिस्क्रिप्टर में पास कर सकते हैं:

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
int fd = -1;
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    try {
        fd = getContentResolver()
                .openAssetFileDescriptor(logFile, "w")
                .getParcelFileDescriptor()
                .getFd();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        fd = -1;
    } catch (NullPointerException e) {
        e.printStackTrace();
        fd = -1;
    }
}

// C++ code invoked here.
// native_function(fd);

Kotlin+KTX

val launchIntent = intent
val logFile = launchIntent.data
var fd = -1
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    fd = try {
        contentResolver
                .openAssetFileDescriptor(logFile, "w")!!
                .parcelFileDescriptor
                .fd
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
        -1
    } catch (e: NullPointerException) {
        e.printStackTrace()
        -1
    }
}

// C++ code invoked here.
// native_function(fd);

सी++

#include <unistd.h>
JNIEXPORT void JNICALL
Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) {
// The file descriptor needs to be duplicated.
int my_file_descriptor = dup(log_file_descriptor);
}

आउटपुट फ़ाइल उदाहरण

आप फायरबेस कंसोल के टेस्ट लैब सेक्शन में गेम लूप टेस्ट परिणाम प्रदर्शित करने के लिए आउटपुट डेटा फाइलों (नीचे दिए गए उदाहरण की तरह प्रारूपित) का उपयोग कर सकते हैं। /.../ के रूप में दिखाए गए क्षेत्रों में आपके लिए आवश्यक कोई भी कस्टम फ़ील्ड हो सकते हैं, जब तक कि वे इस फ़ाइल में उपयोग किए गए अन्य फ़ील्ड के नामों के साथ विरोध न करें:

{
  "name": "test name",
  "start_timestamp": 0, // Timestamp of the test start (in us).
                           Can be absolute or relative
  "driver_info": "...",
  "frame_stats": [
    {
      "timestamp": 1200000, // Timestamp at which this section was written
                               It contains value regarding the period
                               start_timestamp(0) -> this timestamp (1200000 us)
      "avg_frame_time": 15320, // Average time to render a frame in ns
      "nb_swap": 52, // Number of frame rendered
      "threads": [
        {
          "name": "physics",
          "Avg_time": 8030 // Average time spent in this thread per frame in us
        },
        {
          "name": "AI",
          "Avg_time": 2030 // Average time spent in this thread per frame in us
        }
      ],
      /.../ // Any custom field you want (vertices display on the screen, nb units …)
    },
    {
      // Next frame data here, same format as above
    }
  ],
  "loading_stats": [
    {
      "name": "assets_level_1",
      "total_time": 7850, // in us
      /.../
    },
    {
      "name": "victory_screen",
      "total_time": 554, // in us
      /.../
    }

  ],
  /.../, // You can add custom fields here
}

एकाधिक गेम लूप

आपको अपने ऐप में कई गेम लूप चलाना उपयोगी लग सकता है। एक लूप शुरू से अंत तक आपके गेम ऐप का पूरा रन-थ्रू है। उदाहरण के लिए, यदि आपके गेम में कई स्तर हैं, तो हो सकता है कि आप प्रत्येक स्तर को लॉन्च करने के लिए एक लूप रखने के बजाय एक गेम लूप रखना चाहें जो उन सभी के माध्यम से पुनरावृत्त हो। इस तरह, यदि आपका ऐप 32 के स्तर पर क्रैश हो जाता है, तो आप क्रैश को पुन: उत्पन्न करने और बग फिक्स का परीक्षण करने के लिए सीधे उस गेम लूप को लॉन्च कर सकते हैं।

अपने ऐप को एक साथ कई लूप चलाने के लिए सक्षम करने के लिए:

  • यदि आप परीक्षण लूप प्रबंधक के साथ परीक्षण चला रहे हैं:

    1. <application> तत्व के अंदर, अपने ऐप के मेनिफेस्ट में निम्न पंक्ति जोड़ें:

      <meta-data
        android:name="com.google.test.loops"
        android:value="5" />
      

      इस लॉन्च इरादे में एक पूर्णांक पैरामीटर के रूप में लक्ष्य लूप शामिल है। android:value फ़ील्ड में, आप 1 से 1024 तक एक पूर्णांक निर्दिष्ट कर सकते हैं (एक परीक्षण के लिए अनुमत लूप की अधिकतम संख्या)। ध्यान दें कि लूप को 1 से शुरू करके अनुक्रमित किया जाता है, 0 से नहीं।

    2. टेस्ट लूप मैनेजर ऐप में, एक चयन स्क्रीन दिखाई देती है जो आपको यह चुनने की अनुमति देती है कि आप कौन सा लूप चलाना चाहते हैं। यदि आप एकाधिक लूप का चयन करते हैं, तो प्रत्येक लूप पिछले लूप के पूरा होने के बाद क्रम में लॉन्च होता है।

  • यदि आप Firebase कंसोल के साथ कोई परीक्षण चला रहे हैं, तो परिदृश्य फ़ील्ड में एक सूची या लूप संख्याओं की श्रेणी दर्ज करें।

  • यदि आप gcloud CLI के साथ कोई परीक्षण चला रहे हैं, तो --scenario-numbers फ़्लैग का उपयोग करके लूप संख्याओं की सूची निर्दिष्ट करें। उदाहरण के लिए, --scenario-numbers=1,3,5 लूप 1, 3, और 5 रन करता है।

  • यदि आप सी ++ लिख रहे हैं और अपने लूप के व्यवहार को बदलना चाहते हैं, तो निम्नलिखित अतिरिक्त को अपने मूल सी ++ कोड में पास करें:

    Java

    Intent launchIntent = getIntent();
    int scenario = launchIntent.getIntExtra("scenario", 0);

    Kotlin+KTX

    val launchIntent = intent
    val scenario = launchIntent.getIntExtra("scenario", 0)

    अब आप परिणामी int वैल्यू के आधार पर अपने लूप के व्यवहार को बदल सकते हैं।

लेबल गेम लूप

जब आप अपने गेम लूप को एक या अधिक परिदृश्य लेबल के साथ लेबल करते हैं, तो आप और आपकी QA टीम आसानी से संबंधित गेम लूप (जैसे, "सभी संगतता गेम लूप") का एक सेट लॉन्च कर सकते हैं और एक ही मैट्रिक्स में उनका परीक्षण कर सकते हैं। आप अपने खुद के लेबल बना सकते हैं या टेस्ट लैब द्वारा पेश किए गए पूर्वनिर्धारित लेबल का उपयोग कर सकते हैं:

  • com.google.test.loops.player_experience : खेल खेलते समय वास्तविक उपयोगकर्ता के अनुभव को पुन: पेश करने के लिए उपयोग किए जाने वाले लूप के लिए। इन लूपों के साथ परीक्षण का लक्ष्य उन मुद्दों को खोजना है जो एक वास्तविक उपयोगकर्ता को गेम खेलते समय सामना करना पड़ेगा।
  • com.google.test.loops.gpu_compatibility : GPU से संबंधित समस्याओं का परीक्षण करने के लिए उपयोग किए जाने वाले लूप के लिए। इन लूपों के साथ परीक्षण का लक्ष्य GPU कोड को निष्पादित करना है जो हार्डवेयर और ड्राइवरों के साथ समस्याओं को उजागर करने के लिए उत्पादन में ठीक से नहीं चल सकता है।
  • com.google.test.loops.compatibility : I/O मुद्दों और ओपनएसएसएल मुद्दों सहित संगतता मुद्दों की एक विस्तृत श्रृंखला का परीक्षण करने के लिए उपयोग किए जाने वाले लूप के लिए।
  • com.google.test.loops.performance : डिवाइस के प्रदर्शन का परीक्षण करने के लिए उपयोग किए जाने वाले लूप के लिए। उदाहरण के लिए, कोई गेम सबसे जटिल ग्राफ़िक्स सेटिंग्स पर चल सकता है यह देखने के लिए कि कोई नया डिवाइस कैसा व्यवहार करता है।

अपने ऐप को समान लेबल वाले लूप चलाने के लिए सक्षम करने के लिए:

  • यदि आप परीक्षण लूप प्रबंधक के साथ परीक्षण चला रहे हैं:

    1. अपने ऐप के मेनिफेस्ट में, निम्न मेटा-डेटा लाइन जोड़ें और LABEL_NAME को अपनी पसंद के लेबल से बदलें:

      <meta-data
       android:name="com.google.test.loops.LABEL_NAME"
       android:value="1,3-5" />
      

      android:value फ़ील्ड में, आप 1 से 1024 (एक परीक्षण के लिए अनुमत लूपों की अधिकतम संख्या) तक एक श्रेणी या पूर्णांकों का एक सेट निर्दिष्ट कर सकते हैं जो उन लूपों का प्रतिनिधित्व करते हैं जिन्हें आप लेबल करना चाहते हैं। ध्यान दें कि लूप को 1 से शुरू करके अनुक्रमित किया जाता है, 0 से नहीं। उदाहरण के लिए, android:value="1,3-5" LABEL_NAME को लूप 1, 3, 4, और 5 पर लागू करता है।

    2. टेस्ट लूप मैनेजर ऐप में, लेबल फ़ील्ड में एक या अधिक लेबल दर्ज करें।

  • यदि आप Firebase कंसोल के साथ कोई परीक्षण चला रहे हैं, तो लेबल फ़ील्ड में एक या अधिक लेबल दर्ज करें।

  • यदि आप gcloud CLI के साथ कोई परीक्षण चला रहे हैं, तो --scenario-labels फ़्लैग (उदा., --scenario-labels=performance,gpu ) का उपयोग करके एक या अधिक परिदृश्य लेबल निर्दिष्ट करें।

ऐप लाइसेंसिंग समर्थन

टेस्ट लैब उन ऐप्स का समर्थन करता है जो Google Play द्वारा दी जाने वाली ऐप लाइसेंसिंग सेवा का उपयोग करते हैं। टेस्ट लैब के साथ अपने ऐप का परीक्षण करते समय लाइसेंसिंग की सफलतापूर्वक जांच करने के लिए, आपको अपने ऐप को Play स्टोर में प्रोडक्शन चैनल पर प्रकाशित करना होगा। परीक्षण लैब का उपयोग करके अल्फ़ा या बीटा चैनल में अपने ऐप का परीक्षण करने के लिए, अपने ऐप को टेस्ट लैब में अपलोड करने से पहले लाइसेंस जांच को हटा दें।

ज्ञात पहलु

टेस्ट लैब में गेम लूप टेस्ट में निम्नलिखित ज्ञात समस्याएं हैं:

  • कुछ क्रैश बैकट्रेस का समर्थन नहीं करते हैं। उदाहरण के लिए, कुछ रिलीज़ बिल्ड prctl(PR_SET_DUMPABLE, 0) का उपयोग करके debuggerd प्रक्रिया के आउटपुट को दबा सकते हैं। अधिक जानने के लिए, debuggerd देखें।
  • फ़ाइल अनुमति त्रुटियों के कारण API स्तर 19 वर्तमान में समर्थित नहीं है।