با آزمونهای Game Loop شروع کنید

زمانی که برنامه‌های بازی بر روی چارچوب‌های مختلف رابط کاربری ساخته شده‌اند، آزمایش خودکار بازی دشوار است. تست‌های حلقه بازی به شما این امکان را می‌دهند که تست‌های بومی خود را با Test Lab ادغام کنید و به راحتی آن‌ها را روی دستگاه‌هایی که انتخاب می‌کنید اجرا کنید. تست Game Loop آزمایش شما را از طریق برنامه بازی شما انجام می دهد و در عین حال اقدامات یک بازیکن واقعی را شبیه سازی می کند. این راهنما به شما نشان می دهد که چگونه یک تست Game Loop را اجرا کنید، سپس نتایج آزمایش خود را در کنسول Firebase مشاهده و مدیریت کنید.

بسته به نوع موتور بازی خود را، شما می توانید آزمون با یک یا پیاده سازی حلقه های متعدد . یک حلقه آزمایش کامل یا جزئی از آزمایش شما در برنامه بازی شما است. از حلقه های بازی می توان برای موارد زیر استفاده کرد:

  • یک سطح از بازی خود را به همان شیوه ای که کاربر نهایی آن را بازی می کند اجرا کنید. می‌توانید ورودی کاربر را اسکریپت کنید، اجازه دهید کاربر بیکار باشد، یا اگر در بازی شما منطقی است، کاربر را با یک هوش مصنوعی جایگزین کنید (مثلاً، بگویید که یک برنامه بازی ماشین مسابقه دارید و قبلاً یک هوش مصنوعی پیاده‌سازی کرده‌اید. می‌توانید به راحتی یک درایور هوش مصنوعی را مسئول ورودی کاربر قرار دهید).
  • بازی خود را با بالاترین کیفیت اجرا کنید تا ببینید آیا دستگاه ها از آن پشتیبانی می کنند یا خیر.
  • یک تست فنی را اجرا کنید (چند سایه زن را کامپایل کنید، آنها را اجرا کنید، بررسی کنید که خروجی مطابق انتظار است و غیره).

می‌توانید تست حلقه بازی را روی یک دستگاه آزمایشی، مجموعه‌ای از دستگاه‌های آزمایشی یا در آزمایشگاه آزمایشی اجرا کنید. با این حال، ما انجام تست های Game Loop را بر روی دستگاه های مجازی توصیه نمی کنیم، زیرا آنها نرخ فریم گرافیکی کمتری نسبت به دستگاه های فیزیکی دارند.

قبل از اینکه شروع کنی

برای اجرای یک تست، ابتدا باید اپلیکیشن خود را برای تست های Game Loop پیکربندی کنید.

  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 روش اعلام)، اضافه کردن موارد زیر است:

    جاوا

    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. توصیه می شود: در پایان آزمون، اضافه کنید:

    جاوا

    yourActivity.finish();

    Kotlin+KTX

    yourActivity.finish()

    وقتی تست Game Loop کامل شد، این برنامه شما را می‌بندد. آزمایش برای شروع حلقه بعدی به چارچوب رابط کاربری برنامه شما متکی است و بستن برنامه به آن می گوید که آزمایش به پایان رسیده است.

یک تست Game Loop ایجاد و اجرا کنید

بعد از اینکه برنامه خود را برای تست های Game Loop پیکربندی کردید، می توانید بلافاصله یک آزمایش ایجاد کنید و آن را در برنامه بازی خود اجرا کنید. شما می توانید انتخاب کنید برای اجرای آزمون در آزمایشگاه تست با استفاده از کنسول فایربیس یا رابط خط فرمان gcloud (CLI) ، و یا در دستگاه های محلی با استفاده از آزمون حلقه مدیر .

روی دستگاه محلی اجرا شود

تست حلقه مدیر تست آزمایشگاه یک برنامه منبع باز است که کمک می کند تا شما را یکپارچه سازی بازی تست حلقه و آنها را اجرا در دستگاه های محلی خود است. همچنین به تیم تضمین کیفیت شما اجازه می‌دهد تا حلقه‌های بازی مشابهی را روی دستگاه‌های خود اجرا کند.

