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

Oyun uygulamaları farklı kullanıcı arayüzü çerçeveleri üzerine inşa edildiğinde 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, gerçek bir oyuncunun işlemlerini simüle ederken testinizi oyun uygulamanız üzerinden çalıştırır. Bu kılavuzda, Game Loop testini nasıl çalıştıracağınız ve ardından test sonuçlarınızı Firebase konsolunda nasıl görüntüleyip yöneteceğiniz açıklanmaktadır.

Oyun motorunuza bağlı olarak tek veya birden fazla döngülü testler uygulayabilirsiniz. Döngü, oyun uygulamanızda testinizin tam veya kısmi bir şekilde çalıştırılmasıdır. Oyun döngüleri aşağıdakiler için kullanılabilir:

  • Oyununuzun bir seviyesini son kullanıcının oynayacağı şekilde çalıştırın. Kullanıcının girişini komut dosyası olarak yazabilir, kullanıcının boşta kalmasına izin verebilir veya oyununuzda uygunsa kullanıcıyı yapay zeka ile değiştirebilirsiniz (ör. yarış arabası oyun uygulamanız varsa ve uygulamanızda zaten yapay zeka uygulanmışsa). Kullanıcının girişinden sorumlu bir yapay zeka sürücüsü kolayca ekleyebilirsiniz).
  • Cihazların destekleyip desteklemediğini görmek için oyununuzu en yüksek kalite ayarıyla çalıştırın.
  • Teknik test çalıştırın (birden fazla gölgelendiriciyi derleyin, yürütün, çıktının beklendiği gibi olup olmadığını kontrol edin vb.).

Oyun döngüsü testini tek bir test cihazında, bir grup test cihazında veya Test Lab'te çalıştırabilirsiniz. Ancak, fiziksel cihazlara kıyasla daha düşük grafik kare hızlarına sahip oldukları için Game Loop testlerini sanal cihazlarda çalıştırmanız önerilmez.

Başlamadan önce

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

  1. Uygulama manifest dosyanızda 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 sayede Test Lab, oyununuzu belirli bir intent ile tetikleyerek başlatabilir.

  2. Kodunuza (onCreate yöntemi beyanının içine eklemenizi ö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, kendisini başlatan intent'i kontrol edebilir. İsterseniz bu kodu daha sonra da ekleyebilirsiniz (ör. oyun motorunuzu ilk kez yükledikten sonra).

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

    Kotlin+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

    Bu işlem, 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çevesini kullanır. Uygulamanızı kapatmak, testin sona erdiğini gösterir.

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 Konsolu veya gcloud komut satırı arayüzünü (CLI) kullanarak Test Lab'te veya Test Döngüsü Yöneticisi'ni kullanarak yerel bir cihazda test çalıştırmayı seçebilirsiniz.

Yerel bir cihazda çalıştırma

Test Lab'ı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 kaynak bir uygulamadır. Ayrıca kalite güvencesi ekibinizin kendi cihazlarında aynı oyun döngülerini çalıştırmasına 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 indirip şu komutu çalıştırarak yükleyin:
    adb install testloopmanager.apk
  2. Cihazınızda telefonunuzda veya tabletinizde Test Loop Apps uygulamasını açın. Uygulama, cihazınızda oyun döngüleriyle çalıştırılabilen uygulamaların listesini gösterir. 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, yalnızca bir döngü yerine bir döngü 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 bölümüne bakın.
  4. Testi çalıştır'ı tıklayın. Testiniz hemen çalışmaya başlar.

Test Lab'te çalıştırma

Firebase konsolunu veya gcloud CLI'yi kullanarak Test Lab'te bir Game Loop testi çalıştırabilirsiniz. Başlamadan önce, henüz yapmadıysanız Firebase konsolunu açıp 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 projeniz daha önce bir test çalıştırmışsa Test Çalıştırın'ı) 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 ve ardından uygulamanızın .apk dosyasına gidin. Not: Bu adımda, yalnızca bir döngü yerine bir döngü 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 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 konsolunu kullanarak 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'de oturum açın:

    gcloud auth login

  3. 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'yi 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ış verileri yazma, birden fazla oyun döngüsü desteği ve ilgili döngüler için etiketler dahil olmak üzere testlerinizi daha da özelleştirmenize olanak tanıyan çeşitli isteğe bağlı özellikler sunar.

Çıkış verilerini yazma

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

Test Lab, Dosya Paylaşma bölümünde açıklanan, uygulamalar arasında dosya paylaşımıyla ilgili en iyi uygulamaları izler. Amacınızın 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());
    // ...
}

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

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

Oyun döngüsü test sonuçlarını Firebase konsolunun Test Lab bölümünde görüntülemek için çıkış veri dosyalarını (aşağıdaki örnekte gösterildiği gibi biçimlendirilmiş) kullanabilirsiniz. /.../ olarak gösterilen alanlar, bu dosyada kullanılan diğer alanların adlarıyla çakışmadıkları 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ırmanız 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 hepsini iterleyen bir döngü yerine her seviyeyi başlatmak için 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 ilgili 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. Uygulamanızın manifest dosyasına, <application> öğesinin içine aşağıdaki satırı 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ı (tek bir test için izin verilen maksimum döngü sayısı) belirtebilirsiniz. Döngülerin 0 yerine 1'den itibaren 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 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 çalıştırıyorsanız Senaryolar alanına bir liste veya döngü numarası aralığı girin.

  • gcloud CLI ile bir test çalıştırıyorsanız --scenario-numbers işaretçisini kullanarak bir döngü numarası listesi belirtin. Örneğin, --scenario-numbers=1,3,5 1, 3 ve 5. döngüleri çalıştırır.

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

    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üsünün davranışını, elde edilen int değerine göre değiştirebilirsiniz.

Oyun döngülerini etiketleme

Oyun döngülerinizi bir veya daha fazla senaryo etiketiyle etiketlediğinizde, siz ve kalite kontrol ekibiniz ilgili bir dizi oyun döngüsü (ö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: Gerçek bir kullanıcının oyunu oynarken yaşadığı deneyimi yeniden oluşturmak için kullanılan döngüler için. Bu döngülerle test yapmanın 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 For döngüleri. Bu döngülerle test etmenin amacı, üretimde düzgün şekilde çalışmayabilecek GPU kodunu yürüterek 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 For döngüleri.
  • 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 davrandığı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üler ç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 yazın:

      <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 tam sayı kümesi belirtebilirsiniz. Döngülerin 0 değil, 1'den itibaren dizine eklendiğini unutmayın. Örneğin, android:value="1,3-5", LABEL_NAME değerini 1, 3, 4 ve 5. döngülere uygular.

    2. Test Döngüsü Yöneticisi 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şaretçisini kullanarak bir veya daha fazla senaryo etiketi belirtin (ör. --scenario-labels=performance,gpu).

Uygulama lisanslama desteği

Test Lab, Google Play tarafından sunulan 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'e yüklemeden önce lisans denetimini kaldırın.

Bilinen sorunlar

Test Lab'teki Oyun Döngüsü testlerinde aşağıdaki bilinen sorunlar vardır:

  • Bazı kilitlenmeler geri izlemeyi desteklemez. Örneğin, bazı sürüm derlemeleri prctl(PR_SET_DUMPABLE, 0) kullanarak debuggerd sürecinin çıktısını bastırabilir. Daha fazla bilgi için debuggerd konusuna bakın.
  • API 19 düzeyi, dosya izni hataları nedeniyle şu anda desteklenmemektedir.