شناسایی Vulkan درمقابل OpenGL ES game rendering API

هنگام توسعه یا بهینه‌سازی بازی‌های Android، اغلب می‌تواند مفید باشد که بدانید موتور شما از کدام خط لوله گرافیکی استفاده می‌کند؛ موتورها ممکن است Vulkan یا GLES را بدون سیگنال‌های واضح قابل‌دسترسی برای توسعه‌دهنده انتخاب کنند. متأسفانه، موقعیت‌هایی وجود دارد که تکیه بر logcat برای درستی‌سنجی اینکه آیا بازی روی Vulkan اجرا می‌شود یا بی‌صدا به OpenGL ES بازگشته است، می‌تواند غیرقابل‌اعتماد باشد.

این راهنما به شما نشان می‌دهد که چگونه از Android Performance Analyzer (APA) و پرس‌وجوهای سفارشی Perfetto SQL برای شناسایی قطعی API فعال رندرینگ بازی استفاده کنید.

محدودیت‌های درستی‌سنجی مبتنی بر گزارش

  • گزارش‌های پاک‌سازی‌شده: ساخت‌های تولید اغلب ردپای مقداردهی اولیه و بارگیری درایور را پنهان می‌کنند.
  • مثبت کاذب: برخی‌از موتورهای بازی هر دو کتابخانه Vulkan و OpenGL ES را درطول راه‌اندازی بار می‌کنند و گزارش‌های مقداردهی اولیه را برای هر دو چاپ می‌کنند، حتی اگر یکی درنهایت ناموفق باشد و بازگشت را راه‌اندازی کند.
  • بازگشت‌های بی‌صدا: اگر مقداردهی اولیه Vulkan به‌دلیل مشکلات درایور مختص دستگاه ناموفق باشد، موتورها اغلب بدون ایجاد خطاهای بحرانی به OpenGL ES بازمی‌گردند.

اندازه‌گیری بااستفاده از APA

بااستفاده از Android Performance Analyzer، می‌توانید ردگیری سیستم را ضبط کنید و داده‌های فریم را ازطریق پُرسمان‌های SQL به‌دقت تجزیه‌وتحلیل کنید. برای اندازه‌گیری استفاده‌تان از Vulkan و GLES، این مراحل را دنبال کنید:

  1. ضبط رد با APA: بازی‌تان را اجرا کنید و از APA برای ضبط رد سیستم درطول بخشی که می‌خواهید تحلیل کنید استفاده کنید، مثلاً نقطه‌ای درطول گیم‌پلی که به افت فریم مشکوک هستید. پس‌از متصل شدن دستگاه و تکمیل ضبط ردیابی، داده‌های ردیابی در میانای APA بار می‌شود.

  2. روی برگه SQL در APA کلیک کنید: وقتی صفحه تحلیل ردیابی باز است، در منو پیمایش واسط کاربر، روی برگه SQL کلیک کنید تا محیط پردازشگر ردیابی باز شود، جایی که می‌توانید مستقیماً از داده‌ها پُرسمان کنید.

  3. پرس‌وجوی SQL زیر را در برگه APA SQL جای‌گذاری کنید: پرس‌وجوی SQL زیر را کپی کنید و آن را در فیلد ورودی پرس‌وجو جای‌گذاری کنید. این پُرسمان ردگیری را برای رویدادهای میانای برنامه‌سازی کاربردی طراحی، مانند eglSwapBuffers، QueuePresentKHR، و vkQueuePresentKHR اسکن می‌کند. این ابزار آن‌ها را براساس نام فرایند گروه‌بندی می‌کند و تعداد میانای برنامه‌سازی کاربردی رندرینگ و توزیع درصدی فراخوانی‌های رندرینگ 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)، و درصد استفاده از هر میانای برنامه‌سازی کاربردی (egl_percentage(%) و vulkan_percentage(%)) را نشان می‌دهد.

    صفحه‌ای که پُرسمان SQL اجراشده و سنجه‌های API پردازش حاصل را در جدول نشان می‌دهد

مشکلات رایج

  • از SurfaceFlinger سردرگمی اجتناب کنید: همیشه جستجویتان را به رشته برنامه بازی‌تان (RenderThread) محدود کنید. فرایندهای ترکیب‌کننده سراسری سیستم مانند SurfaceFlinger ممکن است قطعه‌های Vulkan یا EGL را نشان دهند که نمایانگر پردازش رابط کاربری سیستم هستند، نه خط لوله پردازش داخلی بازی شما. برای جداسازی بازی‌تان، فیلترهای اختیاری را در عبارت WHERE پُرسمان SQL اصلی از حالت توضیح خارج کنید و 'com.example.mygame' را با نام بسته بازی‌تان جایگزین کنید:

    -- AND p.name = 'com.example.mygame'
    -- AND t.name = 'RenderThread'
    
  • دوره آماده‌سازی: همیشه ردگیری را پس‌از بار شدن کامل صحنه سه‌بعدی اصلی بازی ضبط کنید. ضبط کردن درطول صفحه اسپلش یا انتقال‌های بارگیری ممکن است منجر به مقداردهی اولیه گمراه‌کننده شود.

الزامات ردیابی معافیت LevelUp

اگر از Android Performance Analyzer (APA) برای ضبط ردگیری استفاده می‌کنید تا واجدشرایط معافیت Google Play Games LevelUp شوید، الزامات سخت‌افزاری خاصی برای معتبر بودن ردگیری وجود دارد.

بسیار ترجیح داده می‌شود که ردگیری را بااستفاده از یکی از دستگاه‌های مرجع Level Up هدف‌یابی‌شده ضبط کنید.

علاوه‌براین، برای اطمینان از اعتبارسنجی دقیق، ردگیری شما نباید در دستگاهی که از ANGLE GPU استفاده می‌کند انجام شود. به‌طور مشخص، نمی‌توانید از دستگاه‌های زیر برای ضبط ردگیری معافیت LevelUp خود استفاده کنید:

  • هر دستگاهی که فروشنده GPU آن SLSI (Samsung) باشد و از GPUهای AMD Xclipse استفاده کند
  • ‫Pixel 11