Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Game Loop testlerini kullanmaya başlayın

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Oyun uygulamaları farklı UI çerçeveleri üzerine kurulduğ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. Bir Game Loop testi, gerçek bir oyuncunun hareketlerini simüle ederken testinizi oyun uygulamanız üzerinden çalıştırır. Bu kılavuz, bir 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üleyeceğinizi ve yöneteceğinizi gösterir.

Oyun motorunuza bağlı olarak tekli veya çoklu döngülerle testler uygulayabilirsiniz. Döngü, oyun uygulamanızdaki testinizin tam veya kısmi olarak geçmesidir. 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 girdisini komut dosyası haline getirebilir, kullanıcının boşta kalmasına izin verebilir veya oyununuzda mantıklıysa kullanıcıyı bir AI ile değiştirebilirsiniz (örneğin, bir yarış arabası oyun uygulamanız olduğunu ve zaten bir AI'nın uygulandığını varsayalım. kolayca bir AI sürücüsünü kullanıcının girdisinden sorumlu hale getirin).
  • Cihazların destekleyip desteklemediğini görmek için oyununuzu en yüksek kalite ayarında çalıştırın.
  • Teknik bir test çalıştırın (birden çok gölgelendirici derleyin, yürütün, çıktının beklendiği gibi olup olmadığını kontrol edin, vb.).

Tek bir test cihazında, bir dizi test cihazında veya Test Laboratuvarında bir Oyun Döngüsü testi çalıştırabilirsiniz. Ancak, fiziksel cihazlardan daha düşük grafik kare hızlarına sahip olduklarından, sanal cihazlarda Game Loop testlerinin çalıştırılmasını önermiyoruz.

Sen başlamadan önce

Bir testi uygulamak için önce uygulamanızı Game Loop testleri için yapılandırmanız gerekir.

  1. Uygulama bildiriminizde, etkinliğinize yeni bir amaç 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ını sağlar.

  2. Kodunuzda ( onCreate yöntem bildiriminin içinde öneririz), aşağıdakini ekleyin:

    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
    }

    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
    }

    Bu, etkinliğinizin onu başlatan amacı kontrol etmesine olanak tanır. İsterseniz bu kodu daha sonra da ekleyebilirsiniz (örneğin, oyun motorunuzu ilk kez yükledikten sonra).

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

    Java

    yourActivity.finish();

    Kotlin+KTX

    yourActivity.finish()

    Bu, Game Loop testi tamamlandığında uygulamanızı kapatır. Test, bir sonraki döngüyü başlatmak için uygulamanızın UI çerçevesine dayanır ve uygulamanızı kapatmak, testin bittiğini söyler.

Oyun Döngüsü testi oluşturun ve çalıştırın

Uygulamanızı Game Loop testleri için yapılandırdıktan sonra hemen bir test oluşturabilir ve bunu oyun uygulamanızda çalıştırabilirsiniz. Firebase konsolunu veya gcloud komut satırı arabirimini (CLI) kullanarak Test Lab'de veya Test Döngüsü Yöneticisi'ni kullanarak yerel bir cihazda test çalıştırmayı seçebilirsiniz.

Yerel bir cihazda çalıştırın

Test Lab's Test Loop Manager , Game Loop testlerini entegre etmenize ve bunları 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ını sağlar.

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

  1. Test Döngüsü Yöneticisini bir telefona veya tablete indirin ve şunu çalıştırarak kurun:
    adb install testloopmanager.apk
  2. Cihazınızda, telefonunuzda veya tabletinizde Test Döngüsü Uygulamaları uygulamasını açın. Uygulama, cihazınızda oyun döngüleriyle çalıştırılabilen uygulamaların bir listesini görüntüler. Oyun uygulamanızı burada görmüyorsanız, niyet filtrenizin Başlamadan önce bölümünün ilk adımında açıklananla eşleştiğinden emin olun.
  3. Oyun uygulamanızı seçin, 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ümesi çalıştırmayı seçebilirsiniz. Aynı anda birden çok döngü çalıştırma hakkında daha fazla bilgi için bkz . İsteğe bağlı özellikler.
  4. Testi çalıştır'ı tıklayın. Testiniz hemen çalışmaya başlar.

Test Laboratuvarında Çalıştır

Firebase konsolunu veya gcloud CLI'yi kullanarak Test Lab'de bir Oyun Döngüsü testi çalıştırabilirsiniz. Başlamadan önce, henüz yapmadıysanız Firebase konsolunu açın ve bir proje oluşturun.

Firebase konsolunu kullanın

  1. Firebase konsolunda, sol panelden Test Lab'ı tıklayın.
  2. İlk Testinizi Çalıştırın (veya projeniz daha önce bir test çalıştırdıysa, Bir Test Çalıştırın) öğesine tıklayın.
  3. Test türü olarak Game Loop'u seçin ve ardından Devam'a tıklayın.
  4. Gözat öğesine tıklayın ve ardından uygulamanızın .apk dosyasına göz atın. Not: Bu adımda, yalnızca bir döngü yerine bir döngü alt kümesi çalıştırmayı seçebilirsiniz. Aynı anda birden çok döngü çalıştırma hakkında daha fazla bilgi için bkz . İsteğe bağlı özellikler.
  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 bölümüne bakın.

