সিস্টেম ট্রেসিং কনফিগার করা

আপনি অল্প সময়ের মধ্যে আপনার অ্যাপের CPU ও থ্রেড প্রোফাইল ক্যাপচার করতে সিস্টেম ট্রেসিং কনফিগার করতে পারবেন। তারপরে সিস্টেম ট্রেস থেকে পাওয়া আউটপুট রিপোর্ট ব্যবহার করে আপনার গেমের পারফর্ম্যান্স উন্নত করতে পারবেন।

গেম-ভিত্তিক সিস্টেম ট্রেস সেট-আপ করা

Systrace টুল দুটি উপায়ে উপলভ্য:

Systrace হল একটি লো-লেভেল টুল যা:

  • বাস্তবিক সত্য প্রদান করে। Systrace সরাসরি কার্নেল থেকে আউটপুট ক্যাপচার করে, তাই এটি যে মেট্রিক ক্যাপচার করে তা প্রায় সেইসব মেট্রিকের মতোই যেগুলি সিস্টেম কলের একটি সিরিজ রিপোর্ট করে।
  • কম রিসোর্স ব্যবহার করে। Systrace, ডিভাইসে খুব কম ওভারহেড যোগ করে। এটি সাধারণত ১%-এর কম হয়, কারণ এটি ইন-মেমরি বাফারে ডেটা স্ট্রিম করে।

অপ্টিমাল সেটিংস

টুলটিকে যুক্তিসঙ্গত আর্গুমেন্টের সেট দেওয়া গুরুত্বপূর্ণ:

  • বিভাগ: গেম-ভিত্তিক সিস্টেমের জন্য চালু করার সেরা বিভাগ ট্রেস হল: {sched, freq, idle, am, wm, gfx, view, sync, binder_driver, hal, dalvik}।
  • বাফার সাইজ: সাধারণ নিয়ম হল, প্রতি CPU কোরে ১০ এমবি বাফার সাইজ প্রায় ২০ সেকেন্ডের ট্রেস করার অনুমতি দেয়। যেমন, কোনও ডিভাইসে দুটি কোয়াড-কোর সিপিইউ (মোট ৮টি কোর) থাকলে, systrace প্রোগ্রামে পাস করার জন্য উপযুক্ত মান হল ৮০,০০০ কেবি (৮০ এমবি)।

    আপনার গেম যদি প্রচুর পরিমাণে কনটেক্সট-সুইচিং করে, তাহলে প্রতিটি সিপিইউ কোরের জন্য বাফার ১৫ এমবিতে বাড়ান।

  • কাস্টম ইভেন্ট: আপনার গেমে ক্যাপচার করার জন্য কাস্টম ইভেন্ট সংজ্ঞায়িত করলে, -a ফ্ল্যাগ চালু করুন, যা Systrace-কে আউটপুট রিপোর্টে এইসব কাস্টম ইভেন্ট অন্তর্ভুক্ত করতে দেয়।

আপনি systrace কমান্ড-লাইন প্রোগ্রাম ব্যবহার করলে, সিস্টেম ট্রেস ক্যাপচার করতে নিচের কমান্ড ব্যবহার করুন যা ক্যাটেগরি সেট, বাফার সাইজ ও কাস্টম ইভেন্টের জন্য পেশাদার পদ্ধতি প্রয়োগ করে:

python systrace.py -a com.example.myapp -b 80000 -o my_systrace_report.html \
  sched freq idle am wm gfx view sync binder_driver hal dalvik

