Oyun Döngüsü testlerini kullanmaya başlayın

Oyun uygulamaları farklı kullanıcı arayüzü çerçevelerinde oluşturulduğunda oyun testini otomatikleştirmek zor olabilir. Game Loop testleri, yerel testlerinizi Test Lab ile entegre etmenize ve bunları seçtiğiniz cihazlarda kolayca çalıştırmanıza olanak tanır. Oyun Döngüsü testi, gerçek bir oyuncunun işlemlerini simüle ederken oyun uygulamanızda testinizi çalıştırır. Bu kılavuzda, Game Loop testi çalıştırma, ardından test sonuçlarınızı Firebase konsolunda görüntüleme ve yönetme hakkında bilgi verilmektedir.

Oyun motorunuza bağlı olarak, tek veya birden fazla döngüyle testler uygulayabilirsiniz. Döngü, oyun uygulamanızdaki testinizin tam veya kısmi bir çalıştırılmasıdır. Oyun döngüleri şu amaçlarla kullanılabilir:

  • Oyununuzun bir seviyesini, son kullanıcının oynayacağı şekilde çalıştırın. Kullanıcının girişini senaryolaştırabilir, kullanıcının boşta kalmasına izin verebilir veya oyununuzda mantıklıysa kullanıcıyı yapay zekayla değiştirebilirsiniz (ör. yarış arabası oyun uygulamanızda yapay zeka zaten uygulanmışsa). Kullanıcı girişinden sorumlu bir yapay zeka sürücüsünü kolayca görevlendirebilirsiniz.
  • Cihazların destekleyip desteklemediğini görmek için oyununuzu en yüksek kalite ayarında çalıştırın.
  • Teknik test yapın (birden fazla gölgelendirici derleyin, bunları yürütün, çıkışın beklendiği gibi olup olmadığını kontrol edin vb.).

Tek bir test cihazında, bir grup test cihazında veya Test Lab üzerinde Oyun Döngüsü testi çalıştırabilirsiniz. Ancak, fiziksel cihazlara kıyasla daha düşük grafik kare hızlarına sahip oldukları için sanal cihazlarda Game Loop testleri çalıştırmanızı önermiyoruz.

Başlamadan önce

Test uygulamak için öncelikle uygulamanızı Oyun Döngüsü testlerine göre yapılandırmanız gerekir.

  1. Uygulama manifestinizde activity öğenize yeni bir intent filtresi ekleyin:

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

    Bu sayede Test Lab, belirli bir amaçla tetikleyerek oyununuzu başlatabilir.

  2. Kodunuza (onCreate yöntemi bildiriminin içine eklemenizi öneririz) aşağıdakileri ekleyin:

    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
    }

    Bu sayede etkinliğiniz, onu başlatan amacı kontrol edebilir. İsterseniz bu kodu daha sonra da (ör. oyun motorunuzu ilk yükledikten sonra) ekleyebilirsiniz.

  3. Önerilen: Testin sonunda şunları ekleyin:

    Kotlin

    yourActivity.finish()

    Java

    yourActivity.finish();

    Bu, oyun döngüsü testi tamamlandığında uygulamanızı kapatır. Test, bir sonraki döngüyü başlatmak için uygulamanızın kullanıcı arayüzü çerçevesine dayanır. Uygulamanızı kapatmak, testin tamamlandığını bildirir.

Oyun Döngüsü testi oluşturma ve çalıştırma

Uygulamanızı Game Loop testleri için yapılandırdıktan sonra hemen bir test oluşturup oyun uygulamanızda çalıştırabilirsiniz. Testi Test Lab içinde Firebase konsolunu veya gcloud komut satırı arayüzünü (CLI) kullanarak ya da Test Loop Manager'ı kullanarak yerel bir cihazda çalıştırabilirsiniz.

Yerel bir cihazda çalıştırma

Test Lab'nın Test Döngüsü Yöneticisi, Game Loop testlerini entegre etmenize ve yerel cihazlarınızda çalıştırmanıza yardımcı olan açık kaynaklı bir uygulamadır. Ayrıca, kalite güvencesi ekibinizin cihazlarında aynı oyun döngülerini çalıştırmasına da olanak tanır.

Test Döngüsü Yöneticisi'ni kullanarak yerel bir cihazda test çalıştırmak için:

  1. Test Loop Manager'ı telefona veya tablete indirip aşağıdaki komutu çalıştırarak yükleyin:
    adb install testloopmanager.apk
  2. Cihazınızda telefon veya tabletinizdeki Test Loop Apps uygulamasını açın. Uygulamada, cihazınızda oyun döngüleriyle çalıştırılabilen uygulamaların listesi gösterilir. Oyun uygulamanızı burada görmüyorsanız amaç filtrenizin, Başlamadan önce bölümünün ilk adımında açıklanan filtreyle eşleştiğinden emin olun.
  3. Oyun uygulamanızı ve çalıştırmak istediğiniz döngü sayısını seçin. Not: Bu adımda, yalnızca bir döngü yerine döngülerin bir alt kümesini çalıştırmayı seçebilirsiniz. Aynı anda birden fazla döngü çalıştırma hakkında daha fazla bilgi için İsteğe bağlı özellikler başlıklı makaleyi inceleyin.
  4. Testi çalıştır'ı tıklayın. Testiniz hemen çalışmaya başlar.

