Vulkan और OpenGL ES गेम रेंडरिंग एपीआई की पहचान करना

Android गेम डेवलप या ऑप्टिमाइज़ करते समय, यह जानना अक्सर फ़ायदेमंद होता है कि आपका इंजन कौनसी ग्राफ़िक्स पाइपलाइन इस्तेमाल कर रहा है. इंजन, डेवलपर के लिए उपलब्ध सिग्नल के बिना ही Vulkan या GLES को चुन सकते हैं. माफ़ करें, लेकिन कुछ स्थितियों में यह भरोसा नहीं किया जा सकता कि logcat यह पुष्टि कर सकता है कि कोई गेम Vulkan पर चल रहा है या चुपचाप OpenGL ES पर वापस आ गया है.

इस गाइड में, Android Performance Analyzer (एपीए) और कस्टम Perfetto SQL क्वेरी का इस्तेमाल करके, गेम के ऐक्टिव रेंडरिंग एपीआई का पता लगाने का तरीका बताया गया है.

लॉग के आधार पर पुष्टि करने की सुविधा की सीमाएं

  • स्ट्रिप्ड लॉग: प्रोडक्शन बिल्ड में अक्सर, इनिशियलाइज़ेशन और ड्राइवर-लोडिंग के फ़ुटप्रिंट छिपे होते हैं.
  • गलत पॉज़िटिव: कुछ गेम इंजन, स्टार्टअप के दौरान Vulkan और OpenGL ES, दोनों लाइब्रेरी लोड करते हैं. साथ ही, दोनों के लिए इनिशियलाइज़ेशन लॉग प्रिंट करते हैं. भले ही, आखिर में कोई एक लाइब्रेरी काम न करे और फ़ॉलबैक ट्रिगर हो जाए.
  • साइलेंट फ़ॉलबैक: अगर डिवाइस के ड्राइवर से जुड़ी समस्याओं की वजह से Vulkan शुरू नहीं हो पाता है, तो इंजन अक्सर गंभीर गड़बड़ियां दिखाए बिना OpenGL ES पर वापस आ जाते हैं.

एपीए का इस्तेमाल करके मेज़र करना

Android Performance Analyzer का इस्तेमाल करके, सिस्टम ट्रेस रिकॉर्ड किया जा सकता है. साथ ही, SQL क्वेरी के ज़रिए फ़्रेम डेटा का सटीक विश्लेषण किया जा सकता है. Vulkan और GLES के इस्तेमाल को मेज़र करने के लिए, यह तरीका अपनाएं:

  1. एपीए की मदद से ट्रेस कैप्चर करना: अपना गेम चलाएं और एपीए का इस्तेमाल करके, उस सेगमेंट के दौरान सिस्टम ट्रेस कैप्चर करें जिसका आपको विश्लेषण करना है. जैसे, गेमप्ले के दौरान कोई ऐसा पॉइंट जहां आपको फ़्रेम ड्रॉप होने का शक है. डिवाइस कनेक्ट होने और ट्रेस रिकॉर्डिंग पूरी होने के बाद, ट्रेस डेटा APA इंटरफ़ेस में लोड हो जाता है.

  2. एपीए में एसक्यूएल टैब पर क्लिक करें: ट्रेस विश्लेषण स्क्रीन खुली होने पर, यूज़र इंटरफ़ेस (यूआई) के नेविगेशन मेन्यू में, एसक्यूएल टैब पर क्लिक करें. इससे ट्रेस प्रोसेसर एनवायरमेंट खुल जाएगा. यहां डेटा को सीधे तौर पर क्वेरी किया जा सकता है.

  3. नीचे दी गई एसक्यूएल क्वेरी को APA 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(%)) दिखता है.

    स्क्रीन पर, एक्ज़ीक्यूट की गई एसक्यूएल क्वेरी और टेबल में दिखाई गई रेंडरिंग एपीआई मेट्रिक दिख रही हैं

आम तौर पर होने वाली गलतियां

  • SurfaceFlinger से बचें: हमेशा अपने गेम के ऐप्लिकेशन थ्रेड (RenderThread) के हिसाब से खोज करें. SurfaceFlinger जैसे सिस्टम-वाइड कंपोज़िटर प्रोसेस, Vulkan या EGL ट्रैक दिखा सकती हैं. ये ट्रैक, सिस्टम यूज़र इंटरफ़ेस (यूआई) रेंडरिंग को दिखाते हैं, न कि आपके गेम के इंटरनल रेंडरिंग पाइपलाइन को. अपने गेम को अलग करने के लिए, मुख्य एसक्यूएल क्वेरी के WHERE क्लॉज़ में मौजूद वैकल्पिक फ़िल्टर से टिप्पणी हटाएं और 'com.example.mygame' को अपने गेम के पैकेज के नाम से बदलें:

    -- AND p.name = 'com.example.mygame'
    -- AND t.name = 'RenderThread'
    
  • वार्म-अप पीरियड: गेम का मुख्य 3D सीन पूरी तरह लोड हो जाने के बाद ही, हमेशा ट्रेस रिकॉर्ड करें. स्प्लैश स्क्रीन या लोड होने के दौरान ट्रांज़िशन कैप्चर करने से, गलत तरीके से शुरुआत हो सकती है.

LevelUp प्रोग्राम से छूट पाने के लिए, ट्रेस करने से जुड़ी ज़रूरी शर्तें

अगर Google Play Games LevelUp छूट के लिए, Android Performance Analyzer (APA) का इस्तेमाल करके ट्रेस कैप्चर किया जा रहा है, तो ट्रेस के मान्य होने के लिए हार्डवेयर से जुड़ी कुछ खास ज़रूरी शर्तें हैं.

हमारा सुझाव है कि आप टारगेट किए गए Level Up रेफ़रंस डिवाइसों में से किसी एक का इस्तेमाल करके, अपने ट्रेस को कैप्चर करें.

इसके अलावा, सही पुष्टि के लिए, आपका ट्रेस ऐसे डिवाइस पर नहीं लिया जाना चाहिए जो ANGLE GPU का इस्तेमाल करता हो. खास तौर पर, लेवल अप करने की ज़रूरी शर्तों से छूट पाने के लिए, इन डिवाइसों का इस्तेमाल नहीं किया जा सकता:

  • ऐसा कोई भी डिवाइस जिसमें GPU वेंडर SLSI (Samsung) है और जो AMD Xclipse GPU का इस्तेमाल करता है
  • Pixel 11