gcloud komut satırını (CLI) kullanın

  1. Henüz yapmadıysanız, Google Cloud SDK'yı indirin ve yükleyin.

  2. Google hesabınızı kullanarak gcloud CLI'de 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'yi kullanmaya başlama hakkında daha fazla bilgi için bkz . gcloud komut satırından testi başlatma.

Opsiyonel özellikler

Test Lab, çıktı verilerini yazma yeteneği, birden çok oyun döngüsü için destek ve ilgili döngüler için etiketler dahil olmak üzere testlerinizi daha fazla özelleştirmenize olanak tanıyan çeşitli isteğe bağlı özellikler sunar.

Çıktı verilerini yaz

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

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

Java

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

Oyun uygulamanızın C++ tarafından dosyaya yazmak istiyorsanız, dosya yolu yerine dosya tanıtıcısını iletebilirsiniz:

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

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

Çıktı dosyası örneği

Firebase konsolunun Test Laboratuvarı bölümünde oyun döngüsü test sonuçlarını görüntülemek için çıktı veri dosyalarını (aşağıdaki örnekte olduğu 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 herhangi bir özel alanı 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
}

Çoklu oyun döngüleri

Uygulamanızda birden fazla oyun döngüsü çalıştırmayı faydalı bulabilirsiniz. Döngü, oyun uygulamanızın baştan sona eksiksiz bir şekilde gözden geçirilmesidir. Örneğin, oyununuzda birden fazla seviyeniz varsa, hepsini tekrar eden bir döngü yerine her seviyeyi başlatmak için bir oyun döngüsüne sahip olmak isteyebilirsiniz. Bu şekilde, uygulamanız 32. seviyede çökerse, kilitlenmeyi yeniden oluşturmak ve hata düzeltmelerini test etmek için doğrudan o oyun döngüsünü başlatabilirsiniz.

Uygulamanızın aynı anda birden çok 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. <application> öğesinin içindeki uygulamanızın bildirimine aşağıdaki satırı ekleyin:

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

      Bu başlatma amacı, bir tamsayı parametresi olarak hedef döngüyü içerir. android:value alanında, 1 ile 1024 arasında bir tamsayı belirtebilirsiniz (tek bir test için izin verilen maksimum döngü sayısı). Döngülerin 0'dan değil 1'den başlayarak indekslendiğ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örüntülenir. Birden çok döngü seçerseniz, önceki döngü tamamlandıktan sonra her döngü sırayla başlatılır.

  • Firebase konsoluyla bir 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 bayrağını kullanarak bir döngü numaraları listesi belirtin. Örneğin, --scenario-numbers=1,3,5 , 1, 3 ve 5 döngülerini çalıştırır.

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

    Java

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

    Kotlin+KTX

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

    Artık elde edilen int değerine bağlı olarak döngünüzün davranışını değiştirebilirsiniz.

Oyun döngülerini etiketleyin

Oyun döngülerinizi bir veya daha fazla senaryo etiketiyle etiketlediğinizde, QA ekibinizle birlikte bir dizi ilgili oyun döngüsü (örneğin, "tüm uyumluluk oyun döngüleri") başlatabilir ve bunları tek bir matriste test edebilirsiniz. Kendi etiketlerinizi oluşturabilir veya Test Lab tarafından sunulan önceden tanımlanmış etiketleri kullanabilirsiniz:

  • com.google.test.loops.player_experience : Oyun oynarken gerçek bir kullanıcının deneyimini yeniden oluşturmak için 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 etmek için kullanılan döngüler için. Bu döngülerle test etmenin 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çin. Ö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üler ç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 etiketini seçtiğiniz bir etiketle değiştirin:

      <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 bir aralık veya 1 ile 1024 (tek bir test için izin verilen maksimum döngü sayısı) arasında bir tam sayı kümesi belirtebilirsiniz. Döngülerin 0'dan değil 1'den başlayarak dizine eklendiğini unutmayın. Örneğin, android:value="1,3-5" LABEL_NAME 1, 3, 4 ve 5 döngülerine uygular.

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

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

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

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'a yüklemeden önce lisans kontrolünü kaldırın.

Bilinen Sorunlar

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

  • Bazı çökmeler geri izlemeyi desteklemez. Örneğin, bazı sürüm derlemeleri, prctl(PR_SET_DUMPABLE, 0) kullanılarak debuggerd işleminin çıktısını bastırabilir. Daha fazla bilgi edinmek için bkz. debuggerd .
  • API Düzeyi 19, dosya izni hataları nedeniyle şu anda desteklenmemektedir.