Xác định API kết xuất trò chơi Vulkan so với OpenGL ES

Trong khi phát triển hoặc tối ưu hoá trò chơi Android, bạn nên tìm hiểu xem công cụ của mình đang sử dụng quy trình đồ hoạ nào; các công cụ có thể chọn Vulkan hoặc GLES mà không có tín hiệu rõ ràng cho nhà phát triển. Rất tiếc, có những trường hợp việc dựa vào logcat để xác minh xem trò chơi đang chạy trên Vulkan hay đã tự động quay lại OpenGL ES có thể không đáng tin cậy.

Hướng dẫn này trình bày cách sử dụng Android Performance Analyzer (APA) và các truy vấn SQL Perfetto tuỳ chỉnh để xác định chính xác API kết xuất đang hoạt động của trò chơi.

Các điểm hạn chế của tính năng xác minh dựa trên nhật ký

  • Nhật ký bị loại bỏ: Bản dựng chính thức thường ẩn dấu vết khởi chạy và tải trình điều khiển.
  • Dương tính giả: Một số công cụ phát triển trò chơi tải cả thư viện Vulkan và OpenGL ES trong quá trình khởi động, in nhật ký khởi chạy cho cả hai, ngay cả khi một trong hai cuối cùng không thành công và kích hoạt tính năng dự phòng.
  • Dự phòng thầm lặng: Nếu quá trình khởi chạy Vulkan không thành công do các vấn đề về trình điều khiển dành riêng cho thiết bị, thì các công cụ thường quay lại OpenGL ES mà không gửi lỗi nghiêm trọng.

Đo lường bằng APA

Bằng cách sử dụng Android Performance Analyzer, bạn có thể ghi lại dấu vết hệ thống và phân tích chính xác dữ liệu khung thông qua các truy vấn SQL. Hãy làm theo các bước sau để đo lường mức sử dụng Vulkan và GLES:

  1. Ghi lại dấu vết bằng APA: Chạy trò chơi và sử dụng APA để ghi lại dấu vết hệ thống trong phân đoạn bạn muốn phân tích, chẳng hạn như một thời điểm trong trò chơi mà bạn nghi ngờ có hiện tượng sụt khung hình. Sau khi thiết bị được kết nối và quá trình ghi lại dấu vết hoàn tất, dữ liệu dấu vết sẽ tải trong giao diện APA.

  2. Nhấp vào thẻ SQL trong APA: Khi màn hình phân tích dấu vết mở, trong trình đơn điều hướng của giao diện người dùng, hãy nhấp vào thẻ SQL để mở môi trường trình xử lý dấu vết, nơi bạn có thể truy vấn dữ liệu trực tiếp.

  3. Dán truy vấn SQL sau vào thẻ APA SQL: Sao chép truy vấn SQL sau và dán vào trường nhập dữ liệu truy vấn. Truy vấn này quét dấu vết để tìm các sự kiện API vẽ, chẳng hạn như eglSwapBuffers, QueuePresentKHR và vkQueuePresentKHR. Công cụ này nhóm các lệnh gọi theo tên quy trình và tính toán số lượng API kết xuất cũng như tỷ lệ phần trăm phân phối của lệnh gọi kết xuất Vulkan so với 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. Chạy truy vấn: Nhấp vào nút Chạy truy vấn gần trường nhập dữ liệu. Sau khi truy vấn chạy, một bảng sẽ xuất hiện trong ngăn kết quả cho thấy tên quy trình (process_name), số lượng bản trình bày OpenGL ES (egl_count), số lượng bản trình bày Vulkan (vulkan_count), tổng số bản trình bày (total_count) và tỷ lệ phần trăm của từng API được sử dụng (egl_percentage(%) và vulkan_percentage(%)).

    Màn hình cho thấy truy vấn SQL đã thực thi và các chỉ số API kết xuất thu được hiển thị trong bảng

Các lỗi phổ biến

  • Tránh SurfaceFlinger nhầm lẫn: Luôn đặt phạm vi tìm kiếm cho luồng ứng dụng của trò chơi (RenderThread). Các quy trình của trình kết hợp trên toàn hệ thống như SurfaceFlinger có thể cho thấy các bản nhạc Vulkan hoặc EGL đại diện cho quá trình kết xuất giao diện người dùng hệ thống, chứ không phải quy trình kết xuất nội bộ của trò chơi. Để tách riêng trò chơi của bạn, hãy bỏ ghi chú các bộ lọc không bắt buộc trong mệnh đề WHERE của truy vấn SQL chính và thay thế 'com.example.mygame' bằng tên gói của trò chơi:

    -- AND p.name = 'com.example.mygame'
    -- AND t.name = 'RenderThread'
    
  • Thời gian khởi động: Luôn ghi lại dấu vết sau khi cảnh 3D chính của trò chơi đã tải xong. Việc ghi lại trong màn hình chờ hoặc chuyển đổi tải có thể dẫn đến việc khởi chạy gây hiểu lầm.

Yêu cầu về dấu vết miễn trừ của LevelUp

Nếu bạn đang sử dụng Android Performance Analyzer (APA) để ghi lại dấu vết nhằm đủ điều kiện được miễn trừ trong chương trình Google Play Games LevelUp, thì có một số yêu cầu cụ thể về phần cứng để dấu vết đó hợp lệ.

Bạn nên ghi lại dấu vết bằng một trong các thiết bị tham chiếu Level Up được nhắm đến.

Hơn nữa, để đảm bảo xác thực chính xác, bạn không được lấy dấu vết trên thiết bị sử dụng GPU ANGLE. Cụ thể, bạn không thể sử dụng các thiết bị sau để thu thập dấu vết miễn trừ LevelUp:

  • Bất kỳ thiết bị nào có nhà cung cấp GPU là SLSI (Samsung), sử dụng GPU AMD Xclipse
  • Pixel 11