আপনি কোনও ডিভাইসে Systrace সিস্টেম অ্যাপ ব্যবহার করলে, বিভাগ সেট, বাফার সাইজ ও কাস্টম ইভেন্টের জন্য পেশাদার পদ্ধতি প্রয়োগ করে এমন সিস্টেম ট্রেস ক্যাপচার করতে, নিচে উল্লেখ করা ধাপগুলি সম্পূর্ণ করুন:

  1. ডিবাগ করা যায় এমন অ্যাপ্লিকেশন ট্রেস করুন বিকল্প চালু করুন।

    এই সেটিং ব্যবহার করতে হলে, ডিভাইসে ২৫৬ এমবি বা ৫১২ এমবি জায়গা থাকতে হবে (এটি নির্ভর করে সিপিইউতে ৪টি বা ৮টি কোর আছে কিনা তার উপর) এবং ৬৪ এমবির প্রতিটি মেমরিকে একটানা জায়গা হিসেবে উপলভ্য থাকতে হবে।

  2. বিভাগ বেছে নিন, তারপর নিম্নলিখিত তালিকা থেকে বিভাগ চালু করুন:

    • am: অ্যাক্টিভিটি ম্যানেজার
    • binder_driver: Binder Kernel ড্রাইভার
    • dalvik: Dalvik VM
    • freq: CPU ফ্রিকোয়েন্সি
    • gfx: গ্রাফিক্স
    • hal: হার্ডওয়্যার মডিউল
    • idle: সিপিইউ নিষ্ক্রিয়
    • sched: সিপিইউ শিডিউলিং
    • sync: সিঙ্ক্রোনাইজেশন
    • view: সিস্টেম দেখুন
    • wm: উইন্ডো ম্যানেজার
  3. রেকর্ড ট্রেসিং চালু করুন।

  4. আপনার গেম লোড করুন।

  5. আপনি যে গেমপ্লেটির ডিভাইস পারফর্ম্যান্স পরিমাপ করতে চান, সেই গেমের সাথে সম্পর্কিত ইন্টার‍্যাকশনগুলি পারফর্ম করুন।

  6. আপনার গেমে অবাঞ্ছিত আচরণ দেখতে পাওয়ার কিছুক্ষণের মধ্যেই, সিস্টেম ট্রেসিং বন্ধ করে দিন।

সমস্যাটি আরও বিশ্লেষণ করার জন্য প্রয়োজনীয় পারফর্ম্যান্স পরিসংখ্যান আপনি ক্যাপচার করেছেন।

ডিস্ক স্পেস সেভ করতে, অন-ডিভাইস সিস্টেম ট্রেস, কম্প্রেস করা ট্রেস ফরম্যাটে (*.ctrace) ফাইল সেভ করে। রিপোর্ট তৈরি করার সময় এই ফাইল আনকম্প্রেস করতে, কমান্ড-লাইন প্রোগ্রাম ব্যবহার করুন এবং --from-file বিকল্প অন্তর্ভুক্ত করুন:

python systrace.py --from-file=/data/local/traces/my_game_trace.ctrace \
  -o my_systrace_report.html

পারফর্ম্যান্সের নির্দিষ্ট ক্ষেত্র উন্নত করা

এই বিভাগে মোবাইল গেমে পারফর্ম্যান্স সংক্রান্ত বিভিন্ন সাধারণ সমস্যা তুলে ধরা হয়েছে এবং আপনার গেমের এইসব দিক কীভাবে শনাক্ত ও উন্নত করবেন তা বর্ণনা করা হয়েছে।

লোডিং স্পিড

খেলোয়াড়রা যত তাড়াতাড়ি সম্ভব আপনার গেমের অ্যাকশনে প্রবেশ করতে চান, তাই আপনার গেমের লোড টাইম যতটা সম্ভব উন্নত করা গুরুত্বপূর্ণ। নিম্নলিখিত পদক্ষেপগুলি সাধারণত লোড টাইম কমাতে সাহায্য করে:

  • ধীরে ধীরে লোড করা পারফর্ম করুন। আপনার গেমের পরপর দৃশ্য বা লেভেলে একই অ্যাসেট ব্যবহার করলে, এই অ্যাসেটগুলি একবারই লোড করুন।
  • আপনার অ্যাসেটের সাইজ কমান। এইভাবে, আপনার গেমের APK-এর সাথে এইসব অ্যাসেটের আনকমপ্রেসড ভার্সন বান্ডেল করতে পারবেন।
  • ডিস্ক-সাশ্রয়ী কম্প্রেসন পদ্ধতি ব্যবহার করুন। এই ধরনের পদ্ধতির একটি উদাহরণ হল zlib.
  • mono-এর পরিবর্তে IL2CPP ব্যবহার করুন। (আপনি Unity ব্যবহার করলে তবেই প্রযোজ্য হবে।) IL2CPP আপনার C# স্ক্রিপ্টের জন্য আরও ভালো এক্সিকিউশন পারফর্ম্যান্স প্রদান করে।
  • আপনার গেমকে মাল্টিথ্রেডেড করুন। আরও বিবরণের জন্য, ফ্রেমরেট কনসিস্টেন্সি বিভাগ দেখুন।

