गेम लूप परीक्षण के साथ आरंभ करें

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

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

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

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

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

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

  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 विधि घोषणा के अंदर अनुशंसा करते हैं), निम्नलिखित जोड़ें:

    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
    }

    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+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

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

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

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

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

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

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

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

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

आप फायरबेस कंसोल या जीक्लाउड सीएलआई का उपयोग करके टेस्ट लैब में गेम लूप टेस्ट चला सकते हैं। शुरू करने से पहले, यदि आपने पहले से नहीं किया है, तो फायरबेस कंसोल खोलें और एक प्रोजेक्ट बनाएं।

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

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

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

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

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

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

    gcloud auth login

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

    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() विधि में, जहां आपका इरादा स्थित है, आप निम्नलिखित कोड चलाकर अपनी डेटा आउटपुट फ़ाइल की जांच कर सकते हैं:

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();
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    // ...
}

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

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

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

सी++

#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. टेस्ट लूप मैनेजर ऐप में, एक चयन स्क्रीन दिखाई देती है जो आपको यह चुनने की अनुमति देती है कि आप कौन सा लूप चलाना चाहते हैं। यदि आप एकाधिक लूप चुनते हैं, तो प्रत्येक लूप पूर्ववर्ती लूप के पूरा होने के बाद अनुक्रम में लॉन्च किया जाता है।

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

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

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

    Kotlin+KTX

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

    Java

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

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

गेम लूप्स को लेबल करें

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

  • com.google.test.loops.player_experience : गेम खेलते समय वास्तविक उपयोगकर्ता के अनुभव को पुन: पेश करने के लिए उपयोग किए जाने वाले लूप के लिए। इन लूप्स के साथ परीक्षण का लक्ष्य उन समस्याओं का पता लगाना है जिनका सामना एक वास्तविक उपयोगकर्ता को गेम खेलते समय करना पड़ेगा।
  • com.google.test.loops.gpu_compatibility : GPU से संबंधित समस्याओं का परीक्षण करने के लिए उपयोग किए जाने वाले लूप के लिए। इन लूपों के साथ परीक्षण का लक्ष्य जीपीयू कोड को निष्पादित करना है जो हार्डवेयर और ड्राइवरों के साथ समस्याओं को उजागर करने के लिए उत्पादन में ठीक से नहीं चल सकता है।
  • com.google.test.loops.compatibility : आई/ओ मुद्दों और ओपनएसएसएल मुद्दों सहित संगतता मुद्दों की एक विस्तृत श्रृंखला का परीक्षण करने के लिए उपयोग किए जाने वाले लूप के लिए।
  • 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" लूप्स 1, 3, 4 और 5 पर LABEL_NAME लागू करता है।

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

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

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

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

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

ज्ञात पहलु

टेस्ट लैब में गेम लूप परीक्षणों में निम्नलिखित ज्ञात समस्याएं हैं:

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