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

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

একটি গেম-ভিত্তিক সিস্টেম ট্রেস সেট আপ করুন

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

সিস্ট্রেস একটি নিম্ন-স্তরের সরঞ্জাম যা:

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

সর্বোত্তম সেটিংস

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

  • বিভাগগুলি: একটি গেম-ভিত্তিক সিস্টেম ট্রেসের জন্য সক্ষম করার জন্য সর্বোত্তম বিভাগগুলি হল: { sched , freq , idle , am , wm , gfx , view , sync , binder_driver , hal , dalvik }৷
  • বাফার আকার: একটি সাধারণ নিয়ম হল প্রতি CPU কোর 10 MB এর একটি বাফার আকার প্রায় 20 সেকেন্ড দীর্ঘ একটি ট্রেস করার অনুমতি দেয়। উদাহরণস্বরূপ, যদি একটি ডিভাইসে দুটি কোয়াড-কোর CPU থাকে (মোট 8 কোর), systrace প্রোগ্রামে পাস করার জন্য একটি উপযুক্ত মান হল 80,000 KB (80 MB)।

    যদি আপনার গেমটি প্রসঙ্গ-সুইচিংয়ের একটি দুর্দান্ত চুক্তি করে, বাফারটি প্রতি CPU কোরে 15 MB পর্যন্ত বাড়িয়ে দিন।

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

আপনি যদি 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. ট্রেস ডিবাগযোগ্য অ্যাপ্লিকেশন বিকল্পটি সক্ষম করুন।

    এই সেটিংটি ব্যবহার করার জন্য, ডিভাইসটিতে অবশ্যই 256 MB বা 512 MB উপলব্ধ থাকতে হবে (CPU-তে 4 বা 8 কোর আছে কিনা তার উপর নির্ভর করে), এবং প্রতিটি 64-MB মেমরি একটি সংলগ্ন অংশ হিসাবে উপলব্ধ থাকতে হবে।

  2. বিভাগগুলি চয়ন করুন, তারপর নিম্নলিখিত তালিকায় বিভাগগুলি সক্ষম করুন:

    • am : অ্যাক্টিভিটি ম্যানেজার
    • binder_driver : বাইন্ডার কার্নেল ড্রাইভার
    • dalvik : ডালভিক ভিএম
    • freq : সিপিইউ ফ্রিকোয়েন্সি
    • gfx : গ্রাফিক্স
    • hal : হার্ডওয়্যার মডিউল
    • idle : CPU নিষ্ক্রিয়
    • sched : CPU সময়সূচী
    • 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
  • মনোর পরিবর্তে IL2CPP ব্যবহার করুন । (আপনি ইউনিটি ব্যবহার করলেই প্রযোজ্য।) IL2CPP আপনার C# স্ক্রিপ্টগুলির জন্য আরও ভাল কার্যকরী কার্যক্ষমতা প্রদান করে।
  • আপনার গেম মাল্টিথ্রেড করা. আরও বিশদ বিবরণের জন্য, ফ্রেমরেট সামঞ্জস্য বিভাগটি দেখুন।

ফ্রেমরেট ধারাবাহিকতা

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

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

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

চিত্র 1-এ দেখানো Systrace এমন আচরণ প্রদর্শন করে যা একটি গেমের মতো একটি সময়ে শুধুমাত্র একটি CPU-তে চলমান:

একটি সিস্টেম ট্রেসের মধ্যে থ্রেডের চিত্র

চিত্র 1. একটি একক-থ্রেডেড গেমের জন্য সিস্ট্রেস রিপোর্ট

আপনার গেমের কর্মক্ষমতা উন্নত করতে, আপনার গেমটিকে মাল্টিথ্রেড করুন ৷ সাধারণত, সেরা মডেলে 2টি থ্রেড থাকে:

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

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

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

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

এই পরিবর্তনগুলি প্রয়োগ করার পরে, আপনি দেখতে পাবেন যে আপনার গেমটি একই সাথে কমপক্ষে 2টি সিপিইউ দখল করছে, যেমন চিত্র 2-এ দেখানো হয়েছে:

একটি সিস্টেম ট্রেসের মধ্যে থ্রেডের চিত্র

চিত্র 2. একটি মাল্টি-থ্রেডেড গেমের জন্য সিস্ট্রেস রিপোর্ট

UI উপাদান লোড হচ্ছে

একটি সিস্টেম ট্রেসের মধ্যে একটি ফ্রেম স্ট্যাকের ডায়াগ্রাম
চিত্র 3. একটি গেমের জন্য Systrace রিপোর্ট যা একই সময়ে ডজন ডজন UI উপাদান রেন্ডার করছে

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

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