ফ্রেমরেট কনসিসটেন্সি

গেমপ্লে অভিজ্ঞতার সবচেয়ে গুরুত্বপূর্ণ বিষয়গুলির মধ্যে একটি হল ধারাবাহিক ফ্রেমরেট পাওয়া। এই লক্ষ্য সহজে অর্জন করতে, এই বিভাগে আলোচনা করা অপ্টিমাইজেশন টেকনিক অনুসরণ করুন।

মাল্টিথ্রেডিং

একাধিক প্ল্যাটফর্মের জন্য ডেভেলপ করার সময়, আপনার গেমের মধ্যে সমস্ত অ্যাক্টিভিটি একটি থ্রেডে রাখা স্বাভাবিক। যদিও এই পদ্ধতিটি অনেক গেম ইঞ্জিনে প্রয়োগ করা সহজ কিন্তু Android ডিভাইসে রান করানোর সময় এটি অপ্টিমাল হয় না। এর ফলে, সিঙ্গেল-থ্রেডেড গেমগুলি প্রায়ই ধীরে ধীরে লোড হয় এবং সেগুলিতে ধারাবাহিক ফ্রেমরেট থাকে না।

১ নম্বর ছবিতে দেখানো Systrace এমন আচরণ দেখায় যা কোনও গেমের ক্ষেত্রে সাধারণ এবং যা একবারে শুধুমাত্র একটি CPU-তে চলে:

সিস্টেম ট্রেসের মধ্যে থ্রেডের ডায়াগ্রাম

ছবি ১. সিঙ্গেল-থ্রেডেড গেমের জন্য Systrace রিপোর্ট

আপনার গেমের পারফর্ম্যান্স উন্নত করতে, আপনার গেমকে মাল্টিথ্রেডেড করুন। সাধারণত, সবচেয়ে ভালো মডেল হল ২টি থ্রেড থাকা:

  • গেম থ্রেড, যার মধ্যে আপনার গেমের মূল মডিউল থাকে এবং রেন্ডার কমান্ড পাঠায়।
  • একটি রেন্ডার থ্রেড, যা রেন্ডার কমান্ড পায় এবং সেগুলিকে গ্রাফিক্স কমান্ডে ট্রান্সলেট করে, যা কোনও ডিভাইসের GPU কোনও দৃশ্য ডিসপ্লে করতে ব্যবহার করতে পারে।

Vulkan API এই মডেলের উপর ভিত্তি করে তৈরি করা হয়েছে, কারণ এটি একসাথে ২টি সাধারণ বাফার পুশ করতে পারে। এই ফিচার ব্যবহার করে, আপনি একাধিক CPU জুড়ে একাধিক রেন্ডার থ্রেড ডিস্ট্রিবিউট করতে পারবেন, যা কোনও দৃশ্যের রেন্ডারিং টাইম আরও উন্নত করে।

এছাড়াও, আপনার গেমের মাল্টিথ্রেডিং পারফর্ম্যান্স উন্নত করতে, আপনি ইঞ্জিন-নির্দিষ্ট কিছু পরিবর্তন করতে পারেন:

  • আপনি Unity গেম ইঞ্জিন ব্যবহার করে গেম ডেভেলপ করলে, মাল্টিথ্রেডেড রেন্ডারিং ও GPU স্কিনিং বিকল্প চালু করুন।
  • আপনি কাস্টম রেন্ডারিং ইঞ্জিন ব্যবহার করলে, রেন্ডার কমান্ড পাইপলাইন এবং গ্রাফিক্স কমান্ড পাইপলাইন সঠিকভাবে অ্যালাইন করা আছে কিনা তা নিশ্চিত করুন; তা না হলে, আপনার গেমের দৃশ্য দেখাতে দেরি হতে পারে।

