พัฒนาเกมสำหรับทุกหน้าจอ

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

ความแตกต่างที่เจาะจงเกี่ยวกับประสบการณ์การใช้งานของผู้เล่นมีดังนี้

  • รูปแบบของอุปกรณ์: แม้ว่าโทรศัพท์จะมี Android แบบดั้งเดิม ประสบการณ์ของอุปกรณ์ คุณทำให้โต้ตอบกับเกมได้ในอุปกรณ์รูปแบบอื่นๆ ด้วย อุปกรณ์ ChromeOS เรียกใช้คอนเทนเนอร์ Android ที่แสดงเกมได้ แท็บเล็ต ที่เรียกใช้ Android ได้นั้นรองรับความแม่นยำหลายระดับ Android TV อุปกรณ์เหล่านี้รองรับประสบการณ์ที่มีรายละเอียดครบถ้วนและสมจริงยิ่งขึ้น ผู้เล่นสามารถ จำลองสภาพแวดล้อมหลายหน้าต่างโดยใช้เครื่องมือส่วนขยายดิสเพลย์ และเมื่อ ด้วยการใช้อุปกรณ์แบบพับได้ ผู้เล่นจึงสามารถเปลี่ยนขนาดของหน้าจอระหว่างการเล่นเกม เซสชัน
  • วิธีการโต้ตอบ: ผู้เล่นสามารถให้ข้อมูลด้วยการแตะอุปกรณ์ แต่ยังใช้เมาส์ ทัชแพด แป้นพิมพ์ หรือตัวควบคุมได้ด้วย แทน นอกจากนี้ ยังให้บริการเครื่องมือส่วนขยายดิสเพลย์และอุปกรณ์แบบพับได้ อุปกรณ์ช่วยให้ผู้เล่นสัมผัสประสบการณ์เกมบนหน้าจอที่ใหญ่ขึ้นได้นานขึ้น เซสชันการเล่นเกมและอินเทอร์เฟซที่ซับซ้อนขึ้นก็เป็นไปได้มากกว่า
  • การสนับสนุนฮาร์ดแวร์: อุปกรณ์ที่ใช้ Android บางรุ่นไม่มีฮาร์ดแวร์ที่ ในอุปกรณ์มือถือ เช่น กล้องหลัง GPS และ การเชื่อมต่อเครือข่าย เกมควรปรับให้เข้ากับฮาร์ดแวร์ที่พร้อมใช้งาน และจัดการสถานการณ์ที่ไม่สามารถใช้งานคุณลักษณะบางอย่างได้อย่างชาญฉลาด

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

แนวทางปฏิบัติแนะนำในการออกแบบเกม

เมื่อวางแผนการออกแบบและสถาปัตยกรรมของเกม ให้ทำตามแนวทางปฏิบัติแนะนำ ดังที่อธิบายไว้ในส่วนต่อไปนี้

ตอบกลับการเปลี่ยนแปลงการกําหนดค่าด้วยตนเอง

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

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

ในการเรียนรู้วิธีเพิ่มตรรกะการเปลี่ยนแปลงการกำหนดค่านี้ลงในเกม โปรดดู เกี่ยวกับวิธีสร้างการเปลี่ยนแปลงการกำหนดค่าที่กำหนดเอง เครื่องจัดการ

สร้างสถาปัตยกรรมที่ยืดหยุ่น