Test Lab koşusu

Test Lab'da Firebase konsolunu veya gcloud KSA'yı kullanarak bir Game Loop testi çalıştırabilirsiniz. Başlamadan önce, henüz yapmadıysanız Firebase konsolunu açın ve bir proje oluşturun.

Firebase konsolunu kullanma

  1. Firebase konsolunda, sol panelden Test Lab simgesini tıklayın.
  2. İlk Testinizi Çalıştırın'ı (veya projenizde daha önce test çalıştırıldıysa Test Çalıştırın'ı) tıklayın.
  3. Test türü olarak Game Loop'u seçin ve Devam'ı tıklayın.
  4. Göz at'ı tıklayın ve uygulamanızın .apk dosyasına gidin. Not: Bu adımda, yalnızca bir döngü yerine döngülerin bir alt kümesini çalıştırmayı seçebilirsiniz. Aynı anda birden fazla döngü çalıştırma hakkında daha fazla bilgi için İsteğe bağlı özellikler başlıklı makaleyi inceleyin.
  5. Devam'ı tıklayın.
  6. Uygulamanızı test etmek için kullanılacak fiziksel cihazları seçin.
  7. Testleri Başlat'ı tıklayın.

Firebase konsolunu kullanmaya başlama hakkında daha fazla bilgi için Firebase konsoluyla test etmeye başlama başlıklı makaleyi inceleyin.

gcloud komut satırını (KSA) kullanma

  1. Henüz yapmadıysanız Google Cloud SDK'yı indirip yükleyin.

  2. Google Hesabınızı kullanarak gcloud CLI'da oturum açın:

    gcloud auth login

  3. Firebase projenizi gcloud'da ayarlayın. Burada PROJECT_ID, Firebase projenizin kimliğidir:

    gcloud config set project PROJECT_ID
    
  4. İlk testinizi çalıştırın:

    gcloud firebase test android run \
     --type=game-loop --app=<var>path-to-apk</var> \
     --device model=herolte,version=23
    

gcloud CLI'yı kullanmaya başlama hakkında daha fazla bilgi için gcloud komut satırından test etmeye başlama başlıklı makaleyi inceleyin.

İsteğe bağlı özellikler

Test Lab, çıkış verilerini yazma, birden fazla oyun döngüsü desteği ve ilgili döngüler için etiketler gibi testlerinizi daha da özelleştirmenize olanak tanıyan çeşitli isteğe bağlı özellikler sunar.

Çıkış verilerini yazma

Oyun döngüsü testiniz, launchIntent.getData() yönteminde belirtilen bir dosyaya çıktı yazabilir. Testi çalıştırdıktan sonra bu çıkış verilerine Firebase konsolunun Test Lab bölümünden erişebilirsiniz (bkz. Game Loop test çıkış dosyası örneği).

Test Lab, Dosya Paylaşma bölümünde açıklanan, uygulamalar arasında dosya paylaşmayla ilgili en iyi uygulamalara uygundur. Etkinliğinizin onCreate() yönteminde (amacınızın bulunduğu yer) aşağıdaki kodu çalıştırarak veri çıkışı dosyanızı kontrol edebilirsiniz:

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

Oyun uygulamanızın C++ tarafındaki dosyaya yazmak istiyorsanız dosya yolu yerine dosya tanımlayıcıyı iletebilirsiniz:

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

Çıkış dosyası örneği

Oyun döngüsü test sonuçlarını Firebase konsolunun Test Lab bölümünde göstermek için çıkış veri dosyalarını (aşağıdaki örnekteki gibi biçimlendirilmiş) kullanabilirsiniz. /.../ olarak gösterilen alanlar, bu dosyada kullanılan diğer alanların adlarıyla çakışmadığı sürece ihtiyacınız olan tüm özel alanları içerebilir:

{
  "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
}

Birden fazla oyun döngüsü

Uygulamanızda birden fazla oyun döngüsü çalıştırmak faydalı olabilir. Döngü, oyun uygulamanızın baştan sona eksiksiz bir şekilde çalıştırılmasıdır. Örneğin, oyununuzda birden fazla seviye varsa tüm seviyeleri yineleyen tek bir döngü yerine her seviyeyi başlatmak için tek bir oyun döngüsü kullanmak isteyebilirsiniz. Bu sayede, uygulamanız 32. seviyede kilitlenirse kilitlenmeyi yeniden oluşturmak ve hata düzeltmelerini test etmek için doğrudan bu oyun döngüsünü başlatabilirsiniz.

