Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

เริ่มต้นด้วยการทดสอบ Game Loop

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

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

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

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

ก่อนที่จะเริ่ม

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

  1. ในรายการแอปของคุณให้เพิ่มตัวกรองเจตนาใหม่ให้กับ กิจกรรม ของคุณ:

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

    สิ่งนี้จะช่วยให้ห้องปฏิบัติการทดสอบเปิดเกมของคุณโดยเรียกใช้งานด้วยความตั้งใจที่เฉพาะเจาะจง

  2. ในรหัสของคุณ (เราแนะนำให้ใช้ในการประกาศเมธอด onCreate ) เพิ่มสิ่งต่อไปนี้:

    ชวา

    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
    }

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

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

    ชวา

    yourActivity.finish();

    Kotlin + KTX

    yourActivity.finish()

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

สร้างและเรียกใช้การทดสอบ Game Loop

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

ทำงานบนอุปกรณ์ท้องถิ่น

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

ในการรันการทดสอบบนอุปกรณ์ท้องถิ่นโดยใช้ Test Loop Manager:

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

ทำงานในห้องปฏิบัติการทดสอบ

คุณสามารถรันการทดสอบลูปเกมในห้องปฏิบัติการทดสอบโดยใช้ คอนโซล Firebase หรือ gcloud CLI ก่อนที่คุณจะเริ่มถ้าคุณยังไม่ได้เปิด คอนโซล Firebase และสร้างโครงการ

ใช้คอนโซล Firebase

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นใช้งานคอนโซล Firebase ดู การทดสอบเริ่มต้นด้วยคอนโซล Firebase

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

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

  2. เข้าสู่ gcloud CLI โดยใช้บัญชี Google ของคุณ:

    gcloud auth login

  3. ตั้งค่าโครงการ Firebase ของคุณเป็น gcloud โดยที่ PROJECT_ID เป็น 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

คุณสมบัติเสริม

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

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

การทดสอบ Game Loop ของคุณสามารถเขียนเอาต์พุตไปยังไฟล์ที่ระบุใน launchIntent.getData() หลังจากที่คุณทำการทดสอบคุณสามารถเข้าถึงข้อมูลผลลัพธ์นี้ได้ในส่วน ห้องปฏิบัติการทดสอบ ของคอนโซล Firebase (ดู ตัวอย่างไฟล์เอาต์พุตการทดสอบลูปเกม )

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

ชวา

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

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

ชวา

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

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

คุณสามารถใช้ไฟล์ข้อมูลขาออก (จัดรูปแบบตามตัวอย่างด้านล่าง) เพื่อแสดงผลการทดสอบลูปเกมในส่วน ห้องปฏิบัติการทดสอบ ของคอนโซล Firebase พื้นที่ที่แสดงเป็น /.../ สามารถมีฟิลด์ที่กำหนดเองที่คุณต้องการตราบใดที่พวกเขาจะไม่ขัดแย้งกับชื่อของฟิลด์อื่น ๆ ที่ใช้ในไฟล์นี้:

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

เกมหลายวง

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

วิธีเปิดใช้งานแอปของคุณให้ทำงานหลายลูปพร้อมกัน:

  • หากคุณกำลังทำการทดสอบกับ Test Loop Manager:

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

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

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

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

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

  • หากคุณกำลังทำการทดสอบด้วย gcloud CLI ให้ระบุรายการหมายเลขวนรอบโดยใช้การตั้งค่าสถานะ --scenario-numbers ตัวอย่างเช่น --scenario-numbers=1,3,5 วิ่งวนรอบ 1, 3 และ 5

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

    ชวา

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

    Kotlin + KTX

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

    ตอนนี้คุณสามารถเปลี่ยนพฤติกรรมของลูปของคุณตามค่า int ได้

ลูปเกมฉลาก

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

  • 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 : สำหรับลูปที่ใช้ในการทดสอบประสิทธิภาพของอุปกรณ์ ตัวอย่างเช่นเกมอาจทำงานที่การตั้งค่ากราฟิกที่ซับซ้อนที่สุดเพื่อดูว่าอุปกรณ์ใหม่ทำงานอย่างไร

หากต้องการเปิดใช้งานแอปของคุณให้เรียกใช้ลูปที่มีป้ายกำกับเดียวกัน:

  • หากคุณกำลังทำการทดสอบกับ Test Loop Manager:

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

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

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

การสนับสนุนสิทธิ์ใช้งานแอป

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

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

การทดสอบลูปเกมในห้องปฏิบัติการทดสอบมีปัญหาที่ทราบแล้วดังต่อไปนี้:

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