ขณะพัฒนาหรือเพิ่มประสิทธิภาพเกม Android การทำความเข้าใจไปป์ไลน์กราฟิกที่เครื่องมือของคุณใช้อยู่มักจะเป็นประโยชน์ เครื่องมืออาจเลือก Vulkan หรือ GLES โดยไม่มีสัญญาณที่นักพัฒนาแอปเข้าถึงได้อย่างชัดเจน อย่างไรก็ตาม ในบางสถานการณ์ การพึ่งพา logcat เพื่อยืนยันว่าเกมทำงานบน Vulkan หรือเปลี่ยนกลับไปใช้ OpenGL ES โดยไม่มีการแจ้งเตือนอาจไม่น่าเชื่อถือ
คู่มือนี้จะแสดงวิธีใช้ Android Performance Analyzer (APA) และการค้นหา Perfetto SQL ที่กำหนดเองเพื่อระบุ API การแสดงผลที่ใช้งานอยู่ของเกมอย่างชัดเจน
ข้อจำกัดของการยืนยันตามบันทึก
- บันทึกที่ถูกตัดออก: บิลด์เวอร์ชันที่ใช้งานจริงมักจะซ่อนร่องรอยการเริ่มต้นและการโหลดไดรเวอร์
- ผลบวกลวง: เกมเอนจินบางรายการจะโหลดทั้งไลบรารี Vulkan และ OpenGL ES ระหว่างการเริ่มต้นระบบ โดยพิมพ์บันทึกการเริ่มต้นระบบสำหรับทั้ง 2 รายการ แม้ว่าในที่สุดรายการใดรายการหนึ่งจะล้มเหลวและทริกเกอร์การสำรองก็ตาม
- การเปลี่ยนไปใช้ OpenGL ES โดยไม่มีการแจ้งเตือน: หากการเริ่มต้น Vulkan ไม่สำเร็จเนื่องจากปัญหาเกี่ยวกับไดรเวอร์เฉพาะอุปกรณ์ เอนจินมักจะเปลี่ยนไปใช้ OpenGL ES โดยไม่มีการแสดงข้อผิดพลาดร้ายแรง
วัดผลโดยใช้ APA
เมื่อใช้ Android Performance Analyzer คุณจะบันทึกการติดตามของระบบและวิเคราะห์ข้อมูลเฟรมได้อย่างแม่นยำผ่านการค้นหา SQL ทำตามขั้นตอนต่อไปนี้เพื่อวัดการใช้ Vulkan และ GLES
บันทึกการติดตามด้วย APA: เปิดเกมและใช้ APA เพื่อบันทึกการติดตามของระบบในระหว่างส่วนที่ต้องการวิเคราะห์ เช่น จุดระหว่างเกมเพลย์ที่คุณสงสัยว่าเฟรมตก หลังจากเชื่อมต่ออุปกรณ์และบันทึกการติดตามเสร็จแล้ว ข้อมูลการติดตามจะโหลดในอินเทอร์เฟซ APA
คลิกแท็บ SQL ใน APA: เมื่อหน้าจอการวิเคราะห์การติดตามเปิดอยู่ ให้คลิกแท็บ SQL ในเมนูการนำทางของ UI เพื่อเปิดสภาพแวดล้อมของตัวประมวลผลการติดตาม ซึ่งคุณสามารถค้นหาข้อมูลได้โดยตรง
วางการค้นหา SQL ต่อไปนี้ในแท็บ APA SQL: คัดลอกการค้นหา SQL ต่อไปนี้แล้ววางลงในช่องป้อนข้อมูลการค้นหา การค้นหานี้จะสแกนการติดตามเพื่อหากิจกรรม API การวาด เช่น
eglSwapBuffers,QueuePresentKHRและvkQueuePresentKHRโดยจะจัดกลุ่มตามชื่อกระบวนการและคำนวณจำนวน API การแสดงผลและการกระจายเปอร์เซ็นต์ของการเรียกใช้การแสดงผล Vulkan เทียบกับ OpenGL ES ดังนี้WITH raw_slices AS ( -- 1. Map each slice (API call) to its corresponding process or package via UTID and UPID SELECT p.name AS process_name, s.name AS slice_name FROM slice s JOIN thread_track tt ON s.track_id = tt.id JOIN thread t USING (utid) JOIN process p USING (upid) WHERE (s.name LIKE 'eglSwapBuffers%' OR s.name IN ('QueuePresentKHR', 'vkQueuePresentKHR')) -- Optional: To isolate your game, uncomment the following and filter by package name and thread name: -- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread' ), process_stats AS ( -- 2. Aggregate counts per individual process SELECT process_name, SUM(CASE WHEN slice_name LIKE 'eglSwapBuffers%' THEN 1 ELSE 0 END) AS egl_count, SUM(CASE WHEN slice_name IN ('QueuePresentKHR', 'vkQueuePresentKHR') THEN 1 ELSE 0 END) AS vulkan_count FROM raw_slices GROUP BY process_name ), process_totals AS ( -- 3. Calculate total counts for denominator calculation SELECT process_name, egl_count, vulkan_count, (egl_count + vulkan_count) AS total_count FROM process_stats ) -- 4. Calculate final percentage shares per row, preventing division by zero errors SELECT process_name, egl_count, vulkan_count, total_count, ROUND(CAST(egl_count AS REAL) * 100 / NULLIF(total_count, 0), 2) AS "egl_percentage(%)", ROUND(CAST(vulkan_count AS REAL) * 100 / NULLIF(total_count, 0), 2) AS "vulkan_percentage(%)" FROM process_totals ORDER BY total_count DESC;เรียกใช้การค้นหา: คลิกปุ่มเรียกใช้การค้นหาใกล้กับช่องป้อนข้อมูล หลังจากที่การค้นหาทำงาน ตารางจะปรากฏในแผงผลลัพธ์ที่แสดงชื่อกระบวนการ (
process_name), จำนวนการนำเสนอ OpenGL ES (egl_count), จำนวนการนำเสนอ Vulkan (vulkan_count), จำนวนการนำเสนอทั้งหมด (total_count) และเปอร์เซ็นต์ของ API แต่ละรายการที่ใช้ (egl_percentage(%)และvulkan_percentage(%))
หน้าจอแสดงการค้นหา SQL ที่ดำเนินการและเมตริก API การแสดงผลที่ได้ซึ่งแสดงในตาราง
ข้อผิดพลาดที่พบบ่อย
หลีกเลี่ยงความสับสนเกี่ยวกับ
SurfaceFlinger: กำหนดขอบเขตการค้นหาให้อยู่ในเทรดแอปพลิเคชันของเกม (RenderThread) เสมอ กระบวนการคอมโพสิเตอร์ทั้งระบบ เช่นSurfaceFlingerอาจแสดงแทร็ก Vulkan หรือ EGL ที่แสดงถึงการแสดงผล UI ของระบบ ไม่ใช่ไปป์ไลน์การแสดงผลภายในของเกม หากต้องการแยกเกมของคุณ ให้ยกเลิกการคอมเมนต์ตัวกรองที่ไม่บังคับในส่วนคำสั่งWHEREของการค้นหา SQL หลัก และแทนที่'com.example.mygame'ด้วยชื่อแพ็กเกจของเกม ดังนี้-- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread'ระยะเวลาเตรียมพร้อม: บันทึกการติดตามหลังจากฉาก 3 มิติหลักของเกมโหลดเสร็จสมบูรณ์แล้วเสมอ การบันทึกระหว่างหน้าจอเริ่มต้น (Splash Screen) หรือการเปลี่ยนผ่านการโหลดอาจส่งผลให้เกิดการเริ่มต้นที่ทำให้เข้าใจผิด
ข้อกำหนดในการติดตามการยกเว้น LevelUp
หากคุณใช้ Android Performance Analyzer (APA) เพื่อบันทึกการติดตามเพื่อให้มีสิทธิ์ได้รับการยกเว้น Google Play Games LevelUp จะมีข้อกำหนดด้านฮาร์ดแวร์ที่เฉพาะเจาะจงเพื่อให้การติดตามถูกต้อง
ขอแนะนำอย่างยิ่งให้คุณบันทึกการติดตามโดยใช้อุปกรณ์อ้างอิง Level Up ที่กำหนดเป้าหมายไว้เครื่องใดเครื่องหนึ่ง
นอกจากนี้ เพื่อให้การตรวจสอบถูกต้อง คุณต้องไม่ใช้การติดตามในอุปกรณ์ที่ใช้ ANGLE GPU โดยเฉพาะอย่างยิ่ง คุณไม่สามารถใช้อุปกรณ์ต่อไปนี้เพื่อบันทึกการติดตามการยกเว้น LevelUp ได้
- อุปกรณ์ใดก็ตามที่ผู้ให้บริการ GPU คือ SLSI (Samsung) ซึ่งใช้ GPU AMD Xclipse
- Pixel 11