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

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

Tài liệu này hướng dẫn bạn cách sử dụng Android Performance Analyzer (APA) và các truy vấn SQL Perfetto tuỳ chỉnh để xác định một cách chắc chắn 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ý

  • Stripped logs: Production builds often hide initialization and driver-loading footprints.
  • 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 thư viện cuối cùng không hoạt động và kích hoạt một cơ chế dự phòng.
  • Dự phòng âm thầm: Nếu quá trình khởi tạo 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ặp phả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à dùng APA để ghi lại dấu vết hệ thống trong phân đoạn mà bạn muốn phân tích, chẳng hạn như một điểm trong quá trình chơi trò chơi mà bạn nghi ngờ có hiện tượng giảm 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ở ra, 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. Tại đây, bạn có thể truy vấn dữ liệu trực tiếp.

  3. Dán truy vấn SQL sau đây vào thẻ APA SQL: Sao chép truy vấn SQL sau đây rồi 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, QueuePresentKHRvkQueuePresentKHR. Thư viện 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 phối phần trăm của Vulkan so với các lệnh gọi kết xuất 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 bên cạnh 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 biết tên quy trình (process_name), số lần trình bày OpenGL ES (egl_count), số lần trình bày Vulkan (vulkan_count), tổng số lầ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(%)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 một bảng

Các lỗi phổ biến

  • Tránh nhầm lẫn SurfaceFlinger: Luôn giới hạn phạm vi tìm kiếm trong luồng ứng dụng của trò chơi (RenderThread). Các quy trình hợp thành trên toàn hệ thống như SurfaceFlinger có thể cho thấy các dấu vết 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 biệt trò chơi, hãy bỏ chú thí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'
    
  • Giai đoạn 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 quá trình chuyển đổi tải có thể dẫn đến việc khởi tạo sai lệch.

Yêu cầu về dấu vết miễn trừ Level Up

Nếu bạn đang sử dụng Android Performance Analyzer (APA) để ghi lại một dấu vết nhằm đủ điều kiện được miễn tham gia chương trình Google Play Games LevelUp, thì dấu vết đó phải đáp ứng các yêu cầu cụ thể về phần cứng để được coi là 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ể dùng các thiết bị sau để ghi lại dấu vết miễn LevelUp:

  • Mọi thiết bị có nhà cung cấp GPU là SLSI (Samsung), sử dụng GPU AMD Xclipse
  • Pixel 11