เริ่มต้นใช้งานการทดสอบ Game Loop

การทดสอบเกมอัตโนมัติอาจทำได้ยากเมื่อแอปเกมสร้างขึ้นบนเฟรมเวิร์ก UI ที่แตกต่างกัน การทดสอบ Game Loop ช่วยให้คุณผสานรวมการทดสอบดั้งเดิมกับ Test Lab และเรียกใช้การทดสอบเหล่านั้นในอุปกรณ์ที่คุณเลือกได้อย่างง่ายดาย การทดสอบ Game Loop จะเรียกใช้การทดสอบผ่านแอปเกมของคุณในขณะที่จำลองการกระทำของผู้เล่นจริง คำแนะนำนี้จะแสดงวิธีเรียกใช้การทดสอบ Game Loop จากนั้นดูและจัดการผลการทดสอบในFirebaseคอนโซล

การทดสอบ Game Loop คืออะไร

เนื่องจากแอปเกมแสดงผลในเฟรมเวิร์กและเอนจิน UI ที่แตกต่างกัน เช่น Unity, Unreal หรือโค้ด C++ ของ OpenGL/Vulkan เครื่องมือการทำงานอัตโนมัติมาตรฐานจึงไม่สามารถตรวจสอบหรือโต้ตอบกับองค์ประกอบ UI ได้ การทดสอบ Game Loop ช่วยให้คุณผสานรวม การทดสอบเอนจินดั้งเดิมกับ Test Lab ได้ด้วยการเปิดเกมด้วย Intent ที่มีหมายเลขสถานการณ์ที่เฉพาะเจาะจง หมายเลขสถานการณ์นี้จะแจ้งให้แอปเรียกใช้ตรรกะที่เขียนสคริปต์ไว้ล่วงหน้า การจำลอง AI หรือการตรวจสอบประสิทธิภาพภายในเกมเอนจินโดยตรง

เมื่อเปิดใช้แล้ว Test Lab จะไม่โต้ตอบกับ UI ของเกมอีก แต่ Test Lab จะทำหน้าที่เป็นสื่อกลางและสภาพแวดล้อมในการทดสอบ โดยจะเปิดตัว สถานการณ์ที่เฉพาะเจาะจง ตรวจสอบข้อขัดข้องและหมดเวลา รวมถึงรวบรวมบันทึกผลลัพธ์ที่กำหนดเองเมื่อแอปเรียกใช้ลูปเสร็จสิ้น

Game Loop แตกต่างจากการทดสอบเครื่องมืออย่างไร

  • การทดสอบเครื่องมือ (เช่น Espresso หรือ UI Automator) อาศัยเฟรมเวิร์กภายนอกเพื่อขับเคลื่อนการโต้ตอบ UI, คลิกปุ่ม และยืนยันสถานะแอปพลิเคชันในลำดับชั้นการแสดงผลของ Android จากภายนอกแอป
  • การทดสอบ Game Loop จะมอบหมายตรรกะการทดสอบให้กับแอปของคุณ แอปจะเรียกใช้ ลูปการทดสอบภายในหรือการจำลองของตัวเองโดยไม่ต้องมีการโต้ตอบ UI ภายนอก ขณะที่ Test Lab จะทริกเกอร์สถานการณ์และรวบรวมเอาต์พุตการทดสอบ

ตัวอย่าง

สมมติว่าคุณต้องการยืนยันว่าเกมของคุณแสดงผลอย่างน้อย 60 เฟรมต่อ วินาทีในอุปกรณ์จริงต่างๆ คุณสามารถใช้สถานการณ์ 1 ภายในโค้ดเกมเพื่อโหลดเลเวลที่มีความซับซ้อนทางภาพมากที่สุด และให้ผู้เล่น AI หรือสคริปต์อัตโนมัติเล่นผ่านเลเวลนั้นเป็นเวลา 2 นาที