โปรดทำตามคำแนะนำต่อไปนี้เพื่อเพิ่มการรองรับเกมของคุณในอุปกรณ์จำนวนมากที่สุด แนวทางปฏิบัติ:

  • ทำให้ Android App Bundle ใช้งานได้แทน APK แต่ละรายการ แอป Android แพ็กเกจช่วยให้คุณจัดแพ็กเกจอาร์ติแฟกต์ของ และสถาปัตยกรรมรูปแบบต่างๆ เช่น x86, ARM ทั้งหมดได้ อาร์ติแฟกต์ นอกจากนี้ Android App Bundle ยังรองรับขีดจำกัดขนาดที่สูงขึ้นสำหรับ APK พื้นฐานแต่ละรายการอาจมีขนาดใหญ่ได้ถึง 150 MB และ Bundle นั้นอาจมี ขนาดกิกะไบต์
  • เพิ่มการรองรับสถาปัตยกรรม x86 ขั้นตอนนี้จะช่วยปรับปรุงประสิทธิภาพ ประสิทธิภาพในอุปกรณ์ที่ไม่รองรับ ARM เพราะตอนนี้อุปกรณ์เหล่านี้ ดำเนินการตามคำสั่งโดยไม่ต้องแปลก่อน

เพิ่มการรองรับ Vulkan

การรองรับ Vulkan จะช่วยให้เกมของคุณประสบความสำเร็จสูงขึ้น ประสิทธิภาพกราฟิก อุปกรณ์ส่วนใหญ่รองรับ API กราฟิกนี้

สร้างเครื่องจัดการการเปลี่ยนแปลงการกำหนดค่าที่กำหนดเอง

หากต้องการประกาศประเภทของการเปลี่ยนแปลงการกำหนดค่าที่เกมของคุณจัดการเอง ให้เพิ่ม android:configChanges แอตทริบิวต์ของเอลิเมนต์ <activity> แต่ละรายการในไฟล์ Manifest ที่แสดงถึงหน้าจอ หรืออินเทอร์เฟซที่ซับซ้อน

ข้อมูลโค้ดต่อไปนี้แสดงวิธีประกาศว่าเกมดูแลอยู่ การเปลี่ยนแปลงของขนาดหน้าจอ การวางแนวหน้าจอ และวิธีการป้อนข้อมูล

<activity ...
    android:configChanges="screenSize|orientation|keyboard|keyboardHidden">
</activity>

เมื่อมีการเปลี่ยนแปลงการกำหนดค่าที่ประกาศไว้ ระบบจะเรียก วิธีอื่น onConfigurationChanged() ภายในวิธีนี้ ให้เพิ่มตรรกะเพื่ออัปเดต UI ของเกม ดังนี้

จัดการการเปลี่ยนแปลงการกำหนดค่าหน้าจอ

เกมจะจัดการการเปลี่ยนขนาดหน้าจอและการวางแนวหน้าจอด้วยตนเองได้ทุกเมื่อ คุณจะระบุค่า screenSize และ orientation ตามลำดับใน android:configChanges คุณสามารถใช้ค่าใหม่เหล่านี้เพื่ออัปเดตเนื้อหาของฉากและ พื้นที่อินพุตของโปรแกรมเล่น ดูคำแนะนำวิธีออกแบบเลย์เอาต์ของเกมเพื่อสร้าง อัปเดตได้ง่ายขึ้น ดูคำแนะนำเกี่ยวกับการรองรับหน้าจอแบบต่างๆ ขนาดต่างๆ

ในการใช้งาน onConfigurationChanged() ของเกม ให้ใช้ Pass-in ออบเจ็กต์ Configuration และ ออบเจ็กต์ Display ของผู้จัดการหน้าต่างไปยัง กำหนดค่าที่อัปเดตสำหรับขนาดหน้าจอและการวางแนวหน้าจอ ตามลำดับ

ข้อมูลโค้ดต่อไปนี้แสดงวิธีรับขนาดหน้าจอที่อัปเดตของเกม และการวางแนว

Kotlin

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    val density: Float = resources.displayMetrics.density
    val newScreenWidthPixels = (newConfig.screenWidthDp * density).toInt()
    val newScreenHeightPixels = (newConfig.screenHeightDp * density).toInt()

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    val newScreenOrientation: Int = newConfig.orientation

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    val newScreenRotation: Int = windowManager.defaultDisplay.rotation
}

Java

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    float density = getResources().getDisplayMetrics().density;
    int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density);
    int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density);

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    int newScreenOrientation = newConfig.orientation;

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    int newScreenRotation = getWindowManager().getDefaultDisplay()
            .getRotation();
}

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

