تشخیص رابط برنامه‌نویسی رندر بازی Vulkan در مقابل OpenGL ES

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

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

محدودیت‌های تأیید مبتنی بر لاگ

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

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

با استفاده از تحلیلگر عملکرد اندروید، می‌توانید ردیابی سیستم را ثبت کرده و داده‌های فریم را از طریق کوئری‌های SQL به طور دقیق تجزیه و تحلیل کنید. برای اندازه‌گیری میزان استفاده خود از Vulkan و GLES، این مراحل را دنبال کنید:

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

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

  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 را نشان دهند که نشان دهنده رندر رابط کاربری سیستم هستند، نه خط لوله رندر داخلی بازی شما. برای جداسازی بازی خود، فیلترهای اختیاری را در عبارت WHERE کوئری اصلی SQL از حالت کامنت خارج کنید و 'com.example.mygame' را با نام بسته بازی خود جایگزین کنید:

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

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

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

اکیداً ترجیح داده می‌شود که مسیر خود را با استفاده از یکی از دستگاه‌های مرجع هدفمند ارتقاء سطح (Level Up) ثبت کنید.

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

  • هر دستگاهی که فروشنده پردازنده گرافیکی آن SLSI (سامسونگ) باشد و از پردازنده‌های گرافیکی AMD Xclipse استفاده کند
  • پیکسل ۱۱