Oyun Döngüsü testlerini kullanmaya başlama

Oyun uygulamaları farklı kullanıcı arayüzü çerçeveleri üzerine kuruluyken oyun testini otomatikleştirmek zor olabilir. Game Loop testleri, yerel testlerinizi Test Lab ile entegre etmenize ve seçtiğiniz cihazlarda kolayca çalıştırmanıza olanak tanır. Oyun Döngüsü testi, testinizi oyun uygulamanızda yürütürken gerçek bir oyuncunun eylemlerini simüle eder. Bu kılavuzda, bir Oyun Döngüsü testinin nasıl çalıştırılacağı, ardından test sonuçlarınızı Firebase konsolunda nasıl görüntüleyip yöneteceğiniz gösterilmektedir.

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

  • Oyununuzda bir seviyeyi son kullanıcının oynayacağı şekilde çalıştırın. Kullanıcının girişini komut dosyası haline getirebilir, kullanıcının işlem yapmamasına izin verebilir veya oyununuzda mantıklıysa kullanıcıyı yapay zekayla değiştirebilirsiniz (ör. bir yarış arabası oyun uygulamanız ve halihazırda AI uygulamanız varsa). Kullanıcı girişinden sorumlu bir yapay zeka sürücüsünü kolayca kullanabilirsiniz).
  • Cihazların destekleyip desteklemediğini görmek için oyununuzu en yüksek kalite ayarında çalıştırın.
  • Teknik bir test yapın (birden fazla gölgelendiriciyi derleyin, bunları yürütün, sonucun beklendiği gibi olup olmadığını kontrol edin vb.).

Oyun Döngüsü testi tek bir test cihazında, bir test cihazı grubunda veya Test Lab'de çalıştırabilirsiniz. Ancak, fiziksel cihazların grafik kare hızları daha düşük olduğundan Game Loop testlerini sanal cihazlarda çalıştırmanızı önermeyiz.

Başlamadan önce

Bir testi uygulamak için önce uygulamanızı Oyun Döngüsü testlerine yönelik olarak yapılandırmanız gerekir.

  1. Uygulama manifestinizde, etkinliğinize 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, Test Lab'in oyununuzu belirli bir amaçla tetikleyerek başlatmasına olanak tanır.

    inceleyin.
  2. Kodunuza (onCreate yöntem beyanının içine yerleştirmenizi öneririz) aşağıdakileri ekleyin:

    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
    }

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

  3. Öneri: Testin sonunda şunu ekleyin:

    Kotlin+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

    Oyun Döngüsü testi tamamlandığında uygulamanız kapatılır. Test, bir sonraki döngüyü başlatmak için uygulamanızın kullanıcı arayüzü çerçevesine dayanır ve uygulamanızı kapatmak, testin tamamlandığını belirtir.

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şturabilir ve oyun uygulamanızda çalıştırabilirsiniz. Firebase konsolunu veya gcloud komut satırı arayüzünü (CLI) ya da Test Döngüsü Yöneticisi'ni kullanarak bir yerel cihazı kullanarak Test Lab'de test çalıştırmayı seçebilirsiniz.

Yerel cihazda çalıştırma

Test Lab'in Test Loop Manager uygulaması, 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 kendi cihazı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 Döngüsü Yöneticisi'ni bir telefona veya tablete indirin ve şu komutu çalıştırarak yükleyin:
    adb install testloopmanager.apk
  2. Cihazınızda, telefon veya tabletinizde Test Loop Uygulamalarını açın. Uygulama, cihazınızda oyun döngüleriyle çalıştırılabilecek uygulamaların bir listesini görüntüler. Oyun uygulamanızı burada görmüyorsanız intent 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ı, ardından çalıştırmak istediğiniz döngü sayısını seçin. Not: Bu adımda, tek bir döngü yerine bir döngü alt kümesi ç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 bölümüne bakın.
  4. Testi çalıştır'ı tıklayın. Testiniz hemen çalışmaya başlar.

Test Lab'de çalıştır

Firebase konsolunu veya gcloud KSA'yı kullanarak Test Lab'de bir Oyun Döngüsü testi çalıştırabilirsiniz. Henüz yapmadıysanız başlamadan önce Firebase konsolunu açın ve bir proje oluşturun.

Firebase konsolunu kullanma

  1. Firebase konsolundaki sol panelden Test Lab'i tıklayın.
  2. İlk Testinizi Çalıştır'ı (veya projeniz daha önce test çalıştırdıysa Test Çalıştır'ı) tıklayın.
  3. Test türü olarak Oyun Döngüsü'nü seçip Devam'ı tıklayın.
  4. Göz at'ı tıklayın, ardından uygulamanızın .apk dosyasına göz atın. Not: Bu adımda, tek bir döngü yerine bir döngü alt kümesi ç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 bölümüne bakın.
  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 konsolu ile teste 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 KSA'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 KSA'yı kullanmaya başlama hakkında daha fazla bilgi için gcloud komut satırından test başlatma bölümüne bakın.

İsteğe bağlı özellikler

Test Lab; çıkış verileri yazma, birden fazla oyun döngüsü desteği ve ilgili döngüler için etiketler de dahil olmak üzere testlerinizi daha da özelleştirmenizi sağlayan çeşitli isteğe bağlı özellikler sunar.

Çıkış verilerini yazma

Oyun Döngüsü testiniz, launchIntent.getData() yönteminde belirtilen bir dosyaya çıkış yazabilir. Bir test çalıştırdıktan sonra, bu çıkış verilerine Firebase konsolunun Test Lab bölümünden erişebilirsiniz (Oyun Döngüsü test çıkış dosyası örneğine bakın).