এইসব পরিবর্তন প্রয়োগ করার পরে, আপনাকে দেখতে হবে যে আপনার গেমটি একই সাথে অন্তত ২টি CPU ব্যবহার করছে, যেমনটি ২ নম্বর ছবিতে দেখানো হয়েছে:

সিস্টেম ট্রেসের মধ্যে থ্রেডের ডায়াগ্রাম

ছবি ২. মাল্টি-থ্রেডেড গেমের জন্য Systrace রিপোর্ট

UI এলিমেন্ট লোড হচ্ছে

সিস্টেম ট্রেসের মধ্যে ফ্রেম
  স্ট্যাকের ডায়াগ্রাম
ছবি ৩. একই সাথে অসংখ্য UI এলিমেন্ট রেন্ডার করছে এমন কোনও গেমের জন্য Systrace রিপোর্ট

ফিচার-সমৃদ্ধ গেম তৈরি করার সময়, একই সাথে প্লেয়ারকে অনেক আলাদা আলাদা বিকল্প ও অ্যাকশন দেখাতে ইচ্ছে করে। তবে, ফ্রেমরেট যাতে একই থাকে, তার জন্য মোবাইল ডিসপ্লের তুলনামূলক ছোট সাইজের কথা মাথায় রাখা এবং UI যতটা সম্ভব সহজ রাখা গুরুত্বপূর্ণ।

ছবি ৩-এ দেখানো Systrace রিপোর্ট হল UI ফ্রেমের একটি উদাহরণ যা মোবাইল ডিভাইসের ক্ষমতার তুলনায় অনেক বেশি এলিমেন্ট রেন্ডার করার চেষ্টা করছে।

UI আপডেট করার সময় ২-৩ মিলিসেকেন্ডে কমিয়ে আনা হল একটি ভালো লক্ষ্য। আপনি নিচে উল্লেখ করা অপ্টিমাইজেশনের মতো অপ্টিমাইজেশন করে এই ধরনের দ্রুত আপডেট পেতে পারেন:

  • স্ক্রিনে যেসব এলিমেন্ট সরে গেছে শুধু সেগুলিই আপডেট করুন।
  • UI টেক্সচার ও লেয়ারের সংখ্যা সীমিত করুন। একই মেটেরিয়াল ব্যবহার করে এমন গ্রাফিক্স কল, যেমন শেডার ও টেক্সচার একত্রিত করার কথা বিবেচনা করুন।
  • GPU-তে এলিমেন্ট অ্যানিমেশন অপারেশন ডিফার করুন।
  • আরও বেশি আগ্রাসী ফ্রাস্টাম ও অক্লুশন কালিং পারফর্ম করা।
  • সম্ভব হলে, Vulkan API ব্যবহার করে ড্র অপারেশন পারফর্ম করুন। Vulkan-এ ড্র কল ওভারহেড কম হয়।

বিদ্যুৎ খরচ

আগের বিভাগে আলোচনা করা অপ্টিমাইজেশন করার পরেও, আপনি হয়ত দেখবেন যে গেমপ্লে শুরু হওয়ার প্রথম ৪৫-৫০ মিনিটের মধ্যেই আপনার গেমের ফ্রেমরেট খারাপ হয়ে যাচ্ছে। এছাড়াও, ডিভাইসটি গরম হতে শুরু করতে পারে এবং সময়ের সাথে সাথে আরও বেশি ব্যাটারি খরচ করতে পারে।

অনেক ক্ষেত্রে, এই অবাঞ্ছিত থার্মাল ও পাওয়ার কনজাম্পশন আপনার ডিভাইসের সিপিইউ জুড়ে গেমের ওয়ার্কলোড কীভাবে ডিস্ট্রিবিউট করা হয় তার সাথে সম্পর্কিত। আপনার গেমের বিদ্যুৎ খরচ সংক্রান্ত দক্ষতা বাড়াতে, নিম্নলিখিত বিভাগে দেখানো পেশাদার পদ্ধতি প্রয়োগ করুন।

একটি সিপিইউতে মেমরি-ইনটেনসিভ থ্রেড রাখা

