गेम लूप के टेस्ट शुरू करें

अलग-अलग यूआई फ़्रेमवर्क पर बने गेमिंग ऐप्लिकेशन की जांच को ऑटोमेट करना मुश्किल हो सकता है. गेम लूप टेस्ट की मदद से, अपने नेटिव टेस्ट को Test Lab के साथ इंटिग्रेट किया जा सकता है. साथ ही, चुने गए डिवाइसों पर उन्हें आसानी से चलाया जा सकता है. गेम लूप टेस्ट, आपके गेमिंग ऐप्लिकेशन के ज़रिए टेस्ट चलाता है. साथ ही, यह असली खिलाड़ी की कार्रवाइयों को सिम्युलेट करता है. इस गाइड में, गेम लूप टेस्ट चलाने का तरीका बताया गया है. साथ ही, इसमें Firebase कंसोल में टेस्ट के नतीजों को देखने और मैनेज करने का तरीका भी बताया गया है.

आपके गेम इंजन के आधार पर, एक या एक से ज़्यादा लूप के साथ टेस्ट लागू किए जा सकते हैं. लूप, आपके गेमिंग ऐप्लिकेशन पर टेस्ट का पूरा या आंशिक रन-थ्रू होता है. गेम लूप का इस्तेमाल इन कामों के लिए किया जा सकता है:

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

गेम लूप टेस्ट, किसी एक टेस्ट डिवाइस, टेस्ट डिवाइसों के सेट या Test Lab पर चलाया जा सकता है. हालांकि, हम वर्चुअल डिवाइसों पर गेम लूप टेस्ट चलाने का सुझाव नहीं देते, क्योंकि इनमें फ़िज़िकल डिवाइसों की तुलना में ग्राफ़िक्स फ़्रेम रेट कम होता है.

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

टेस्ट लागू करने के लिए, आपको पहले गेम लूप टेस्ट के लिए अपने ऐप्लिकेशन को कॉन्फ़िगर करना होगा.

  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>

    इससे Test Lab किसी खास इंटेंट को ट्रिगर करके आपका गेम लॉन्च कर सकता है.

  2. अपने कोड में (हमारा सुझाव है कि इसे onCreate तरीके के एलान में जोड़ें), यह जोड़ें:

    Kotlin

    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
    }

    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
    }

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

  3. सुझाव: टेस्ट के आखिर में, यह जोड़ें:

    Kotlin

    yourActivity.finish()

    Java

    yourActivity.finish();

    इससे गेम लूप टेस्ट पूरा होने पर, आपका ऐप्लिकेशन बंद हो जाता है. टेस्ट, अगले लूप को शुरू करने के लिए आपके ऐप्लिकेशन के यूआई फ़्रेमवर्क पर निर्भर करता है. ऐप्लिकेशन को बंद करने से उसे पता चलता है कि टेस्ट पूरा हो गया है.

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

गेम लूप टेस्ट के लिए अपने ऐप्लिकेशन को कॉन्फ़िगर करने के बाद, तुरंत कोई टेस्ट बनाया जा सकता है और उसे अपने गेमिंग ऐप्लिकेशन में चलाया जा सकता है. Test Lab में टेस्ट चलाने के लिए, Firebase कंसोल या gcloud कमांड लाइन इंटरफ़ेस (सीएलआई) का इस्तेमाल किया जा सकता है. इसके अलावा, Test Loop Manager का इस्तेमाल करके, स्थानीय डिवाइस पर भी टेस्ट चलाया जा सकता है.Test LabFirebase

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

Test Lab का Test Loop Manager एक ओपन सोर्स ऐप्लिकेशन है. इसकी मदद से, गेम लूप टेस्ट को इंटिग्रेट किया जा सकता है और उन्हें अपने स्थानीय डिवाइसों पर चलाया जा सकता है. इससे आपकी क्वालिटी अश्योरेंस टीम, अपने डिवाइसों पर भी वही गेम लूप चला सकती है.

Test Loop Manager का इस्तेमाल करके, स्थानीय डिवाइस पर टेस्ट चलाने के लिए:

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

Test Lab में चलाना

Test Lab में, गेम लूप टेस्ट चलाने के लिए Test Lab का इस्तेमाल किया जा सकता है. इसके लिए, Firebase कंसोल या gcloud सीएलआई का इस्तेमाल करें. शुरू करने से पहले, अगर आपने अब तक Firebase Firebase कंसोल नहीं खोला है, तो इसे खोलें और कोई प्रोजेक्ट बनाएं.

Firebase कंसोल का इस्तेमाल करना

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

Firebase कंसोल का इस्तेमाल शुरू करने के बारे में ज़्यादा जानने के लिए, Firebase कंसोल की मदद से टेस्ट करना लेख पढ़ें.

gcloud कमांड-लाइन (सीएलआई) का इस्तेमाल करना

  1. अगर आपने अब तक Google Cloud SDK डाउनलोड और इंस्टॉल नहीं किया है, तो इसे डाउनलोड और इंस्टॉल करें

  2. अपने Google खाते का इस्तेमाल करके, gcloud सीएलआई में साइन इन करें:

    gcloud auth login

  3. gcloud में अपना Firebase प्रोजेक्ट सेट करें. यहां 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 सीएलआई का इस्तेमाल शुरू करने के बारे में ज़्यादा जानने के लिए, gcloud कमांड लाइन से टेस्ट करना लेख पढ़ें.

वैकल्पिक सुविधाएं

