ในระหว่างการพัฒนาหรือเพิ่มประสิทธิภาพเกม Android การทำความเข้าใจว่าไปป์ไลน์กราฟิกใดที่เอ็นจินของคุณใช้อยู่อาจเป็นประโยชน์ในหลายๆ ครั้ง เนื่องจากเอ็นจินอาจเลือก Vulkan หรือ GLES โดยไม่มีสัญญาณที่นักพัฒนาแอปเข้าถึงได้อย่างชัดเจน อย่างไรก็ตาม
ในบางกรณี การใช้ logcat เพื่อตรวจสอบว่าเกม
ทำงานบน Vulkan หรือเปลี่ยนกลับไปใช้ OpenGL ES โดยไม่มีการแจ้งเตือนอาจไม่น่าเชื่อถือ
คู่มือนี้จะแสดงวิธีใช้ Android Performance Analyzer (APA) และ การค้นหา SQL ของ Perfetto ที่กำหนดเองเพื่อระบุ API การแสดงผลที่ใช้งานอยู่ของเกมได้อย่างชัดเจน
ข้อจำกัดของการยืนยันตามบันทึก
- บันทึกที่ตัดออก: บิลด์การผลิตมักจะซ่อนร่องรอยการเริ่มต้นและ การโหลดไดรเวอร์
- ผลบวกลวง: เครื่องมือเกมบางตัวจะโหลดทั้งไลบรารี Vulkan และ OpenGL ES ในระหว่างการเริ่มต้น และพิมพ์บันทึกการเริ่มต้นสำหรับทั้ง 2 รายการ แม้ว่าในท้ายที่สุดรายการใดรายการหนึ่ง จะล้มเหลวและทริกเกอร์การสำรองก็ตาม
- การสำรองข้อมูลแบบเงียบ: หากการเริ่มต้น Vulkan ล้มเหลวเนื่องจากปัญหาไดรเวอร์เฉพาะอุปกรณ์ เครื่องยนต์มักจะกลับไปใช้ OpenGL ES โดยไม่แสดงข้อผิดพลาดร้ายแรง
วัดโดยใช้ APA
การใช้ Android Performance Analyzer จะช่วยให้คุณบันทึกการติดตามของระบบ และวิเคราะห์ข้อมูลเฟรมได้อย่างแม่นยำผ่านการค้นหา SQL ทำตามขั้นตอนต่อไปนี้เพื่อ วัดการใช้งาน Vulkan และ GLES
บันทึกการติดตามด้วย APA: เรียกใช้เกมและใช้ APA เพื่อบันทึกการติดตามระบบ ในระหว่างส่วนที่คุณต้องการวิเคราะห์ เช่น จุดในระหว่าง การเล่นเกมที่คุณสงสัยว่าเฟรมหลุด หลังจากเชื่อมต่ออุปกรณ์และ บันทึกการติดตามเสร็จสมบูรณ์แล้ว ข้อมูลการติดตามจะโหลดในอินเทอร์เฟซ APA
คลิกแท็บ SQL ใน APA: เมื่อหน้าจอการวิเคราะห์การติดตามเปิดขึ้น ให้คลิกแท็บ SQL ในเมนูการนำทางของ UI เพื่อเปิดสภาพแวดล้อมของเครื่องมือประมวลผลการติดตาม ซึ่งคุณจะค้นหาข้อมูลได้โดยตรง
วางคำค้นหา SQL ต่อไปนี้ในแท็บ SQL ของ APA: คัดลอกคำค้นหา 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) เสมอ กระบวนการ Compositor ทั่วทั้งระบบ เช่น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 ที่กำหนดเป้าหมายไว้
นอกจากนี้ เพื่อให้การตรวจสอบมีความแม่นยำ คุณต้องไม่ทำการติดตามในอุปกรณ์ที่ใช้ GPU ของ ANGLE โดยเฉพาะอย่างยิ่ง คุณไม่สามารถใช้อุปกรณ์ต่อไปนี้เพื่อบันทึกร่องรอยการยกเว้น LevelUp
- อุปกรณ์ใดก็ตามที่ผู้ให้บริการ GPU คือ SLSI (Samsung) ซึ่งใช้ GPU ของ AMD Xclipse
- Pixel 11