เมื่อ Test Lab ทริกเกอร์สถานการณ์ 1 เกมจะเริ่มการเล่นเกมโดย AI ตรวจสอบเวลาในการแสดงผลเฟรมและการใช้งานหน่วยความจำ สตรีมเมตริกเหล่านั้นไปยังไฟล์บันทึกเอาต์พุตที่กำหนดเอง (logFile) และเรียกใช้ finish() เมื่อเสร็จสมบูรณ์ Test Lab จากนั้นจะบันทึกไฟล์บันทึกและทำให้คุณเข้าถึงได้ใน Cloud Storage และคอนโซล Firebase

Use Case

คุณสามารถใช้การทดสอบที่มีลูปเดียวหรือหลายลูปได้ ทั้งนี้ขึ้นอยู่กับเกมเอนจิน ลูปคือการทดสอบแอปเกมของคุณแบบเต็มหรือบางส่วน คุณใช้ Game Loop เพื่อทำสิ่งต่อไปนี้ได้

  • เรียกใช้เลเวลของเกมในลักษณะเดียวกับที่ผู้ใช้จะเล่น คุณจะเขียนสคริปต์อินพุตของผู้ใช้ ปล่อยให้ผู้ใช้ไม่มีการใช้งาน หรือแทนที่ผู้ใช้ด้วย AI ก็ได้ หากเหมาะสมกับเกมของคุณ (เช่น หากคุณมีแอปเกมแข่งรถและได้ติดตั้งใช้งาน AI ไว้แล้ว คุณก็สามารถให้ AI เป็นผู้ขับแทนอินพุตของผู้ใช้ได้)
  • เรียกใช้เกมในการตั้งค่าคุณภาพสูงสุดเพื่อดูว่าอุปกรณ์รองรับหรือไม่
  • ทำการทดสอบทางเทคนิค (คอมไพล์เชเดอร์หลายรายการ ดำเนินการเชเดอร์เหล่านั้น ตรวจสอบว่าเอาต์พุตเป็นไปตามที่คาดไว้ และอื่นๆ)

คุณสามารถทำการทดสอบ Game Loop ในอุปกรณ์ทดสอบเครื่องเดียว ชุดอุปกรณ์ทดสอบ หรือ ใน Test Lab ได้ อย่างไรก็ตาม เราไม่แนะนำให้เรียกใช้การทดสอบ Game Loop บนอุปกรณ์เสมือน เนื่องจากมีอัตราเฟรมกราฟิกต่ำกว่าอุปกรณ์จริง

ก่อนเริ่มต้น

หากต้องการทำการทดสอบ คุณต้องกำหนดค่าแอปสำหรับการทดสอบ Game Loop ก่อน

  1. ในไฟล์ Manifest ของแอป ให้เพิ่มตัวกรอง Intent ใหม่ลงในกิจกรรม

    <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) ให้เพิ่มข้อมูลต่อไปนี้

    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
    }

    ซึ่งจะช่วยให้กิจกรรมตรวจสอบ Intent ที่เปิดใช้กิจกรรมได้ คุณยังเพิ่มโค้ดนี้ในภายหลังได้หากต้องการ (เช่น หลังจากโหลดเอนจินเกมในตอนแรก)

  3. แนะนำ: เมื่อสิ้นสุดการทดสอบ ให้เพิ่ม

    Kotlin

    yourActivity.finish()

    Java

    yourActivity.finish();

    ซึ่งจะปิดแอปเมื่อการทดสอบ Game Loop เสร็จสมบูรณ์ การทดสอบนี้อาศัยเฟรมเวิร์ก UI ของแอปเพื่อเริ่มลูปถัดไป และการปิดแอปจะบอกว่าการทดสอบเสร็จสิ้นแล้ว

สร้างและทำการทดสอบ Game Loop

หลังจากกำหนดค่าแอปสำหรับการทดสอบ Game Loop แล้ว คุณจะสร้างการทดสอบและดำเนินการในแอปเกมได้ทันที โดยเลือกเรียกใช้การทดสอบใน Test Lab โดยใช้ทั้งFirebase คอนโซลหรืออินเทอร์เฟซบรรทัดคำสั่ง (CLI) gcloud หรือในอุปกรณ์ในเครื่องโดยใช้ Test Loop Manager