অনেক মোবাইল ডিভাইসে, L1 ক্যাশে নির্দিষ্ট CPU-তে থাকে এবং L2 ক্যাশে CPU-এর সেটে থাকে যা ক্লক শেয়ার করে। L1 ক্যাশে হিট সর্বাধিক করতে, আপনার গেমের মূল থ্রেড এবং মেমরি-ইনটেনসিভ থ্রেডগুলি সাধারণত একটি সিপিইউতে চালানো ভাল।

কম পাওয়ারের সিপিইউতে স্বল্প-সময়ের কাজগুলি ডিফার করা

Unity সহ বেশিরভাগ গেম ইঞ্জিন, আপনার গেমের মূল থ্রেডের তুলনায় অন্য সিপিইউতে ওয়ার্কার থ্রেড অপারেশন ডিফার করতে জানে। তবে, ইঞ্জিনটি ডিভাইসের নির্দিষ্ট আর্কিটেকচার সম্পর্কে সচেতন নয় এবং আপনার গেমের ওয়ার্কলোডও আপনার মতো অনুমান করতে পারে না।

বেশিরভাগ সিস্টেম-অন-এ-চিপ ডিভাইসে কমপক্ষে ২টি শেয়ার করা ক্লক থাকে, একটি ডিভাইসের দ্রুত CPU-এর জন্য এবং একটি ডিভাইসের ধীর CPU-এর জন্য। এই আর্কিটেকচারের একটি ফলাফল হল, একটি দ্রুত CPU যদি সর্বাধিক স্পিডে কাজ করতে চায়, তাহলে অন্যান্য সব দ্রুত CPU-কেও সর্বাধিক স্পিডে কাজ করতে হবে।

৪ নম্বর চিত্রে দেখানো উদাহরণ রিপোর্ট থেকে বোঝা যায় যে গেমটি দ্রুত CPU-এর সুবিধা নেয়। তবে, এই উচ্চ অ্যাক্টিভিটি লেভেল খুব দ্রুত প্রচুর শক্তি ও তাপ উৎপন্ন করে।

সিস্টেম ট্রেসের মধ্যে থ্রেডের ডায়াগ্রাম

ছবি ৪. Systrace রিপোর্টে ডিভাইসের CPU-তে থ্রেড অ্যাসাইনমেন্ট অপ্টিমাল নয় বলে দেখানো হয়েছে

বিদ্যুৎ ব্যবহার কমানোর জন্য, শিডিউলারকে সাজেস্ট করা ভাল যে কম সময়ের কাজ—যেমন, অডিও লোড করা, ওয়ার্কার থ্রেড চালানো এবং কোরিওগ্রাফার এক্সিকিউট করা—ডিভাইসে স্লো CPU-এর সেটে ডিফার করা হোক। কাঙ্ক্ষিত ফ্রেমরেট বজায় রেখে, এই কাজ যতটা সম্ভব ধীর গতির CPU-তে ট্রান্সফার করুন।

বেশিরভাগ ডিভাইস দ্রুত সিপিইউ-এর আগে ধীরে কাজ করা সিপিইউ তালিকাভুক্ত করে, তবে আপনি এটি ধরে নিতে পারেন না যে আপনার ডিভাইসের SOC এই ক্রম ব্যবহার করে। এটি চেক করতে, GitHub-এ দেখানো CPU টপোলজি ডিসকভারি কোডের মতো কমান্ড রান করুন।

আপনার ডিভাইসে কোন CPU ধীরে কাজ করছে তা জানার পরে, আপনি স্বল্প-মেয়াদী থ্রেডের জন্য অ্যাফিনিটি ঘোষণা করতে পারবেন, যা ডিভাইসের শিডিউলার অনুসরণ করে। এটি করতে, প্রতিটি থ্রেডের মধ্যে নিম্নলিখিত কোড যোগ করুন:

#include <sched.h>
#include <sys/types.h>
#include <unistd.h>

pid_t my_pid; // PID of the process containing your thread.

// Assumes that cpu0, cpu1, cpu2, and cpu3 are the "slow CPUs".
cpu_set_t my_cpu_set;
CPU_ZERO(&my_cpu_set);
CPU_SET(0, &my_cpu_set);
CPU_SET(1, &my_cpu_set);
CPU_SET(2, &my_cpu_set);
CPU_SET(3, &my_cpu_set);
sched_setaffinity(my_pid, sizeof(cpu_set_t), &my_cpu_set);