برای اجرای تست روی دستگاه محلی با استفاده از Test Loop Manager:

  1. دانلود تست حلقه مدیر در گوشی و یا تبلت و نصب آن در حال اجرا توسط:
    adb install testloopmanager.apk
  2. بر روی دستگاه شما، باز کردن برنامه تست حلقه نرم افزار بر روی گوشی یا تبلت خود را. این برنامه لیستی از برنامه های موجود در دستگاه شما را نشان می دهد که می توانند با حلقه های بازی اجرا شوند. اگر شما برنامه بازی های خود را در اینجا مشاهده کنید، مطمئن شوید که فیلتر قصد خود را منطبق بر یک شرح داده شده در مرحله اول از قبل از اینکه شما بخش آغاز .
  3. برنامه بازی خود را انتخاب کنید، سپس تعداد حلقه هایی را که می خواهید اجرا کنید انتخاب کنید. توجه: در این مرحله می‌توانید به جای یک حلقه، زیرمجموعه‌ای از حلقه‌ها را اجرا کنید. برای اطلاعات بیشتر در حال اجرا حلقه های متعدد در یک بار، و ویژگی های اختیاری.
  4. کلیک کنید آزمون اجرا. تست شما بلافاصله شروع به اجرا می کند.

در آزمایشگاه تست اجرا کنید

شما می توانید یک تست بازی حلقه در آزمایشگاه تست با استفاده از اجرای فایربیس کنسول یا CLI gcloud. قبل از شروع، اگر شما در حال حاضر نیست، باز کردن کنسول فایربیس و ایجاد یک پروژه است.

از کنسول Firebase استفاده کنید

  1. در فایربیس کنسول، کلیک کنید تست آزمایشگاه از پنل سمت چپ.
  2. کلیک کنید اجرای تست اول شما (و یا اجرای یک تست اگر پروژه شما قبلا اجرای آزمون).
  3. انتخاب کنید بازی Loop به عنوان نوع آزمون، و سپس کلیک کنید ادامه.
  4. مرور را کلیک کنید، و سپس به برنامه خود را فهرست .apk فایل. توجه: در این مرحله می‌توانید به جای یک حلقه، زیرمجموعه‌ای از حلقه‌ها را اجرا کنید. برای اطلاعات بیشتر در حال اجرا حلقه های متعدد در یک بار، و ویژگی های اختیاری.
  5. روی ادامه کلیک کنید.
  6. دستگاه های فیزیکی را برای آزمایش برنامه خود انتخاب کنید.
  7. کلیک کنید تست شروع.

برای کسب اطلاعات بیشتر در شروع کار با فایربیس کنسول، و شروع به تست با کنسول فایربیس.

استفاده از خط فرمان gcloud (CLI)

  1. اگر شما در حال حاضر، دانلود و نصب ابر SDK گوگل.

  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
    

برای اطلاعات بیشتر در شروع کار با CLI gcloud، نگاه کنید شروع به تست از خط فرمان gcloud.

ویژگی های اختیاری

Test Lab چندین ویژگی اختیاری را ارائه می دهد که به شما امکان می دهد تست های خود را بیشتر سفارشی کنید، از جمله توانایی نوشتن داده های خروجی، پشتیبانی از حلقه های بازی های متعدد و برچسب ها برای حلقه های مرتبط.

داده های خروجی را بنویسید

تست بازی حلقه شما می توانید خروجی را به یک فایل مشخص شده در ارسال launchIntent.getData() روش. پس از آزمون اجرا شود، شما می توانید این داده های خروجی در بخش تست آزمایشگاه از کنسول فایربیس مراجعه کنید ( بازی Loop خروجی آزمون به عنوان مثال فایل ).

تست آزمایشگاه زیر بهترین شیوه برای به اشتراک گذاری فایل ها بین برنامه های شرح داده شده در به اشتراک گذاری فایل . در فعالیت های خود را در onCreate() روش، که در آن قصد خود را واقع شده است، شما می توانید فایل خروجی داده های خود را در حال اجرا کد زیر را بررسی کنید:

جاوا

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}")
    // ...
}

اگر می‌خواهید از سمت C++ برنامه بازی خود روی فایل بنویسید، می‌توانید به جای مسیر فایل، توصیفگر فایل را ارسال کنید:

جاوا

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

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

نمونه فایل خروجی

شما می توانید فایل های داده های خروجی (فرمت مانند مثال زیر) به نمایش بازی نتایج آزمون حلقه در بخش تست آزمایشگاه از کنسول فایربیس استفاده کنید. نقشه نشان داده شده است به عنوان /.../ می تواند شامل هر زمینه های سفارشی که شما نیاز دارید، تا زمانی که آنها را در تضاد نیست با نام سایر زمینه های مورد استفاده در این فایل:

{
  "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، یک صفحه انتخاب ظاهر می شود که به شما امکان می دهد حلقه(هایی) را که می خواهید اجرا کنید انتخاب کنید. اگر چندین حلقه را انتخاب کنید، هر حلقه به ترتیب پس از تکمیل حلقه قبلی راه اندازی می شود.

  • اگر شما در حال اجرا یک آزمون با فایربیس کنسول، یک لیست و یا یک محدوده از اعداد حلقه در زمینه سناریوهای را وارد کنید.

  • اگر شما در حال اجرا یک آزمون با CLI gcloud، مشخص یک لیست از اعداد حلقه با استفاده از --scenario-numbers پرچم. به عنوان مثال، --scenario-numbers=1,3,5 اجرا می شود حلقه 1، 3 و 5.

  • اگر در حال نوشتن C++ هستید و می خواهید رفتار حلقه خود را تغییر دهید، موارد اضافی زیر را به کد اصلی C++ خود منتقل کنید:

    جاوا

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

    Kotlin+KTX

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

    شما هم اکنون می توانید رفتار حلقه خود را بر اساس نتیجه تغییر int مقدار است.

حلقه های بازی را برچسب بزنید

هنگامی که حلقه‌های بازی خود را با یک یا چند برچسب سناریو برچسب‌گذاری می‌کنید، شما و تیم QA خود می‌توانید به راحتی مجموعه‌ای از حلقه‌های بازی مرتبط را راه‌اندازی کنید (به عنوان مثال، "همه حلقه‌های بازی سازگاری") و آنها را در یک ماتریس آزمایش کنید. می توانید برچسب های خود را ایجاد کنید یا از برچسب های از پیش تعریف شده ارائه شده توسط Test Lab استفاده کنید:

  • com.google.test.loops.player_experience : حلقه for استفاده برای تولید مثل تجربه کاربر واقعی در هنگام بازی در بازی. هدف از آزمایش با این حلقه ها یافتن مشکلاتی است که یک کاربر واقعی در حین بازی با آن مواجه می شود.
  • com.google.test.loops.gpu_compatibility : حلقه for استفاده می شود به آزمون مسائل مربوط به GPU است. هدف از آزمایش با این حلقه‌ها اجرای کدهای GPU است که ممکن است به درستی در تولید اجرا نشود، تا مشکلات سخت‌افزار و درایورها را آشکار کند.
  • com.google.test.loops.compatibility : حلقه for استفاده برای تست طیف گسترده ای از مسائل مربوط به سازگاری، از جمله I / O مسائل و مسائل 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. در این برنامه تست حلقه مدیر، وارد یک یا چند برچسب در زمینه برچسب ها.

  • اگر شما در حال اجرا یک آزمون با فایربیس کنسول، وارد یک یا چند برچسب در زمینه برچسب ها.

  • اگر شما در حال اجرا یک آزمون با CLI gcloud، مشخص یک یا چند برچسب سناریو با استفاده از --scenario-labels پرچم (به عنوان مثال، --scenario-labels=performance,gpu ).

پشتیبانی از مجوز برنامه

تست آزمایشگاه از برنامه های که با استفاده از صدور مجوز نرم افزار خدمات ارائه شده توسط گوگل بازی. برای بررسی موفقیت آمیز مجوز هنگام آزمایش برنامه خود با Test Lab، باید برنامه خود را در کانال تولید در فروشگاه Play منتشر کنید. برای آزمایش برنامه خود در کانال آلفا یا بتا با استفاده از Test Lab، قبل از آپلود برنامه خود در Test Lab، بررسی مجوز را بردارید.

مشکلات شناخته شده

تست های حلقه بازی در آزمایشگاه تست دارای مشکلات شناخته شده زیر هستند:

  • برخی از خرابی ها از Backtraces پشتیبانی نمی کنند. برای مثال، برخی آزادی ایجاد ممکن است خروجی از سرکوب debuggerd فرآیند با استفاده از prctl(PR_SET_DUMPABLE, 0) . برای کسب اطلاعات بیشتر، نگاه کنید به debuggerd .
  • API Level 19 در حال حاضر به دلیل خطاهای مجوز فایل پشتیبانی نمی شود.