คุณภาพหน้าจอเฉพาะเกม

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

โหมดเต็มหน้าจอ

ในบางแพลตฟอร์ม เช่น ChromeOS แอปและเกม Android สามารถหน้าต่างและ ปรับขนาดได้โดยค่าเริ่มต้น หากเกมของคุณควรทำงานในโหมดเต็มหน้าจอเสมอ สามารถตั้งค่า android:resizeableActivity เป็น false ในองค์ประกอบ <activity> ของคุณ ดังที่แสดงใน ข้อมูลโค้ดต่อไปนี้

<activity ...
    android:resizeableActivity="false">
</activity>

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

การวางแนวหน้าจอ

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

<activity ...
    android:screenOrientation="landscape">
</activity>

คุณภาพหน้าจอเฉพาะอุปกรณ์

ส่วนต่อไปนี้จะอธิบายวิธีจัดการกับการเปลี่ยนแปลงการกำหนดค่าตามหน้าจอ กับคุณภาพเฉพาะที่อุปกรณ์บางอย่างมี

สัดส่วนภาพ

อุปกรณ์บางรุ่นรองรับสัดส่วนภาพที่แตกต่างกัน ตัวอย่างเช่น อุปกรณ์แบบพับได้ ออกแบบมาให้รองรับสัดส่วนภาพ 21:9 เมื่ออยู่ในโหมดพับหน้าจอ สิ่งที่ควรจัดการ ความหลากหลายที่เป็นไปได้ของสัดส่วนภาพนี้ ให้ทำอย่างน้อย 1 อย่างต่อไปนี้

  • กำหนดเป้าหมายเป็น Android 8.0 (API ระดับ 26) ขึ้นไป
  • ปรับฉากและอินเทอร์เฟซเกมให้ปรับขนาดได้ ตั้งค่า android:resizeableActivity เป็น true ในอุปกรณ์ที่ใช้ Android 7.0 (API ระดับ 24) ขึ้นไป
  • ประกาศสัดส่วนภาพสูงสุดที่รองรับ ใน เชื่อมโยงแอตทริบิวต์ <meta-data> แล้ว กับเกมของคุณ โดยตั้งค่า android.max_aspect เป็น 2.4 ดังที่แสดงใน อย่างไรก็ตาม โปรดทราบว่าสัดส่วนภาพจะใหญ่กว่า ที่คุณระบุทำให้เกมปรากฏขึ้น มีแถบดำด้านบน-ล่างของภาพ ภายในจอแสดงผล

    <application>
    <meta-data android:name="android.max_aspect"
               android:value="2.4" />
    </application>
    

แสดงกิจกรรมหลายรายการพร้อมกัน

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

สำหรับอุปกรณ์ที่ใช้ Android 9 (API ระดับ 28) ขึ้นไป มีโอกาสสำหรับผู้ดูแลระบบระดับสูงทั้งหมด กิจกรรมที่มองเห็นได้จะกลับมาทำงานอีกครั้งพร้อมกัน เพื่อให้ลักษณะการทำงานนี้ แต่ทั้งเกมและ OEM ของอุปกรณ์จะต้องเลือกใช้ คุณสามารถเพิ่มการสนับสนุนภายในเกมได้โดยการตั้งค่า android.allow_multiple_resumed_activities ไปยัง true ในไฟล์ Manifest ของเกม ดังที่แสดงในข้อมูลโค้ดต่อไปนี้

<application>
    <meta-data android:name="android.allow_multiple_resumed_activities"
               android:value="true" />
</application>

จากนั้นก็ทดสอบเกมในอุปกรณ์ต่างๆ เพื่อดูว่าอุปกรณ์ไหนให้ การสนับสนุน OEM ที่จำเป็นเพื่อให้การเปิดใช้งานหลายอุปกรณ์ทำงานได้อย่างถูกต้อง

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

