بدء استخدام اختبارات Game Loop

قد يكون من الصعب إجراء اختبارات الألعاب تلقائيًا عندما تكون تطبيقات الألعاب قائمة على أطر عمل واجهة المستخدم. تتيح لك اختبارات Game Loop دمج اختباراتك الأصلية مع يمكنك اختبار مركز الاختبار الافتراضي وتشغيلها بسهولة على الأجهزة التي تختارها. يتيح اختبار حلقة الألعاب اختبار الألعاب من خلال لعبة فيديو مع محاكاة إجراءات لاعب حقيقي. هذا النمط كيفية إجراء اختبار حلقة الألعاب، ثم عرض الاختبار وإدارته نتائج في "وحدة تحكُّم Firebase".

استنادًا إلى محرّك لعبتك، يمكنك تنفيذ الاختبارات باستخدام اختبار واحد أو عدة اختبارات. تكرارات. التكرار الحلقي هو إجراء كامل أو جزئي للاختبار. على لعبتك على الأجهزة الجوّالة. يمكن استخدام "حلقات الألعاب" لتنفيذ ما يلي:

  • يمكنك تشغيل مستوى من لعبتك بالطريقة نفسها التي يلعب بها المستخدم النهائي. يمكنك إدخال المستخدم إلى نص برمجي، أو ترك المستخدم في وضع عدم النشاط، أو استبدال مستخدم باستخدام الذكاء الاصطناعي إذا كان ذلك مناسبًا في لعبتك (على سبيل المثال، لنفترض أنّ لديك سيارة سباق للألعاب على الأجهزة الجوّالة ويمتلك الذكاء الاصطناعي يمكنك بسهولة وضع تكنولوجيا الذكاء الاصطناعي برنامج التشغيل المسؤول عن البيانات التي يُدخلها المستخدم).
  • يمكنك تشغيل لعبتك بأعلى جودة لمعرفة ما إذا كانت الأجهزة متوافقة.
  • قم بإجراء اختبار تقني (اجمع أدوات تظليل متعددة، ونفذها، ثم تحقق من المخرج كما هو متوقع، وما إلى ذلك).

يمكنك إجراء اختبار Game Loop على جهاز اختبار واحد أو مجموعة من أجهزة الاختبار. على 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+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();

    يؤدي ذلك إلى إغلاق تطبيقك عند اكتمال اختبار "حلقة الألعاب". يعتمد الاختبار على يعمل إطار عمل واجهة المستخدم في تطبيقك على بدء التكرار الحلقي التالي، ويؤدي إغلاق التطبيق إلى معرفة ذلك بأن الاختبار قد انتهى.

إنشاء اختبار حلقة الألعاب وتنفيذه

بعد ضبط تطبيقك لاختبارات Game Loop، يمكنك على الفور إنشاء واختبارها وتشغيلها في لعبتك على الأجهزة الجوّالة يمكنك اختيار إجراء اختبار في Test Lab باستخدام وحدة تحكم Firebase أو gcloud أو واجهة سطر الأوامر (CLI) أو على جهاز محلي يستخدم حلقة الاختبار مدير

التشغيل على جهاز محلي

تطبيق Test Loop Manager من Test Lab هو تطبيق مفتوح المصدر يساعدك دمج اختبارات Game Loop وتشغيلها على أجهزتك المحلية. كما يسمح لك تشغيل حلقات الألعاب نفسها على أجهزة فريق ضمان الجودة

لإجراء اختبار على جهاز محلي باستخدام Test Loop Manager:

  1. تنزيل Test Loop Manager على هاتف أو جهاز لوحي وتثبيته من خلال تشغيل:
    adb install testloopmanager.apk
  2. على جهازك، افتح تطبيق Test Loop Apps على هاتفك أو لوحي. يعرض التطبيق قائمة بالتطبيقات التي يمكن تشغيلها من خلال حلقات الألعاب. إذا لم يظهر لك لعبتك على الأجهزة الجوّالة هنا، يُرجى التأكّد من يتطابق فلتر الأهداف مع الفلتر الموضّح في الخطوة الأولى من قسم "قبل البدء":
  3. اختَر تطبيق الألعاب، ثم اختَر عدد التكرارات التي تريد تشغيلها. ملاحظة: في هذه الخطوة، يمكنك اختيار تشغيل مجموعة فرعية من التكرارات الحلقية بدلاً من في حلقة واحدة. لمزيد من المعلومات حول إجراء تكرارات متعددة في الوقت نفسه، راجِع الميزات الاختيارية.
  4. انقر على إجراء اختبار. سيبدأ تشغيل الاختبار على الفور.

