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

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

এই নির্দেশিকাটি আপনাকে দেখাবে কীভাবে অ্যান্ড্রয়েড পারফরম্যান্স অ্যানালাইজার (APA) এবং কাস্টম পারফেটটো SQL কোয়েরি ব্যবহার করে একটি গেমের সক্রিয় রেন্ডারিং API নিশ্চিতভাবে শনাক্ত করা যায়।

লগ-ভিত্তিক যাচাইকরণের সীমাবদ্ধতা

  • সংক্ষিপ্ত লগ : প্রোডাকশন বিল্ড প্রায়শই ইনিশিয়ালাইজেশন এবং ড্রাইভার-লোডিংয়ের চিহ্নগুলো গোপন করে রাখে।
  • ভুল ইতিবাচক ফলাফল : কিছু গেম ইঞ্জিন চালু হওয়ার সময় ভলকান এবং ওপেনজিএল ইএস উভয় লাইব্রেরিই লোড করে এবং উভয়ের জন্যই ইনিশিয়ালাইজেশন লগ প্রিন্ট করে, এমনকি যদি শেষ পর্যন্ত একটি ব্যর্থ হয়ে ফলব্যাক চালু করে।
  • নীরব ফলব্যাক : ডিভাইস-নির্দিষ্ট ড্রাইভার সমস্যার কারণে যদি ভলকান ইনিশিয়ালাইজেশন ব্যর্থ হয়, তবে ইঞ্জিনগুলো প্রায়শই কোনো গুরুতর ত্রুটি না দেখিয়েই OpenGL ES-এ ফিরে যায়।

APA ব্যবহার করে পরিমাপ করুন

অ্যান্ড্রয়েড পারফরম্যান্স অ্যানালাইজার ব্যবহার করে, আপনি একটি সিস্টেম ট্রেস রেকর্ড করতে পারেন এবং SQL কোয়েরির মাধ্যমে ফ্রেম ডেটা নির্ভুলভাবে বিশ্লেষণ করতে পারেন। আপনার Vulkan এবং GLES-এর ব্যবহার পরিমাপ করতে এই ধাপগুলো অনুসরণ করুন:

  1. APA দিয়ে ট্রেস ক্যাপচার করুন : আপনার গেমটি চালান এবং APA ব্যবহার করে আপনি যে অংশটি বিশ্লেষণ করতে চান, যেমন গেমপ্লের এমন কোনো মুহূর্ত যেখানে আপনার ফ্রেম ড্রপের সন্দেহ হচ্ছে, সেই সময়ে একটি সিস্টেম ট্রেস ক্যাপচার করুন। ডিভাইসটি সংযুক্ত হওয়ার পর এবং ট্রেস রেকর্ডিং সম্পূর্ণ হলে, ট্রেস ডেটা APA ইন্টারফেসে লোড হয়ে যায়।

  2. APA-তে SQL ট্যাবে ক্লিক করুন : যখন ট্রেস অ্যানালাইসিস স্ক্রিনটি খোলা থাকে, তখন UI-এর নেভিগেশন মেনুতে থাকা SQL ট্যাবে ক্লিক করে ট্রেস প্রসেসর এনভায়রনমেন্টটি খুলুন, যেখানে আপনি সরাসরি ডেটা কোয়েরি করতে পারবেন।

  3. নিম্নলিখিত SQL কোয়েরিটি APA 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. কোয়েরিটি চালান : ইনপুট ফিল্ডের কাছে থাকা 'রান কোয়েরি' (Run Query) বোতামে ক্লিক করুন। কোয়েরিটি চলার পর, ফলাফল প্যানেলে একটি টেবিল প্রদর্শিত হবে যেখানে প্রসেসের নাম ( 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'
    
  • ওয়ার্ম-আপ পিরিয়ড : গেমের মূল ৩ডি সিন সম্পূর্ণরূপে লোড হওয়ার পরেই সর্বদা ট্রেস রেকর্ড করুন। স্প্ল্যাশ স্ক্রিন বা লোডিং ট্রানজিশনের সময় ক্যাপচার করলে বিভ্রান্তিকর ইনিশিয়ালাইজেশন হতে পারে।

লেভেলআপ ছাড়ের ট্রেস প্রয়োজনীয়তা

আপনি যদি গুগল প্লে গেমস লেভেলআপ ছাড় পাওয়ার যোগ্যতা অর্জনের জন্য অ্যান্ড্রয়েড পারফরম্যান্স অ্যানালাইজার (এপিএ) ব্যবহার করে ট্রেস ক্যাপচার করেন, তবে সেই ট্রেসটি বৈধ হওয়ার জন্য নির্দিষ্ট হার্ডওয়্যার আবশ্যকতা রয়েছে।

বিশেষভাবে অনুরোধ করা হচ্ছে যে, আপনি নির্ধারিত লেভেল আপ রেফারেন্স ডিভাইসগুলোর মধ্যে যেকোনো একটি ব্যবহার করে আপনার ট্রেসটি ক্যাপচার করুন।

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

  • যেকোনো ডিভাইস, যার জিপিইউ বিক্রেতা হলো এসএলএসআই (স্যামসাং), এবং যেটিতে এএমডি এক্সক্লিপ্স জিপিইউ ব্যবহৃত হয়।
  • পিক্সেল ১১