अलग-अलग यूआई फ़्रेमवर्क पर बने गेमिंग ऐप्लिकेशन की जांच को ऑटोमेट करना मुश्किल हो सकता है. गेम लूप टेस्ट की मदद से, अपने नेटिव टेस्ट को Test Lab के साथ इंटिग्रेट किया जा सकता है. साथ ही, चुने गए डिवाइसों पर उन्हें आसानी से चलाया जा सकता है. गेम लूप टेस्ट, आपके गेमिंग ऐप्लिकेशन के ज़रिए टेस्ट चलाता है. साथ ही, यह असली खिलाड़ी की कार्रवाइयों को सिम्युलेट करता है. इस गाइड में, गेम लूप टेस्ट चलाने का तरीका बताया गया है. साथ ही, इसमें Firebase कंसोल में टेस्ट के नतीजों को देखने और मैनेज करने का तरीका भी बताया गया है.
अपने गेम इंजन के हिसाब से, एक या एक से ज़्यादा लूप वाले टेस्ट लागू किए जा सकते हैं. लूप, आपके गेमिंग ऐप्लिकेशन पर टेस्ट का पूरा या आंशिक रन-थ्रू होता है. गेम लूप का इस्तेमाल इन कामों के लिए किया जा सकता है:
- अपने गेम का कोई लेवल, उसी तरह से चलाएं जिस तरह से कोई असली उपयोगकर्ता उसे खेलता है. आपके पास उपयोगकर्ता के इनपुट को स्क्रिप्ट करने, उपयोगकर्ता को कुछ समय के लिए निष्क्रिय रखने या उपयोगकर्ता की जगह एआई का इस्तेमाल करने का विकल्प होता है.हालांकि, ऐसा तब किया जा सकता है, जब यह आपके गेम के हिसाब से सही हो. उदाहरण के लिए, मान लें कि आपके पास रेस कार गेमिंग ऐप्लिकेशन है और उसमें पहले से ही एआई लागू है. ऐसे में, एआई ड्राइवर को उपयोगकर्ता के इनपुट की ज़िम्मेदारी आसानी से दी जा सकती है.
- अपने गेम को सबसे अच्छी क्वालिटी वाली सेटिंग पर चलाएं, ताकि यह देखा जा सके कि डिवाइस इसे सपोर्ट करते हैं या नहीं.
- कोई तकनीकी टेस्ट चलाएं. जैसे, एक से ज़्यादा शेडर कंपाइल करना, उन्हें एक्ज़ीक्यूट करना, यह देखना कि आउटपुट उम्मीद के मुताबिक है या नहीं वगैरह.
गेम लूप टेस्ट, किसी एक टेस्ट डिवाइस, टेस्ट डिवाइसों के सेट या Test Lab पर चलाया जा सकता है. हालांकि, हमारा सुझाव है कि गेम लूप टेस्ट, वर्चुअल डिवाइसों पर न चलाएं, क्योंकि इनमें ग्राफ़िक्स फ़्रेम रेट, असली डिवाइसों के मुकाबले कम होता है.
शुरू करने से पहले
कोई टेस्ट लागू करने के लिए, आपको पहले गेम लूप टेस्ट के लिए अपने ऐप्लिकेशन को कॉन्फ़िगर करना होगा.
अपने ऐप्लिकेशन के मेनिफ़ेस्ट में, अपनी गतिविधि में नया इंटेंट फ़िल्टर जोड़ें:
<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 किसी खास इंटेंट को ट्रिगर करके आपका गेम लॉन्च कर सकता है.
अपने कोड में (हमारा सुझाव है कि
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 }
इससे आपकी गतिविधि, उसे लॉन्च करने वाले इंटेंट की जांच कर सकती है. अगर चाहें, तो इस कोड को बाद में भी जोड़ा जा सकता है. जैसे, अपने गेम इंजन को शुरू में लोड करने के बाद.
सुझाव: टेस्ट के आखिर में, यह जोड़ें:
Kotlin
yourActivity.finish()
Java
yourActivity.finish();
इससे गेम लूप टेस्ट पूरा होने पर, आपका ऐप्लिकेशन बंद हो जाता है. टेस्ट, अगले लूप को शुरू करने के लिए, आपके ऐप्लिकेशन के यूआई फ़्रेमवर्क पर निर्भर करता है. ऐप्लिकेशन को बंद करने से, उसे यह पता चलता है कि टेस्ट पूरा हो गया है.
गेम लूप टेस्ट बनाना और चलाना
गेम लूप टेस्ट के लिए अपने ऐप्लिकेशन को कॉन्फ़िगर करने के बाद, तुरंत कोई टेस्ट बनाया जा सकता है और उसे अपने गेमिंग ऐप्लिकेशन में चलाया जा सकता है. Test Lab में टेस्ट चलाने के लिए, Firebase कंसोल या gcloud कमांड लाइन इंटरफ़ेस (सीएलआई) का इस्तेमाल किया जा सकता है. इसके अलावा, Test Loop Manager का इस्तेमाल करके, स्थानीय डिवाइस पर भी टेस्ट चलाया जा सकता है.Test LabFirebase
स्थानीय डिवाइस पर चलाना
Test Lab का Test Loop Manager एक ओपन सोर्स ऐप्लिकेशन है. इसकी मदद से, गेम लूप टेस्ट को इंटिग्रेट किया जा सकता है और उन्हें अपने स्थानीय डिवाइसों पर चलाया जा सकता है. इससे आपकी क्वालिटी अश्योरेंस टीम, अपने डिवाइसों पर भी वही गेम लूप चला सकती है.
Test Loop Manager का इस्तेमाल करके, स्थानीय डिवाइस पर टेस्ट चलाने के लिए:
- किसी फ़ोन या टैबलेट पर Test Loop Manager
डाउनलोड करें और इसे इंस्टॉल करने के लिए, यह कमांड चलाएं:
adb install testloopmanager.apk
- अपने डिवाइस पर, फ़ोन या टैबलेट पर Test Loop Apps ऐप्लिकेशन खोलें. यह ऐप्लिकेशन, आपके डिवाइस पर मौजूद उन ऐप्लिकेशन की सूची दिखाता है जिन्हें गेम लूप के साथ चलाया जा सकता है. अगर आपको यहां अपना गेमिंग ऐप्लिकेशन नहीं दिखता है, तो पक्का करें कि आपका इंटेंट फ़िल्टर, शुरू करने से पहले सेक्शन के पहले चरण में बताए गए इंटेंट फ़िल्टर से मैच करता हो.
- अपना गेमिंग ऐप्लिकेशन चुनें. इसके बाद, जितने लूप चलाने हैं उनकी संख्या चुनें. ध्यान दें: इस चरण में, सिर्फ़ एक लूप के बजाय, लूप के सबसेट को चलाने का विकल्प चुना जा सकता है. एक साथ कई लूप चलाने के बारे में ज़्यादा जानने के लिए, वैकल्पिक सुविधाएं लेख पढ़ें.
- टेस्ट चलाएं पर क्लिक करें. आपका टेस्ट तुरंत चलने लगता है.
Test Lab में चलाना
Test Lab में गेम लूप टेस्ट चलाने के लिए, Test Lab का इस्तेमाल किया जा सकता है. इसके लिए, Firebase कंसोल या gcloud सीएलआई का इस्तेमाल करें. शुरू करने से पहले, अगर आपने अब तक ऐसा नहीं किया है, तो Firebase कंसोल खोलें और कोई प्रोजेक्ट बनाएं.
Firebase कंसोल का इस्तेमाल करना
- Firebase कंसोल में, बाएं पैनल में मौजूद Test Lab पर क्लिक करें.
- अपना पहला टेस्ट चलाएं पर क्लिक करें. अगर आपके प्रोजेक्ट में पहले भी कोई टेस्ट चलाया गया है, तो कोई टेस्ट चलाएं पर क्लिक करें.
- टेस्ट के टाइप के तौर पर गेम लूप चुनें. इसके बाद, जारी रखें पर क्लिक करें.
- **ब्राउज़ करें** पर क्लिक करें. इसके बाद, अपने ऐप्लिकेशन की
.apkफ़ाइल पर जाएं. ध्यान दें: इस चरण में, सिर्फ़ एक लूप के बजाय, लूप के सबसेट को चलाने का विकल्प चुना जा सकता है. एक साथ कई लूप चलाने के बारे में ज़्यादा जानने के लिए, वैकल्पिक सुविधाएं लेख पढ़ें. - जारी रखें पर क्लिक करें.
- अपने ऐप्लिकेशन की जांच करने के लिए, असली डिवाइस चुनें.
- टेस्ट शुरू करें पर क्लिक करें.
Firebase कंसोल का इस्तेमाल शुरू करने के बारे में ज़्यादा जानने के लिए, Firebase कंसोल की मदद से टेस्ट करना लेख पढ़ें.
gcloud कमांड-लाइन (सीएलआई) का इस्तेमाल करना
अगर आपने अब तक Google Cloud SDK डाउनलोड और इंस्टॉल नहीं किया है, तो उसे डाउनलोड और इंस्टॉल करें
अपने Google खाते का इस्तेमाल करके, gcloud सीएलआई में साइन इन करें:
gcloud auth logingcloud में अपना Firebase प्रोजेक्ट सेट करें. यहां
PROJECT_IDआपके Firebase प्रोजेक्ट की आईडी है:gcloud config set project PROJECT_ID
अपना पहला टेस्ट चलाएं:
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); }
आउटपुट फ़ाइल का उदाहरण
आउटपुट डेटा फ़ाइलों (नीचे दिए गए उदाहरण की तरह फ़ॉर्मैट की गई) का इस्तेमाल करके, Firebase कंसोल के Test Lab सेक्शन में गेम
लूप टेस्ट के नतीजे दिखाए जा सकते हैं.
/.../ के तौर पर दिखाए गए इलाकों में, अपनी ज़रूरत के हिसाब से कोई भी कस्टम फ़ील्ड शामिल किया जा सकता है. हालांकि, यह ज़रूरी है कि वे इस फ़ाइल में इस्तेमाल किए गए अन्य फ़ील्ड के नामों से मेल न खाएं:
{
"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 की मदद से कोई टेस्ट चलाया जा रहा है, तो:
अपने ऐप्लिकेशन के मेनिफ़ेस्ट में,
<application>एलिमेंट के अंदर यह लाइन जोड़ें:<meta-data android:name="com.google.test.loops" android:value="5" />
इस लॉन्च इंटेंट में, टारगेट लूप को इंटिजर पैरामीटर के तौर पर शामिल किया जाता है.
android:valueफ़ील्ड में, 1 से 1024 तक कोई इंटिजर तय किया जा सकता है. यह किसी एक टेस्ट के लिए, लूप की ज़्यादा से ज़्यादा संख्या है. ध्यान दें कि लूप की इंडेक्सिंग 1 से शुरू होती है, न कि 0 से.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 की मदद से कोई टेस्ट चलाया जा रहा है, तो:
अपने ऐप्लिकेशन के मेनिफ़ेस्ट में, यह मेटा-डेटा लाइन जोड़ें और 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 पर लागू होता है.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
ज्ञात समस्याएं
Test Lab में गेम लूप टेस्ट से जुड़ी ये समस्याएं पहले से पता हैं:Test Lab
- कुछ क्रैश के लिए, बैकट्रैक की सुविधा उपलब्ध नहीं है. उदाहरण के लिए, कुछ रिलीज़ बिल्ड,
prctl(PR_SET_DUMPABLE, 0)का इस्तेमाल करके,debuggerdप्रोसेस के आउटपुट को दबा सकते हैं. ज़्यादा जानने के लिए,debuggerdदेखें. - फ़िलहाल, एपीआई लेवल 19 के लिए सहायता उपलब्ध नहीं है. इसकी वजह, फ़ाइल की अनुमति से जुड़ी गड़बड़ियां हैं.