Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

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

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

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

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

برای پیاده سازی یک آزمایش ، ابتدا باید برنامه خود را برای تست های Loop Game پیکربندی کنید.

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

    جاوا

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

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

یک تست حلقه بازی ایجاد و اجرا کنید

پس از پیکربندی برنامه خود برای آزمایش حلقه بازی ، می توانید بلافاصله یک آزمایش ایجاد کرده و آن را در برنامه بازی خود اجرا کنید. شما می توانید انتخاب کنید برای اجرای آزمون در آزمایشگاه تست با استفاده از کنسول فایربیس یا رابط خط فرمان 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 ، بررسی مجوز را حذف کنید.

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

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

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