থার্মাল স্ট্রেস

ডিভাইস খুব গরম হয়ে গেলে, সিপিইউ এবং/অথবা জিপিইউ থ্রটল করতে পারে এবং এর ফলে গেমের উপর অপ্রত্যাশিত প্রভাব পড়তে পারে। যেসব গেমে জটিল গ্রাফিক্স, অনেক বেশি কম্পিউটেশন বা দীর্ঘস্থায়ী নেটওয়ার্ক অ্যাক্টিভিটি থাকে, সেগুলিতে সমস্যা হওয়ার সম্ভাবনা বেশি।

ডিভাইসের তাপমাত্রার পরিবর্তন মনিটর করতে এবং কম পাওয়ার ব্যবহার ও ডিভাইসকে তুলনামূলক ঠান্ডা রাখার জন্য ব্যবস্থা নিতে থার্মাল API ব্যবহার করুন। ডিভাইস অতিরিক্ত গরম হয়ে যাওয়ার কথা জানালে, বিদ্যুৎ ব্যবহার কমাতে, চলমান অ্যাক্টিভিটি বন্ধ করে দিন। যেমন, ফ্রেম রেট বা পলিগন টেসেলেশন কমানো।

প্রথমে, PowerManager অবজেক্ট ঘোষণা করুন এবং onCreate() পদ্ধতিতে এটি ইনিশিয়ালাইজ করুন। অবজেক্টে থার্মাল স্ট্যাটাস লিসনার যোগ করুন।

Kotlin

class MainActivity : AppCompatActivity() {
    lateinit var powerManager: PowerManager

    override fun onCreate(savedInstanceState: Bundle?) {
        powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
        powerManager.addThermalStatusListener(thermalListener)
    }
}

জাভা

public class MainActivity extends AppCompatActivity {
    PowerManager powerManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        powerManager.addThermalStatusListener(thermalListener);
    }
}

লিসনার কোনও স্ট্যাটাস পরিবর্তন শনাক্ত করলে কী অ্যাকশন নিতে হবে তা নির্ধারণ করুন। আপনার গেম C/C++ ব্যবহার করলে, onThermalStatusChanged() থেকে JNI ব্যবহার করে আপনার নেটিভ গেম কোডে কল করুন অথবা নেটিভ Thermal API ব্যবহার করুন।

Kotlin

val thermalListener = object : PowerManager.OnThermalStatusChangedListener() {
    override fun onThermalStatusChanged(status: Int) {
        when (status) {
            PowerManager.THERMAL_STATUS_NONE -> {
                // No thermal status, so no action necessary
            }

            PowerManager.THERMAL_STATUS_LIGHT -> {
                // Add code to handle light thermal increase
            }

            PowerManager.THERMAL_STATUS_MODERATE -> {
                // Add code to handle moderate thermal increase
            }

            PowerManager.THERMAL_STATUS_SEVERE -> {
                // Add code to handle severe thermal increase
            }

            PowerManager.THERMAL_STATUS_CRITICAL -> {
                // Add code to handle critical thermal increase
            }

            PowerManager.THERMAL_STATUS_EMERGENCY -> {
                // Add code to handle emergency thermal increase
            }

            PowerManager.THERMAL_STATUS_SHUTDOWN -> {
                // Add code to handle immediate shutdown
            }
        }
    }
}

জাভা

PowerManager.OnThermalStatusChangedListener thermalListener =
    new PowerManager.OnThermalStatusChangedListener () {

    @Override
    public void onThermalStatusChanged(int status) {

        switch (status)
        {
            case PowerManager.THERMAL_STATUS_NONE:
                // No thermal status, so no action necessary
                break;

            case PowerManager.THERMAL_STATUS_LIGHT:
                // Add code to handle light thermal increase
                break;

            case PowerManager.THERMAL_STATUS_MODERATE:
                // Add code to handle moderate thermal increase
                break;

            case PowerManager.THERMAL_STATUS_SEVERE:
                // Add code to handle severe thermal increase
                break;

            case PowerManager.THERMAL_STATUS_CRITICAL:
                // Add code to handle critical thermal increase
                break;

            case PowerManager.THERMAL_STATUS_EMERGENCY:
                // Add code to handle emergency thermal increase
                break;

            case PowerManager.THERMAL_STATUS_SHUTDOWN:
                // Add code to handle immediate shutdown
                break;
        }
    }
};