Test Lab, uygulamalar arasında dosya paylaşımı konusunda Dosya Paylaşma konusunda açıklanan en iyi uygulamaları izler. Niyetinizin bulunduğu etkinliğinizin onCreate() yönteminde aşağıdaki kodu çalıştırarak veri çıkış dosyanızı kontrol edebilirsiniz:

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

Dosyaya oyun uygulamanızın C++ tarafından yazmak istiyorsanız dosya yolu yerine dosya tanımlayıcısında geçirebilirsiniz:

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

Çıkış dosyası örneği

Firebase konsolunun Test Lab bölümünde oyun döngüsü testi sonuçlarını görüntülemek için çıkış verisi dosyalarını (aşağıdaki örnekte olduğu gibi biçimlendirilmiş şekilde) kullanabilirsiniz. /.../ olarak gösterilen alanlar, bu dosyada kullanılan diğer alanların adlarıyla çakışmadıkları sürece ihtiyacınız olan ö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 işinize yarayabilir. Döngü, oyun uygulamanızın başından sonuna kadar baştan sona adım adım gösterilmesidir. Örneğin, oyununuzda birden çok seviye varsa hepsinin içinden geçen tek bir döngü yerine her seviyeyi başlatmak için bir oyun döngüsünün olmasını isteyebilirsiniz. Bu şekilde, 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 bir test çalıştırı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 amacı, hedef döngüyü bir tam sayı parametresi olarak içerir. android:value alanında 1 ile 1.024 arasında bir tam sayı belirtebilirsiniz (tek bir test için izin verilen maksimum döngü sayısı). Döngülerin dizine 0'dan değil 1'den başlayarak dizine eklendiğini unutmayın.

    2. Test Döngüsü Yöneticisi uygulamasında, çalıştırmak istediğiniz döngüleri seçmenize olanak sağlayan bir seçim ekranı görünür. Birden çok döngü seçerseniz her döngü, önceki döngü tamamlandıktan sonra sırayla başlatılır.

  • Firebase konsolu ile bir test çalıştırıyorsanız Senaryolar alanına bir liste veya döngü numaraları aralığı girin.

  • gcloud KSA ile bir 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. döngüleri çalıştırır.

  • C++ yazıyor ve döngünüzün davranışını değiştirmek istiyorsanız aşağıdakileri yerel C++ kodunuza geçirin:

    Kotlin+KTX

    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çta elde edilen int değerine göre değiştirebilirsiniz.

Oyun döngülerini etiketleyin

Oyun döngülerinizi bir veya daha fazla senaryo etiketiyle etiketlediğinizde KG ekibiniz ve siz, ilgili oyun döngülerini (ör. "tüm uyumluluk oyun döngüleri") oluşturup bunları tek bir matriste test edebilirsiniz. Kendi etiketlerinizi oluşturabilir veya Test Lab'in sunduğu önceden tanımlanmış etiketleri kullanabilirsiniz:

  • com.google.test.loops.player_experience: Oyun oynarken gerçek bir kullanıcının deneyimini yeniden oluşturmak amacıyla kullanılan döngüler için. 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 etmekte kullanılan döngüler için. Bu döngülerle test yapmanın amacı, donanım ve sürücülerle ilgili sorunları ortaya çıkarmak için üretimde düzgün çalışmayabilecek GPU kodunu yürütmektir.
  • com.google.test.loops.compatibility: G/Ç sorunları ve OpenSSL sorunları dahil olmak üzere çok çeşitli uyumluluk sorunlarını test etmek için kullanılan döngüler için.
  • com.google.test.loops.performance: Cihazın performansını test etmek için kullanılan döngüler içindir. Örneğin, bir oyun yeni bir cihazın nasıl davrandığını görmek için en karmaşık grafik ayarlarında çalışabilir.

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

  • Test Döngüsü Yöneticisi ile bir test çalıştırıyorsanız:

    1. Uygulamanızın manifest dosyasına aşağıdaki meta veri satırını ekleyin ve LABEL_NAME yerine istediğiniz bir 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 bir aralık veya tam sayı kümesi (tek bir test için izin verilen maksimum döngü sayısı) belirtebilirsiniz. Döngülerin dizine 0'dan değil 1'den başlayarak dizine eklendiğini unutmayın. Örneğin android:value="1,3-5"; 1, 3, 4 ve 5. döngülere LABEL_NAME uygular.

    2. Test Döngüsü Yöneticisi uygulamasında Etiketler alanına bir veya daha fazla etiket girin.

  • Firebase konsolunda bir test çalıştırıyorsanız Etiketler alanına bir veya daha fazla etiket girin.

  • gcloud KSA ile bir test çalıştırıyorsanız --scenario-labels işaretini kullanarak bir veya daha fazla senaryo etiketi belirtin (ör. --scenario-labels=performance,gpu) bir veya daha fazla Google E-Tablo feed'ini etkileyebilir.

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ına yayınlamanız gerekir. Uygulamanızı Test Lab'i kullanarak alfa veya beta kanalında test etmek için uygulamanızı Test Lab'e yüklemeden önce lisans denetimini kaldırın.

Bilinen sorunlar

Test Lab'deki Oyun Döngüsü testlerinde aşağıdaki bilinen sorunlar bulunur:

  • Bazı kilitlenmeler geri izlemeyi desteklemez. Örneğin, bazı sürüm derlemeleri, prctl(PR_SET_DUMPABLE, 0) kullanarak debuggerd işleminin çıkışını engelleyebilir. Daha fazla bilgi için debuggerd sayfasını inceleyin.
  • API Düzeyi 19, dosya izni hataları nedeniyle şu anda desteklenmemektedir.