จัดการรูปแบบการโต้ตอบประเภทต่างๆ

เกมจะจัดการการแสดงแป้นพิมพ์และความพร้อมใช้งานของแป้นพิมพ์ด้วยตนเองทุกเมื่อ คุณจะระบุค่า keyboard และ keyboardHidden ตามลำดับใน android:configChanges คุณใช้ค่าใหม่เหล่านี้เพื่ออัปเดตอินพุตหลักของเกมได้

เมื่อกำหนดค่าเกมให้รองรับการป้อนข้อมูลของผู้ใช้หลายประเภท ให้ ดังต่อไปนี้

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

    คุณมักจะกำหนดวิธีที่ผู้เล่นวางแผนที่จะโต้ตอบกับเกมได้ ตามอุปกรณ์อินพุตที่ต้องการ

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

ส่วนต่อไปนี้จะแสดงแนวทางปฏิบัติแนะนำสำหรับการป้อนข้อมูลบางประเภท อุปกรณ์

แป้นพิมพ์

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

แป้น WASD หรือแป้นลูกศรมักเหมาะกับการควบคุมการเคลื่อนไหวของตัวละคร และควรกำหนดคีย์ที่เฉพาะเจาะจงสำหรับการดำเนินการหรือทักษะที่สำคัญแต่ละรายการด้วย ที่ตัวละครที่ควบคุมสามารถทำได้ในเกม วิธีเพิ่ม ประสบการณ์ของผู้เล่น ให้ลองเพิ่มการรองรับแป้นลัดที่กำหนดเองในเกม

ผู้เล่นควรสามารถเปิดเมนูของเกมและไปยังส่วนต่างๆ ของเมนูเหล่านั้นได้ โดยใช้แป้นพิมพ์ แป้น Esc มักใช้ในการแมปสำหรับการหยุดฉากชั่วคราวและ ที่แสดงเมนูของเกม

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการรองรับการป้อนข้อมูลด้วยแป้นพิมพ์ในเกม ให้ดูที่คู่มือ เกี่ยวกับวิธีรองรับการไปยังส่วนต่างๆ ด้วยแป้นพิมพ์ รวมถึงคู่มือวิธีจัดการแป้นพิมพ์ การดำเนินการ

เกมคอนโทรลเลอร์

ดูคำแนะนำในการจัดการอินพุตตัวควบคุมในเกมสำหรับข้อมูลเพิ่มเติม เกี่ยวกับวิธีสนับสนุนตัวควบคุมเกม

เมาส์หรือทัชแพด

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

สำหรับอุปกรณ์ที่ใช้ Android 8.0 (API ระดับ 26) ขึ้นไป คุณสามารถใช้เมาส์ จับภาพ API เพื่อช่วยในการบันทึกตัวชี้ ในเกมที่ตอบสนองต่อ การป้อนข้อมูลด้วยความแม่นยำสูง คุณสามารถดูพิกัดปัจจุบันของตัวชี้ได้โดยเรียกใช้ getX() และ getY() เมธอด

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

ทดสอบเกม

ก่อนเปิดตัวเกม ให้ทดสอบว่าเกมตอบสนองต่อการเปลี่ยนแปลงการกำหนดค่าอย่างไร ทำตามขั้นตอนที่อธิบายไว้ในส่วนต่อไปนี้

อัปเดตแผนการทดสอบ

เมื่อตรวจสอบฟังก์ชันการทำงานของเกม ให้รวมกรอบการทดสอบต่อไปนี้

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

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

สำหรับแนวทางปฏิบัติที่ดีที่สุดที่เกี่ยวข้องกับการทดสอบเกม โปรดดูข้อมูลพื้นฐานของ คู่มือการทดสอบ

ใช้เครื่องมือทดสอบและแก้ไขข้อบกพร่อง

คุณทำการทดสอบได้โดยใช้เครื่องมือต่างๆ ที่แพลตฟอร์มรองรับ ได้แก่