เรียกใช้ในอุปกรณ์ภายใน

Test LabTest Loop Manager เป็นแอปโอเพนซอร์สที่ช่วยให้คุณ ผสานรวมการทดสอบ Game Loop และเรียกใช้การทดสอบเหล่านั้นในอุปกรณ์ของคุณได้ นอกจากนี้ยังช่วยให้ทีมประกันคุณภาพสามารถเรียกใช้ลูปเกมเดียวกันในอุปกรณ์ของตนได้ด้วย

วิธีเรียกใช้การทดสอบในอุปกรณ์ภายในโดยใช้ Test Loop Manager

  1. ดาวน์โหลด Test Loop Manager ในโทรศัพท์หรือแท็บเล็ต แล้วติดตั้งโดยเรียกใช้คำสั่งต่อไปนี้
    adb install testloopmanager.apk
  2. เปิดแอปทดสอบแอป Loop ในโทรศัพท์หรือแท็บเล็ต แอปจะแสดงรายการแอปในอุปกรณ์ที่ เรียกใช้ด้วยลูปเกมได้ หากไม่เห็นแอปเกมที่นี่ โปรดตรวจสอบว่า ตัวกรอง Intent ตรงกับตัวกรองที่อธิบายไว้ในขั้นตอนแรกของส่วนก่อนเริ่มต้น
  3. เลือกแอปเกม แล้วเลือกจำนวนลูปที่ต้องการเรียกใช้ หมายเหตุ: ในขั้นตอนนี้ คุณเลือกที่จะเล่นลูปบางส่วนแทนที่จะเล่นเพียง ลูปเดียวได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับ การเรียกใช้ลูปหลายรายการพร้อมกันได้ที่ฟีเจอร์ที่ไม่บังคับ
  4. คลิกเรียกใช้การทดสอบ การทดสอบจะเริ่มทำงานทันที

วิ่งใน Test Lab

คุณเรียกใช้การทดสอบ Game Loop ใน Test Lab ได้โดยใช้Firebase คอนโซลหรือ gcloud CLI ก่อนเริ่มต้น ให้เปิดคอนโซล Firebase แล้วสร้างโปรเจ็กต์ หากยังไม่ได้สร้าง

ใช้คอนโซล Firebase

  1. ในคอนโซล Firebase ให้คลิก Test Lab จากแผงด้านซ้าย
  2. คลิกเรียกใช้การทดสอบแรก (หรือเรียกใช้การทดสอบหากโปรเจ็กต์ของคุณ เคยเรียกใช้การทดสอบมาก่อน)
  3. เลือก Game Loop เป็นประเภทการทดสอบ แล้วคลิกต่อไป
  4. คลิกเรียกดู แล้วเรียกดูไฟล์ .apk ของแอป หมายเหตุ: ในขั้นตอนนี้ คุณเลือกที่จะเล่นลูปบางส่วนแทนที่จะเล่นเพียง ลูปเดียวได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับ การเรียกใช้ลูปหลายรายการพร้อมกันได้ที่ ฟีเจอร์เสริม
  5. คลิกต่อไป
  6. เลือกอุปกรณ์จริงที่จะใช้ทดสอบแอป
  7. คลิกเริ่มการทดสอบ

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นใช้งานFirebase Console ได้ที่ เริ่มทดสอบด้วยFirebase Console

ใช้บรรทัดคำสั่ง gcloud (CLI)

  1. ดาวน์โหลดและติดตั้ง Google Cloud SDK หากยังไม่ได้ดำเนินการ

  2. ลงชื่อเข้าใช้ gcloud CLI โดยใช้บัญชี Google โดยทำดังนี้

    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
    

ดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นใช้งาน gcloud CLI ได้ที่ เริ่มทดสอบจากบรรทัดคำสั่ง gcloud

ฟีเจอร์เสริม