Test Lab कई वैकल्पिक सुविधाएं उपलब्ध कराता है. इनकी मदद से, टेस्ट को और भी पसंद के मुताबिक बनाया जा सकता है. इनमें आउटपुट डेटा लिखने की सुविधा, एक से ज़्यादा गेम लूप के लिए सहायता, और मिलते-जुलते लूप के लिए लेबल शामिल हैं.

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

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

Test Lab ऐप्लिकेशन के बीच फ़ाइल शेयर करने के लिए सबसे सही तरीकों का पालन करता है. इनके बारे में, फ़ाइल शेयर करना लेख में बताया गया है. अपनी गतिविधि के onCreate() तरीके में, जहां आपका इंटेंट मौजूद है, वहां यह कोड चलाकर अपने डेटा आउटपुट फ़ाइल की जांच की जा सकती है:

Kotlin

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

Java

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

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

Kotlin

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);

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);

C++

#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);
}

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

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

{
  "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 पर क्रैश होता है, तो उस क्रैश को फिर से लाने और गड़बड़ी को ठीक करने के लिए, सीधे उस गेम लूप को लॉन्च किया जा सकता है.

अपने ऐप्लिकेशन को एक साथ कई लूप चलाने की अनुमति देने के लिए:

  • अगर Test Loop Manager की मदद से कोई टेस्ट चलाया जा रहा है, तो:

    1. अपने ऐप्लिकेशन के मेनिफ़ेस्ट में, <application> एलिमेंट के अंदर यह लाइन जोड़ें:

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

      इस लॉन्च इंटेंट में, टारगेट लूप को इंटिजर पैरामीटर के तौर पर शामिल किया जाता है. android:value फ़ील्ड में, 1 से 1024 तक कोई इंटिजर तय किया जा सकता है. यह किसी एक टेस्ट के लिए, लूप की ज़्यादा से ज़्यादा संख्या है. ध्यान दें कि लूप की इंडेक्सिंग 1 से शुरू होती है, न कि 0 से.

    2. Test Loop Manager ऐप्लिकेशन में, एक स्क्रीन दिखती है. इसकी मदद से, यह चुना जा सकता है कि आपको कौनसा/कौनसे लूप चलाने हैं. अगर एक से ज़्यादा लूप चुने जाते हैं, तो हर लूप, पिछले लूप के पूरा होने के बाद क्रम से लॉन्च होता है.

  • अगर Firebase कंसोल की मदद से कोई टेस्ट चलाया जा रहा है, तो लूप नंबर की सूची या रेंज सिनेरियो फ़ील्ड में डालें.

  • अगर gcloud सीएलआई की मदद से कोई टेस्ट चलाया जा रहा है, तो --scenario-numbers फ़्लैग का इस्तेमाल करके, लूप नंबर की सूची तय करें. उदाहरण के लिए, --scenario-numbers=1,3,5 से लूप 1, 3, और 5 चलते हैं.

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

    Kotlin

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

    Java

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

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

गेम लूप को लेबल करना

अपने गेम लूप को एक या एक से ज़्यादा सिनेरियो लेबल से लेबल करने पर, आपको और आपकी क्वालिटी अश्योरेंस टीम को मिलते-जुलते गेम लूप का सेट (जैसे, "सभी कंपैटिबिलिटी गेम लूप") आसानी से लॉन्च करने और उन्हें एक ही मैट्रिक्स में टेस्ट करने की सुविधा मिलती है. आपके पास अपने लेबल बनाने या Test Lab के पहले से तय किए गए लेबल का इस्तेमाल करने का विकल्प होता है:

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

अपने ऐप्लिकेशन को एक ही लेबल वाले लूप चलाने की अनुमति देने के लिए:

  • अगर Test Loop Manager की मदद से कोई टेस्ट चलाया जा रहा है, तो:

    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. Test Loop Manager ऐप्लिकेशन में, लेबल फ़ील्ड में एक या एक से ज़्यादा लेबल डालें.

  • अगर Firebase कंसोल की मदद से कोई टेस्ट चलाया जा रहा है, तो एक या एक से ज़्यादा लेबल को लेबल फ़ील्ड में डालें.

  • अगर gcloud सीएलआई की मदद से कोई टेस्ट चलाया जा रहा है, तो एक या एक से ज़्यादा सिनेरियो लेबल तय करने के लिए --scenario-labels फ़्लैग का इस्तेमाल करें. जैसे, --scenario-labels=performance,gpu.

ऐप्लिकेशन लाइसेंसिंग की सुविधा

Test Lab Google Play की ओर से दी जाने वाली ऐप्लिकेशन लाइसेंसिंग सेवा का इस्तेमाल करने वाले ऐप्लिकेशन को सपोर्ट करता है. Test Lab की मदद से अपने ऐप्लिकेशन की जांच करते समय, लाइसेंसिंग की सुविधा को सफलतापूर्वक जांचने के लिए, आपको अपने ऐप्लिकेशन को Play Store के प्रोडक्शन चैनल पर पब्लिश करना होगा.Test Lab Test Lab की मदद से, अपने ऐप्लिकेशन को अल्फ़ा या बीटा चैनल में टेस्ट करने के लिए, अपने ऐप्लिकेशन को Test Lab पर अपलोड करने से पहले, लाइसेंसिंग की जांच को हटाएं.Test Lab

ज्ञात समस्याएं

Test Lab में, गेम लूप टेस्ट से जुड़ी ये समस्याएं पहले से मौजूद हैं:

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