Vulkan বনাম OpenGL ES গেম রেন্ডারিং API শনাক্ত করুন

Android গেম ডেভেলপ বা অপ্টিমাইজ করার সময়, আপনার ইঞ্জিন কোন গ্রাফিক্স পাইপলাইন ব্যবহার করছে তা বুঝতে পারলে প্রায়ই সুবিধা হয়; ডেভেলপার-অ্যাক্সেসযোগ্য সিগন্যাল স্পষ্টভাবে না থাকলেও, ইঞ্জিন Vulkan বা GLES বেছে নিতে পারে। দুর্ভাগ্যবশত, এমন কিছু পরিস্থিতি আছে যেখানে কোনও গেম Vulkan-এ চলছে নাকি OpenGL ES-এ ফিরে গেছে তা যাচাই করার জন্য logcat-এর উপর নির্ভর করা নির্ভরযোগ্য নাও হতে পারে।

এই নির্দেশিকা থেকে আপনি জানতে পারবেন কীভাবে 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. APA-তে SQL ট্যাবে ক্লিক করুন: ট্রেস বিশ্লেষণ স্ক্রিন খোলা থাকলে, UI-এর নেভিগেশন মেনুতে, ট্রেস প্রসেসর এনভায়রনমেন্ট খুলতে SQL ট্যাবে ক্লিক করুন, যেখানে আপনি সরাসরি ডেটা কোয়েরি করতে পারবেন।

  3. APA SQL ট্যাবে নিম্নলিখিত SQL কোয়েরি পেস্ট করুন: নিম্নলিখিত SQL কোয়েরি কপি করে কোয়েরি ইনপুট ফিল্ডে পেস্ট করুন। এই কোয়েরি, eglSwapBuffers, QueuePresentKHR ও vkQueuePresentKHR-এর মতো ড্রয়িং API ইভেন্টের জন্য ট্রেস স্ক্যান করে। এটি প্রসেসের নাম অনুযায়ী সেগুলিকে গ্রুপ করে এবং রেন্ডারিং 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 ট্র্যাক দেখাতে পারে যা সিস্টেম UI রেন্ডারিং দেখায়, আপনার গেমের ইন্টার্নাল রেন্ডারিং পাইপলাইন নয়। আপনার গেম আলাদা করতে, মূল SQL কোয়েরির WHERE ক্লজে ঐচ্ছিক ফিল্টার আনকমেন্ট করুন এবং 'com.example.mygame'-এর জায়গায় আপনার গেমের প্যাকেজের নাম লিখুন:

    -- AND p.name = 'com.example.mygame'
    -- AND t.name = 'RenderThread'
    
  • ওয়ার্ম-আপ পিরিয়ড: গেমের প্রধান 3D দৃশ্য সম্পূর্ণ লোড হওয়ার পরে সবসময় ট্রেস রেকর্ড করুন। স্প্ল্যাশ স্ক্রিন বা লোডিং ট্রানজিশনের সময় ক্যাপচার করলে ভুল ইনিশিয়ালাইজেশন হতে পারে।

LevelUp Exemption Trace সংক্রান্ত প্রয়োজনীয়তা

আপনি যদি Google Play Games LevelUp ছাড়ের জন্য উপযুক্ত হতে ট্রেস ক্যাপচার করতে Android Performance Analyzer (APA) ব্যবহার করেন, তাহলে ট্রেসটি বৈধ হওয়ার জন্য নির্দিষ্ট হার্ডওয়্যার প্রয়োজনীয়তা রয়েছে।

এটি অত্যন্ত বাঞ্ছনীয় যে আপনি টার্গেট করা লেভেল আপ রেফারেন্স ডিভাইস-এর মধ্যে একটি ব্যবহার করে আপনার ট্রেস ক্যাপচার করুন।

এছাড়াও, সঠিক যাচাইকরণ নিশ্চিত করতে, ANGLE GPU ব্যবহার করে এমন ডিভাইসে আপনার ট্রেস নেওয়া যাবে না। বিশেষ করে, আপনার LevelUp ছাড় ট্রেস ক্যাপচার করতে নিম্নলিখিত ডিভাইসগুলি ব্যবহার করতে পারবেন না:

  • এমন যেকোনও ডিভাইস যেখানে GPU ভেন্ডর হল SLSI (Samsung), যা AMD Xclipse GPU ব্যবহার করে
  • Pixel 11