Test Lab มีฟีเจอร์เสริมหลายอย่างที่ช่วยให้คุณปรับแต่งการทดสอบได้เพิ่มเติม รวมถึงความสามารถในการเขียนข้อมูลเอาต์พุต การรองรับ Game Loop หลายรายการ และป้ายกำกับสำหรับลูปที่เกี่ยวข้อง

เขียนข้อมูลเอาต์พุต

เมื่อ Test Lab เปิดตัวเกมของคุณ ระบบจะระบุ URL ที่ชี้ไปยังไฟล์ผลลัพธ์ในเครื่อง ในอุปกรณ์ทดสอบ ซึ่งเข้าถึงได้โดยใช้ launchIntent.getData() เกมของคุณสามารถเขียนผลการทดสอบ เมตริกประสิทธิภาพ และบันทึก (logFile) ไปยังตำแหน่งนี้ได้โดยตรง ในระหว่างการทดสอบ

คุณสามารถเขียนเนื้อหาใดก็ได้ลงใน logFile เช่น ข้อความธรรมดา ข้อมูล CSV, เวลาในการแสดงผลเฟรม หรือรายงานการวินิจฉัยที่กำหนดเอง เนื้อหาที่คุณเขียนไม่มีข้อจำกัดหรือข้อกำหนดในการจัดรูปแบบ โดยจะบันทึกไฟล์เมื่อการทดสอบเสร็จสิ้นและอัปโหลดไปยังที่เก็บข้อมูล Cloud Storage พร้อมกับอาร์ติแฟกต์การทดสอบอื่นๆ

Test Lab ปฏิบัติตามแนวทางปฏิบัติแนะนำที่กำหนดไว้สำหรับการแชร์ไฟล์ระหว่างแอป ซึ่งอธิบายไว้ในการแชร์ไฟล์ ในเมธอด onCreate() ของกิจกรรม ซึ่งเป็นที่ตั้งของ Intent คุณสามารถ เรียกข้อมูลและตรวจสอบไฟล์เอาต์พุตข้อมูลได้โดยการเรียกใช้โค้ดต่อไปนี้

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

หากต้องการเขียนลงในไฟล์จากฝั่ง C++ ของแอปเกม คุณสามารถส่งตัวบอกไฟล์แทนเส้นทางไฟล์ได้

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

ตัวอย่างไฟล์เอาต์พุต

