ระบุ API การแสดงผลเกม Vulkan เทียบกับ OpenGL ES

ขณะพัฒนาหรือเพิ่มประสิทธิภาพเกม 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

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

  2. คลิกแท็บ SQL ใน APA: เมื่อหน้าจอการวิเคราะห์การติดตามเปิดอยู่ ให้คลิกแท็บ SQL ในเมนูการนำทางของ UI เพื่อเปิดสภาพแวดล้อมของตัวประมวลผลการติดตาม ซึ่งคุณสามารถค้นหาข้อมูลได้โดยตรง

  3. วางการค้นหา 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;
    
  4. เรียกใช้การค้นหา: คลิกปุ่มเรียกใช้การค้นหาใกล้กับช่องป้อนข้อมูล หลังจากที่การค้นหาทำงาน ตารางจะปรากฏในแผงผลลัพธ์ที่แสดงชื่อกระบวนการ (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