একটি ভাল লক্ষ্য হল UI আপডেটের সময় 2-3 মিলিসেকেন্ডে কমানো । আপনি নিম্নলিখিতগুলির মতো অপ্টিমাইজেশানগুলি সম্পাদন করে এই জাতীয় দ্রুত আপডেটগুলি অর্জন করতে পারেন:

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

শক্তি খরচ

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

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

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

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

কম-চালিত CPU-তে স্বল্প-সময়ের কাজ স্থগিত করুন

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

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

চিত্র 4-এ দেখানো উদাহরণ প্রতিবেদনটি একটি গেম দেখায় যা দ্রুত CPU-এর সুবিধা নেয়। যাইহোক, এই উচ্চ কার্যকলাপ স্তর দ্রুত শক্তি এবং তাপ একটি মহান চুক্তি উৎপন্ন করে.

একটি সিস্টেম ট্রেসের মধ্যে থ্রেডের চিত্র

চিত্র 4. সিস্ট্রেস রিপোর্ট ডিভাইসের CPU-তে থ্রেডের একটি সাবঅপ্টিমাল অ্যাসাইনমেন্ট দেখাচ্ছে

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

বেশির ভাগ ডিভাইস দ্রুত CPU-এর আগে ধীরগতির CPU-কে তালিকাভুক্ত করে, কিন্তু আপনি অনুমান করতে পারবেন না যে আপনার ডিভাইসের SOC এই অর্ডারটি ব্যবহার করে। চেক করতে, GitHub-এ এই 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);

তাপীয় চাপ

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

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

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

কোটলিন

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++ ব্যবহার করে, তাহলে JNI ব্যবহার করে আপনার নেটিভ গেম কোডে কল করতে onThermalStatusChanged() এ তাপীয় অবস্থার স্তরে কোড যোগ করুন বা নেটিভ থার্মাল API ব্যবহার করুন।

কোটলিন

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 বিভাগ অন্তর্ভুক্ত থাকে। এই বিভাগগুলি স্পর্শ-টু-ডিসপ্লে লেটেন্সি নির্ধারণের জন্য বিশেষভাবে উপযোগী পরিমাপ নিয়ে গঠিত।
  2. একটি সিস্ট্রেস রিপোর্টের SurfaceView বিভাগটি দেখুন। একটি ওভারস্টাফড বাফার মুলতুবি থাকা বাফার ড্রয়ের সংখ্যাকে 1 এবং 2 এর মধ্যে দোদুল্যমান করে, যেমন চিত্র 5 এ দেখানো হয়েছে:

    একটি সিস্টেম ট্রেসের মধ্যে বাফার সারির চিত্র

    চিত্র 5. সিস্ট্রেস রিপোর্ট একটি ওভারস্টাফড বাফার দেখাচ্ছে যা পর্যায়ক্রমে অঙ্কন কমান্ড গ্রহণ করার জন্য খুব পূর্ণ থাকে

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

আপনার গেমে Android Frame Pacing API একত্রিত করুন

অ্যান্ড্রয়েড ফ্রেম পেসিং API আপনাকে ফ্রেম অদলবদল সম্পাদন করতে এবং একটি অদলবদল ব্যবধান সংজ্ঞায়িত করতে সহায়তা করে যাতে আপনার গেমটি আরও সামঞ্জস্যপূর্ণ ফ্রেমরেট বজায় রাখে।

আপনার গেমের অ-ইউআই সম্পদের রেজোলিউশন হ্রাস করুন

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

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

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

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

ফ্রেমের ডায়াগ্রামে একটি Vsync উইন্ডো অনুপস্থিত কারণ তারা খুব দেরিতে আঁকা শুরু করেছে

চিত্র 6. সিস্ট্রেস রিপোর্ট দেখাচ্ছে কিভাবে একটি ফ্রেম একটি Vsync মিস করতে পারে

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

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

স্মৃতির অবস্থা

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

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

আরও তথ্যের জন্য, গেমগুলিতে মেমরি কার্যকরভাবে পরিচালনা করুন দেখুন।

থ্রেড অবস্থা

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

একটি সিস্ট্রেস রিপোর্টের চিত্র

চিত্র 7. সিস্ট্রেস রিপোর্ট দেখায় যে কীভাবে একটি থ্রেড নির্বাচন করার ফলে রিপোর্টটি সেই থ্রেডের জন্য একটি রাষ্ট্রীয় সারাংশ প্রদর্শন করে

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

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

অতিরিক্ত সম্পদ

আপনার গেমের কর্মক্ষমতা উন্নত করার বিষয়ে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন:

ভিডিও