টাচ-টু-ডিসপ্লে লেটেন্সি

যেসব গেম যত দ্রুত সম্ভব ফ্রেম রেন্ডার করে, সেগুলি GPU-বাউন্ড পরিস্থিতি তৈরি করে, যেখানে ফ্রেম বাফার ওভারস্টাফড হয়ে যায়। CPU-কে GPU-এর জন্য অপেক্ষা করতে হয়, এর ফলে প্লেয়ারের ইনপুট ও স্ক্রিনে ইনপুট কার্যকর হওয়ার মধ্যে লক্ষণীয় বিলম্ব ঘটে।

আপনার গেমের ফ্রেম পেসিং উন্নত করতে পারবেন কিনা তা নির্ধারণ করতে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

  1. gfx ও input বিভাগ সহ Systrace রিপোর্ট তৈরি করুন। এইসব বিভাগে টাচ-টু-ডিসপ্লে ল্যাটেন্সি নির্ধারণ করার জন্য বিশেষভাবে উপযোগী পরিমাপ অন্তর্ভুক্ত থাকে।
  2. Systrace রিপোর্টের SurfaceView বিভাগ চেক করুন। অতিরিক্ত বাফার পেন্ডিং বাফার ড্রয়ের সংখ্যাকে ১ থেকে ২-এর মধ্যে ওঠানামা করায়, যেমনটি ছবি ৫-এ দেখানো হয়েছে:

    সিস্টেম ট্রেসের মধ্যে
বাফার কিউয়ের ডায়াগ্রাম

    ছবি ৫. Systrace রিপোর্টে দেখা যাচ্ছে যে ওভারস্টাফড বাফারটি ড্রয়িং কমান্ড গ্রহণ করার জন্য মাঝে মাঝে খুব বেশি পূর্ণ হয়ে যায়

ফ্রেম পেসিংয়ে এই অসঙ্গতি কমাতে, নিম্নলিখিত বিভাগে বর্ণিত অ্যাকশন সম্পূর্ণ করুন:

আপনার গেমে Android Frame Pacing API ইন্টিগ্রেট করা

Android Frame Pacing API আপনাকে ফ্রেম অদল-বদল করতে এবং অদল-বদল করার ইন্টারভ্যাল নির্ধারণ করতে সাহায্য করে, যাতে আপনার গেম আরও ধারাবাহিক ফ্রেমরেট বজায় রাখতে পারে।

আপনার গেমের UI নয় এমন অ্যাসেটের রেজোলিউশন কমানো

আধুনিক মোবাইল ডিভাইসের ডিসপ্লেতে প্লেয়ারের প্রসেস করতে পারার তুলনায় অনেক বেশি পিক্সেল থাকে, তাই ৫টি বা এমনকি ১০টি পিক্সেলও যাতে একটি রঙ ধারণ করে, সেইভাবে ডাউনস্যাম্পেল করলে কোনও সমস্যা নেই। বেশিরভাগ ডিসপ্লে ক্যাশের গঠন অনুযায়ী, কোনও একটি ডাইমেনশন বরাবর রেজোলিউশন কমালে সবচেয়ে ভালো হয়।

তবে, আপনার গেমের UI এলিমেন্টের রেজোলিউশন কমাবেন না। আপনার সব প্লেয়ারের জন্য যথেষ্ট বড় টাচ টার্গেট সাইজ বজায় রাখতে এইসব এলিমেন্টে লাইনের পুরুত্ব বজায় রাখা গুরুত্বপূর্ণ।

রেন্ডারিংয়ের মসৃণতা

আপনার গেমে কোনও দৃশ্য দেখানোর জন্য SurfaceFlinger ডিসপ্লে বাফারে ল্যাচ করলে, CPU অ্যাক্টিভিটি সাময়িকভাবে বেড়ে যায়। CPU অ্যাক্টিভিটিতে এই ধরনের স্পাইক অনিয়মিতভাবে হলে, আপনার গেমে স্টাটারিং দেখা যেতে পারে। ছবি ৬-এ এই ঘটনা কেন ঘটে তার কারণ দেখানো হয়েছে:

ফ্রেমের ডায়াগ্রাম
Vsync উইন্ডো নেই কারণ সেগুলি খুব দেরিতে ড্র করা শুরু হয়েছে

ছবি ৬. Systrace রিপোর্টে দেখানো হয়েছে কীভাবে কোনও ফ্রেম Vsync মিস করতে পারে

কোনও ফ্রেম আঁকা শুরু করতে কয়েক মিলি সেকেন্ড দেরি হয়ে গেলেও, সেটি পরের ডিসপ্লে উইন্ডো মিস করতে পারে। ফ্রেমটিকে তারপর পরবর্তী Vsync না হওয়া পর্যন্ত অপেক্ষা করতে হবে, যাতে সেটি ডিসপ্লে করা যায় (৩০ FPS-এ গেম চালানোর সময় ৩৩ মিলিসেকেন্ড), এর ফলে প্লেয়ারের দৃষ্টিকোণ থেকে উল্লেখযোগ্য বিলম্ব হয়।

এই পরিস্থিতি সামাল দিতে, Android Frame Pacing API ব্যবহার করুন, যা সবসময় VSync ওয়েভফ্রন্টে একটি নতুন ফ্রেম দেখায়।

মেমরি স্থিতি

দীর্ঘ সময় ধরে গেম চালালে, ডিভাইসে মেমরি সংক্রান্ত সমস্যা হতে পারে।

এই পরিস্থিতিতে, Systrace রিপোর্টে CPU অ্যাক্টিভিটি চেক করুন এবং দেখুন যে কত ঘন ঘন সিস্টেম kswapd ডেমনে কল করছে। গেম চলাকালীন অনেক কল আসলে, আপনার গেম কীভাবে মেমরি ম্যানেজ ও ক্লিন-আপ করছে তা ভালোভাবে দেখে নেওয়া ভালো।

আরও তথ্যের জন্য, মেমরি ম্যানেজমেন্ট সম্পর্কে দেখুন।

থ্রেডের স্ট্যাটাস

Systrace রিপোর্টের সাধারণ এলিমেন্টগুলির মধ্যে নেভিগেট করার সময়, আপনি রিপোর্টের মধ্যে থ্রেড বেছে নিয়ে, প্রতিটি সম্ভাব্য থ্রেড স্টেটে কোনও নির্দিষ্ট থ্রেড কতক্ষণ ধরে ছিল তা দেখতে পাবেন, যেমনটি ৭ নম্বর ছবিতে দেখানো হয়েছে:

Systrace রিপোর্টের
ডায়াগ্রাম

ছবি ৭. Systrace রিপোর্টে দেখানো হয়েছে যে কীভাবে থ্রেড বেছে নিলে রিপোর্টে সেই থ্রেডের জন্য স্টেট সামারি দেখানো হয়

Figure 7-এ দেখানো হয়েছে, আপনি হয়ত দেখবেন যে আপনার গেমের থ্রেডগুলি যতটা ঘনঘন "রানিং" বা "রান করার উপযুক্ত" অবস্থায় থাকার কথা, ততটা ঘনঘন থাকছে না। নিচে দেওয়া তালিকায় বেশ কিছু সাধারণ কারণ দেখানো হয়েছে, যার জন্য কোনও থ্রেড হয়ত মাঝে মাঝে অস্বাভাবিক অবস্থায় চলে যাচ্ছে:

  • কোনও থ্রেড দীর্ঘ সময় ধরে স্লিপিং অবস্থায় থাকলে, সেটি লক কনটেনশন বা GPU অ্যাক্টিভিটির জন্য অপেক্ষা করার কারণে সমস্যা হতে পারে।
  • কোনও থ্রেড যদি ক্রমাগত I/O-তে ব্লক করা থাকে, তাহলে আপনি হয় একসাথে ডিস্ক থেকে খুব বেশি ডেটা পড়ছেন, অথবা আপনার গেম থ্র্যাশিং করছে।

অতিরিক্ত রিসোর্স

আপনার গেমের পারফর্ম্যান্স উন্নত করা সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্স দেখুন:

ভিডিও