التنفيذ في مركز الاختبار الافتراضي

يمكنك إجراء اختبار Game Loop في Test Lab باستخدام إما وحدة تحكُّم Firebase أو gcloud CLI قبل إذا لم تكن قد قمت بذلك بالفعل، فقم بفتح وحدة تحكُّم Firebase وإنشاء مشروع

استخدام "وحدة تحكُّم Firebase"

  1. في وحدة تحكُّم Firebase، انقر على مركز الاختبار الافتراضي من اللوحة اليمنى.
  2. انقر على إجراء الاختبار الأول (أو إجراء اختبار إذا كان مشروعك يتضمن إجراء اختبار في وقت سابق).
  3. اختَر حلقة اللعبة كنوع الاختبار، ثم انقر على متابعة.
  4. انقر على تصفّح، ثم انتقِل إلى ملف .apk في تطبيقك. ملاحظة: في هذه الخطوة، يمكنك اختيار تشغيل مجموعة فرعية من التكرارات الحلقية بدلاً من في حلقة واحدة. لمزيد من المعلومات حول إجراء حلقات متعددة في وقت واحد، راجع ميزات اختيارية:
  5. انقر على متابعة.
  6. يُرجى اختيار الأجهزة المطلوب استخدامها لاختبار تطبيقك.
  7. انقر على بدء الاختبارات.

لمزيد من المعلومات عن بدء استخدام "وحدة تحكُّم Firebase"، يُرجى الاطّلاع على بدء الاختبار باستخدام "وحدة تحكُّم Firebase"

استخدام سطر أوامر gcloud (CLI)

  1. نزِّل حزمة تطوير البرامج (SDK) لخدمة Google Cloud وثبِّتها، إذا لم يسبق لك إجراء ذلك.

  2. تسجيل الدخول إلى gcloud CLI باستخدام حساب Google:

    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(). بعد إجراء اختبار، يمكنك الوصول إلى هذا بيانات المخرجات في قسم مركز الاختبار الافتراضي بوحدة تحكم Firebase (راجع مثال على ملف إخراج اختبار حلقة الألعاب).

يتّبع مركز الاختبار الافتراضي أفضل الممارسات لمشاركة ملف بين التطبيقات، كما هو موضَّح في مشاركة ملف في طريقة 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);

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. يمكن أن تحتوي المناطق المعروضة على أنّها /.../ على أيّ حقول مخصّصة تحتاج إليها، ما دامت هذه المناطق تظهر لك. لا تتعارض مع أسماء الحقول الأخرى المستخدمة في هذا الملف:

{
  "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 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 الناتجة.

حلقات ألعاب شركات الإنتاج

عند تصنيف حلقات الألعاب باستخدام تصنيف سيناريو واحد أو أكثر، يمكنك أنت وفريق تأكيد الجودة تشغيل مجموعة من حلقات الألعاب ذات الصلة بسهولة (مثل "جميع التوافق حلقات الألعاب") واختبارها في مصفوفة واحدة. يمكنك إنشاء التسميات الخاصة بك أو استخدام التصنيفات المحددة مسبقًا التي يقدمها مركز الاختبار الافتراضي:

  • 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 CLI، حدِّد أحد أو المزيد من تسميات السيناريوهات باستخدام إبلاغ --scenario-labels (مثل --scenario-labels=performance,gpu).

دعم ترخيص التطبيقات

يتوافق مركز الاختبار الافتراضي مع التطبيقات التي تستخدم ترخيص التطبيق التي يقدمها Google Play. للتحقّق من الترخيص بنجاح عند الاختبار تطبيقك مع Test Lab، يجب نشر التطبيق في قناة الإنتاج في متجر Play. لاختبار تطبيقك في قناة ألفا أو قناة تجريبية باستخدام Test Lab، عليك إزالة عملية التحقق من الترخيص قبل تحميل التطبيق إلى مركز الاختبار الافتراضي

المشكلات المعروفة

تتضمّن اختبارات Game Loop في Test Lab المشاكل المعروفة التالية:

  • يُرجى العِلم أنّ بعض الأعطال لا تتوافق مع ميزة "تتبُّع الخلفية". على سبيل المثال، قد تتضمن بعض إصدارات الإصدارات إيقاف ناتج عملية debuggerd باستخدام prctl(PR_SET_DUMPABLE, 0) لمزيد من المعلومات، يُرجى مراجعة debuggerd.
  • لا يمكن حاليًا استخدام المستوى 19 من واجهة برمجة التطبيقات بسبب أخطاء في أذونات الملفات.