แม้ว่า Test Lab จะไม่กำหนดรูปแบบที่เฉพาะเจาะจงสำหรับ logFile แต่การจัดโครงสร้างเอาต์พุตเป็น JSON ที่ตรงกับสคีมาด้านล่างจะช่วยให้คอนโซล Firebase (https://console.firebase.google.com/project/_/testlab) แยกวิเคราะห์และแสดงเมตริกสรุปสำหรับการทดสอบ Game Loop ได้

รายละเอียดสำคัญเกี่ยวกับตัวอย่างนี้

  • ผู้ที่ให้ข้อมูล: คุณ (นักพัฒนาซอฟต์แวร์การทดสอบ) มีหน้าที่รับผิดชอบในการ คำนวณและเขียนเมตริกทั้งหมดลงในไฟล์นี้จากโค้ดเกม Test Lab จะไม่รวบรวมหรือสร้างจุดข้อมูลเหล่านี้ให้คุณโดยอัตโนมัติ
  • การเพิ่มช่องที่กำหนดเอง: พื้นที่ที่ทำเครื่องหมายเป็น /.../ จะระบุตำแหน่งที่คุณเพิ่มคู่คีย์-ค่าที่กำหนดเองได้ (เช่น "rendered_vertices": 12000 หรือ "ai_error_count": 0) คุณเพิ่มพร็อพเพอร์ตี้ JSON ที่ถูกต้องลงในเอาต์พุตได้เมื่อเขียนไฟล์จากแอป ตราบใดที่ชื่อช่องไม่ขัดแย้งกับช่องสคีมา เช่น name หรือ start_timestamp
  • ตำแหน่งของไฟล์เอาต์พุต: หลังจากทดสอบเสร็จแล้ว ระบบจะจัดเก็บไฟล์เอาต์พุตดิบ ไว้ใน Bucket ผลลัพธ์ของ Cloud Storage (GCS) ของโปรเจ็กต์ ภายในไดเรกทอรีอาร์ติแฟกต์การทดสอบที่รัน และคุณจะดาวน์โหลดไฟล์ได้ นอกจากนี้ คุณยังดูและตรวจสอบ เอาต์พุตที่แยกวิเคราะห์แล้วได้ในหน้า Test Lab ของคอนโซล Firebase

ตัวอย่างไฟล์เอาต์พุต JSON ที่มีโครงสร้างมีดังนี้

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

Game Loop หลายรายการ

คุณอาจพบว่าการเรียกใช้ Game Loop หลายรายการในแอปมีประโยชน์ โดย Loop คือการเรียกใช้แอปเกมอย่างสมบูรณ์ตั้งแต่ต้นจนจบ ตัวอย่างเช่น หากเกมมีหลายระดับ คุณอาจต้องการมี Game Loop 1 รายการเพื่อเปิดตัวแต่ละระดับแทนที่จะมีลูปเดียวที่วนซ้ำผ่านทุกระดับ ด้วยวิธีนี้ หากแอปขัดข้องที่เลเวล 32 คุณจะเปิดใช้ Game Loop นั้นได้โดยตรงเพื่อจำลองการขัดข้องและทดสอบการแก้ไขข้อบกพร่อง

วิธีเปิดใช้แอปให้เล่นลูปหลายรายการพร้อมกัน

  • หากคุณทำการทดสอบด้วย Test Loop Manager ให้ทำดังนี้

    1. เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ Manifest ของแอปภายในองค์ประกอบ <application>

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

      Intent การเปิดตัวนี้มีลูปเป้าหมายเป็นพารามิเตอร์จำนวนเต็ม ในช่อง android:value คุณสามารถระบุจำนวนเต็มตั้งแต่ 1 ถึง 1024 (จำนวนลูปสูงสุดที่อนุญาตสำหรับการทดสอบครั้งเดียว) โปรดทราบ ว่าดัชนีของลูปจะเริ่มจาก 1 ไม่ใช่ 0

    2. ในแอป Test Loop Manager หน้าจอการเลือกจะปรากฏขึ้น ซึ่ง ช่วยให้คุณเลือก Loop ที่ต้องการเรียกใช้ได้ หากเลือกหลาย ลูป ระบบจะเปิดใช้แต่ละลูปตามลำดับหลังจากลูปก่อนหน้า เสร็จสมบูรณ์

  • หากคุณกำลังทำการทดสอบด้วยFirebaseคอนโซล ให้ป้อนรายการหรือช่วงหมายเลขลูปในฟิลด์สถานการณ์

  • หากคุณทำการทดสอบด้วย gcloud CLI ให้ระบุรายการหมายเลขลูป โดยใช้แฟล็ก --scenario-numbers เช่น --scenario-numbers=1,3,5 จะเรียกใช้ลูป 1, 3 และ 5

  • หากคุณเขียน C++ และต้องการเปลี่ยนลักษณะการทำงานของลูป ให้ส่งข้อมูลพิเศษต่อไปนี้ไปยังโค้ด C++ ดั้งเดิม

    Kotlin

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

    Java

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

    ตอนนี้คุณเปลี่ยนลักษณะการทำงานของลูปได้ตามint ค่าที่ได้

ติดป้ายกำกับ Game Loop

เมื่อติดป้ายกำกับ Game Loop ด้วยป้ายกำกับสถานการณ์อย่างน้อย 1 รายการ คุณและทีม QA จะเปิดใช้ชุด Game Loop ที่เกี่ยวข้อง (เช่น "Game Loop ทั้งหมดที่เข้ากันได้" ) และทดสอบในเมทริกซ์เดียวได้อย่างง่ายดาย คุณสร้างป้ายกำกับของคุณเองหรือ ใช้ป้ายกำกับที่กำหนดไว้ล่วงหน้าซึ่งTest Labมีให้ก็ได้ โดยทำดังนี้

  • com.google.test.loops.player_experience: สำหรับลูปที่ใช้เพื่อ จำลองประสบการณ์ของผู้ใช้จริงเมื่อเล่นเกม เป้าหมายของการทดสอบด้วยลูปเหล่านี้คือการค้นหาปัญหาที่ผู้ใช้จริงจะพบขณะเล่นเกม
  • com.google.test.loops.gpu_compatibility: สำหรับลูปที่ใช้ในการทดสอบปัญหาที่เกี่ยวข้องกับ GPU เป้าหมายของการทดสอบด้วยลูปเหล่านี้คือการเรียกใช้โค้ด GPU ที่อาจทำงานไม่ถูกต้องในเวอร์ชันที่ใช้งานจริง เพื่อเปิดเผยปัญหาเกี่ยวกับ ฮาร์ดแวร์และไดรเวอร์
  • com.google.test.loops.compatibility: สำหรับลูปที่ใช้ทดสอบปัญหาความเข้ากันได้ในวงกว้าง ซึ่งรวมถึงปัญหา I/O และปัญหา OpenSSL
  • com.google.test.loops.performance: ลูป For ใช้เพื่อทดสอบประสิทธิภาพของอุปกรณ์ ตัวอย่างเช่น เกมอาจทำงานในการตั้งค่ากราฟิกที่ซับซ้อนที่สุด เพื่อดูว่าอุปกรณ์ใหม่ทำงานอย่างไร

วิธีเปิดใช้แอปเพื่อเล่นลูปที่มีป้ายกำกับเดียวกัน

  • หากคุณทำการทดสอบด้วย Test Loop Manager ให้ทำดังนี้

    1. ในไฟล์ Manifest ของแอป ให้เพิ่มบรรทัดข้อมูลเมตาต่อไปนี้และแทนที่ 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. ในแอป Test Loop Manager ให้ป้อนป้ายกำกับอย่างน้อย 1 รายการในช่องป้ายกำกับ

  • หากคุณกำลังทำการทดสอบด้วยFirebaseคอนโซล ให้ป้อนป้ายกำกับอย่างน้อย 1 รายการในช่องป้ายกำกับ

  • หากคุณกำลังเรียกใช้การทดสอบด้วย gcloud CLI ให้ระบุป้ายกำกับสถานการณ์อย่างน้อย 1 รายการโดยใช้ --scenario-labels แฟล็ก (เช่น --scenario-labels=performance,gpu)

การสนับสนุนด้านการอนุญาตให้ใช้สิทธิแอป

Test Lab รองรับแอปที่ใช้บริการการอนุญาตให้ใช้สิทธิแอป ที่ Google Play นำเสนอ หากต้องการตรวจสอบการอนุญาตให้ใช้สิทธิเมื่อทดสอบ แอปด้วย Test Lab ให้สำเร็จ คุณต้องเผยแพร่แอปไปยังแชแนลการผลิต ใน Play Store หากต้องการทดสอบแอปในช่องอัลฟ่าหรือเบต้าโดยใช้ Test Lab ให้นำการตรวจสอบการอนุญาตให้ใช้สิทธิออกก่อนอัปโหลดแอปไปยัง Test Lab

ปัญหาที่ทราบ

การทดสอบ Game Loop ใน Test Lab มีปัญหาที่ทราบดังต่อไปนี้

  • การขัดข้องบางอย่างไม่รองรับการย้อนรอย เช่น บิลด์บางรุ่นอาจ ระงับเอาต์พุตของกระบวนการ debuggerd โดยใช้ prctl(PR_SET_DUMPABLE, 0) ดูข้อมูลเพิ่มเติมได้ที่ debuggerd
  • ขณะนี้ระบบยังไม่รองรับ API ระดับ 19 เนื่องจากข้อผิดพลาดเกี่ยวกับสิทธิ์ของไฟล์