Uygulamanızın aynı anda birden fazla döngü çalıştırmasını sağlamak için:

  • Test Döngüsü Yöneticisi ile test yapıyorsanız:

    1. Aşağıdaki satırı uygulamanızın manifest dosyasına, <application> öğesinin içine ekleyin:

      <meta-data
        android:name="com.google.test.loops"
        android:value="5" />

      Bu başlatma intent'i, hedef döngüyü tam sayı parametresi olarak içerir. android:value alanında 1 ile 1024 arasında bir tam sayı belirtebilirsiniz (tek bir test için izin verilen maksimum döngü sayısı). Döngülerin 0'dan değil, 1'den başlayarak dizine eklendiğini unutmayın.

    2. Test Loop Manager uygulamasında, hangi döngüleri çalıştırmak istediğinizi seçmenize olanak tanıyan bir seçim ekranı gösterilir. Birden fazla döngü seçerseniz her döngü, önceki döngü tamamlandıktan sonra sırayla başlatılır.

  • Firebase konsoluyla test yapıyorsanız Senaryolar alanına bir liste veya döngü numaraları aralığı girin.

  • gcloud CLI ile test çalıştırıyorsanız --scenario-numbers işaretini kullanarak döngü numaralarının listesini belirtin. Örneğin, --scenario-numbers=1,3,5 1, 3 ve 5 numaralı döngüleri çalıştırır.

  • C++ yazıyorsanız ve döngünüzün davranışını değiştirmek istiyorsanız yerel C++ kodunuza aşağıdaki ek bilgiyi iletin:

    Kotlin

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

    Java

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

    Artık döngünüzün davranışını sonuçtaki int değere göre değiştirebilirsiniz.

Oyun döngülerini etiketleme

Oyun döngülerinizi bir veya daha fazla senaryo etiketiyle etiketlediğinizde siz ve KG ekibiniz, ilgili bir dizi oyun döngüsünü (ör. "Tüm uyumluluk oyun döngüleri") ve bunları tek bir matriste test edin. Kendi etiketlerinizi oluşturabilir veya Test Lab tarafından sunulan önceden tanımlanmış etiketleri kullanabilirsiniz:

  • com.google.test.loops.player_experience: Oyunu oynarken gerçek bir kullanıcının deneyimini yeniden oluşturmak için kullanılan döngüler. Bu döngülerle test etmenin amacı, gerçek bir kullanıcının oyunu oynarken karşılaşacağı sorunları bulmaktır.
  • com.google.test.loops.gpu_compatibility: GPU ile ilgili sorunları test etmek için kullanılan döngüler. Bu döngülerle test etmenin amacı, üretimde düzgün çalışmayabilecek GPU kodunu yürütmek, donanım ve sürücülerle ilgili sorunları ortaya çıkarmaktır.
  • com.google.test.loops.compatibility: G/Ç sorunları ve OpenSSL sorunları da dahil olmak üzere çok çeşitli uyumluluk sorunlarını test etmek için kullanılan döngüler.
  • com.google.test.loops.performance: Cihazın performansını test etmek için kullanılan for döngüleri. Örneğin, yeni bir cihazın nasıl çalıştığını görmek için bir oyun en karmaşık grafik ayarlarında çalıştırılabilir.

Uygulamanızın aynı etikete sahip döngüleri çalıştırmasını sağlamak için:

  • Test Döngüsü Yöneticisi ile test yapıyorsanız:

    1. Uygulamanızın manifestine aşağıdaki meta veri satırını ekleyin ve LABEL_NAME yerine istediğiniz etiketi girin:

      <meta-data
       android:name="com.google.test.loops.LABEL_NAME"
       android:value="1,3-5" />

      android:value alanında, etiketlemek istediğiniz döngüleri temsil eden 1 ile 1024 arasında (tek bir test için izin verilen maksimum döngü sayısı) bir aralık veya bir dizi tam sayı belirtebilirsiniz. Döngülerin 0'dan değil, 1'den başlayarak indekslendiğini unutmayın. Örneğin, android:value="1,3-5", 1, 3, 4 ve 5 numaralı döngülere LABEL_NAME uygular.

    2. Test Loop Manager uygulamasında, Etiketler alanına bir veya daha fazla etiket girin.

  • Firebase konsoluyla test yapıyorsanız Etiketler alanına bir veya daha fazla etiket girin.

  • gcloud CLI ile test çalıştırıyorsanız --scenario-labels işaretini kullanarak bir veya daha fazla senaryo etiketi belirtin (ör. --scenario-labels=performance,gpu).

Uygulama lisanslama desteği

Test Lab, Google Play'in sunduğu Uygulama Lisanslama hizmetini kullanan uygulamaları destekler. Uygulamanızı Test Lab ile test ederken lisanslamayı başarılı bir şekilde kontrol etmek için uygulamanızı Play Store'daki üretim kanalında yayınlamanız gerekir. Uygulamanızı Test Lab kullanarak alfa veya beta kanalında test etmek için uygulamanızı Test Lab'ya yüklemeden önce lisans denetimini kaldırın.

Bilinen sorunlar

Test Lab'daki Game Loop testlerinde aşağıdaki bilinen sorunlar vardır:

  • Bazı kilitlenmelerde geri izleme desteklenmez. Örneğin, bazı yayın derlemeleri debuggerd işleminin çıkışını prctl(PR_SET_DUMPABLE, 0) kullanarak bastırabilir. Daha fazla bilgi için debuggerd konusuna bakın.
  • Dosya izni hataları nedeniyle API düzeyi 19 şu anda desteklenmemektedir.