মুক্তি :
Android 11 (API লেভেল 30) - থার্মাল এপিআই
Android 12 (API লেভেল 31) - NDK API
(প্রিভিউ) Android 15 (DP1) - getThermalHeadroomThresholds()
আপনার অ্যাপের সম্ভাব্য কর্মক্ষমতা ডিভাইসের তাপীয় অবস্থার দ্বারা সীমিত, যা আবহাওয়া, সাম্প্রতিক ব্যবহার এবং ডিভাইসের তাপীয় নকশার মতো বৈশিষ্ট্যের উপর ভিত্তি করে পরিবর্তিত হতে পারে। থার্মালি থ্রোটল হওয়ার আগে ডিভাইসগুলি শুধুমাত্র সীমিত সময়ের জন্য উচ্চ স্তরের কর্মক্ষমতা বজায় রাখতে পারে। আপনার বাস্তবায়নের একটি মূল লক্ষ্য তাপীয় সীমাবদ্ধতা অতিক্রম না করে কর্মক্ষমতা লক্ষ্য অর্জন করা উচিত। তাপীয় API ডিভাইস নির্দিষ্ট অপ্টিমাইজেশনের প্রয়োজন ছাড়াই এটি সম্ভব করে তোলে। উপরন্তু, কর্মক্ষমতা সমস্যা ডিবাগ করার সময়, আপনার ডিভাইসের তাপীয় অবস্থা কর্মক্ষমতা সীমিত করছে কিনা তা জানা গুরুত্বপূর্ণ।
গেম ইঞ্জিনে সাধারণত রানটাইম পারফরম্যান্স পরামিতি থাকে যা ইঞ্জিন ডিভাইসে রাখা কাজের চাপ সামঞ্জস্য করতে পারে। উদাহরণস্বরূপ, এই পরামিতিগুলি কর্মী থ্রেডের সংখ্যা, বড় এবং ছোট কোরের জন্য কর্মী-থ্রেড অ্যাফিনিটি, GPU বিশ্বস্ততার বিকল্প এবং ফ্রেমবাফার রেজোলিউশন সেট করতে পারে। ইউনিটি ইঞ্জিনে, গেম ডেভেলপাররা অ্যাডাপটিভ পারফরম্যান্স প্লাগইন ব্যবহার করে গুণমান সেটিংস পরিবর্তন করে কাজের চাপ সামঞ্জস্য করতে পারে। অবাস্তব ইঞ্জিনের জন্য, মান মাত্রা গতিশীলভাবে সামঞ্জস্য করতে স্কেলেবিলিটি সেটিংস ব্যবহার করুন।
যখন একটি ডিভাইস একটি অনিরাপদ তাপীয় অবস্থায় পৌঁছায়, তখন এই পরামিতিগুলির মাধ্যমে কাজের চাপ কমিয়ে আপনার গেমটি থ্রোটল হওয়া এড়াতে পারে। থ্রটলিং এড়াতে, আপনাকে ডিভাইসের তাপীয় অবস্থা পর্যবেক্ষণ করতে হবে এবং গেম ইঞ্জিনের কাজের চাপকে সক্রিয়ভাবে সামঞ্জস্য করতে হবে। একবার ডিভাইসটি অতিরিক্ত গরম হয়ে গেলে, তাপ নষ্ট করার জন্য কাজের চাপ অবশ্যই টেকসই কর্মক্ষমতা স্তরের নিচে নেমে যাবে। থার্মাল হেডরুম নিরাপদ স্তরে কমে যাওয়ার পরে, গেমটি আবার গুণমানের সেটিংস বাড়াতে পারে তবে সর্বোত্তম খেলার সময়ের জন্য একটি টেকসই মানের স্তর খুঁজে পেতে নিশ্চিত করুন৷
আপনি getThermalHeadroom
পদ্ধতিতে ভোট দিয়ে ডিভাইসের তাপীয় অবস্থা নিরীক্ষণ করতে পারেন। এই পদ্ধতিটি পূর্বাভাস দেয় যে ডিভাইসটি কতক্ষণ অতিরিক্ত গরম না করে বর্তমান কর্মক্ষমতা স্তর বজায় রাখতে পারে। যদি কাজের চাপ চালানোর জন্য প্রয়োজনীয় পরিমাণের চেয়ে কম সময় হয়, তাহলে আপনার গেমটি কাজের চাপকে টেকসই স্তরে হ্রাস করবে। উদাহরণস্বরূপ, গেমটি ছোট কোরে স্থানান্তর করতে পারে, ফ্রেমের হার কমাতে পারে বা বিশ্বস্ততা কম করতে পারে।
![ADPF তাপীয় API প্রাক-একত্রীকরণ](https://developer.android.com/static/games/optimize/adpf/images/adpf_thermal_pre-integration.png?authuser=4&hl=bn)
![ADPF তাপীয় API পোস্ট-ইন্টিগ্রেশন](https://developer.android.com/static/games/optimize/adpf/images/adpf_thermal_post-integration.png?authuser=4&hl=bn)
থার্মাল ম্যানেজার অর্জন করুন
থার্মাল API ব্যবহার করার জন্য, প্রথমে আপনাকে থার্মাল ম্যানেজার অর্জন করতে হবে
সি++
AThermalManager* thermal_manager = AThermal_acquireManager();
জাভা
PowerManager powerManager = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
আরও নিয়ন্ত্রণের জন্য থার্মাল হেডরুম x সেকেন্ড আগে পূর্বাভাস করুন
আপনি সিস্টেমকে বর্তমান কাজের চাপের সাথে x সেকেন্ড আগে তাপমাত্রার পূর্বাভাস দিতে বলতে পারেন। এটি আপনাকে আরও সূক্ষ্ম নিয়ন্ত্রণ এবং কাজের চাপ কমিয়ে প্রতিক্রিয়া করার জন্য আরও সময় দেয় যাতে তাপীয় থ্রটলিংকে কিক করা থেকে আটকাতে পারে।
ফলাফলের রেঞ্জ 0.0f (কোন থ্রটলিং নয়, THERMAL_STATUS_NONE
) থেকে 1.0f (ভারী থ্রটলিং, THERMAL_STATUS_SEVERE
)। যদি আপনার গেমগুলিতে বিভিন্ন গ্রাফিক্স মানের স্তর থাকে তবে আপনি আমাদের থার্মাল হেডরুম নির্দেশিকাগুলি অনুসরণ করতে পারেন৷
সি++
float thermal_headroom = AThermal_getThermalHeadroom(10);
ALOGI("ThermalHeadroom in 10 sec: %f", thermal_headroom);
জাভা
float thermalHeadroom = powerManager.getThermalHeadroom(10);
Log.d("ADPF", "ThermalHeadroom in 10 sec: " + thermalHeadroom);
বিকল্পভাবে, স্পষ্টীকরণের জন্য তাপীয় অবস্থার উপর নির্ভর করুন
প্রতিটি ডিভাইসের মডেল আলাদাভাবে ডিজাইন করা যেতে পারে। কিছু ডিভাইস তাপ আরও ভালভাবে বিতরণ করতে সক্ষম হতে পারে এবং এইভাবে থ্রোটল হওয়ার আগে উচ্চ তাপীয় হেডরুম সহ্য করতে সক্ষম হতে পারে। আপনি যদি তাপীয় হেডরুমের রেঞ্জের একটি সরলীকৃত গ্রুপিং পড়তে চান, তাহলে আপনি বর্তমান ডিভাইসে তাপীয় হেডরুমের মান বোঝার জন্য তাপীয় অবস্থা পরীক্ষা করতে পারেন।
সি++
AThermalStatus thermal_status = AThermal_getCurrentThermalStatus(thermal_manager);
ALOGI("ThermalStatus is: %d", thermal_status);
জাভা
int thermalStatus = powerManager.getCurrentThermalStatus();
Log.d("ADPF", "ThermalStatus is: " + thermalStatus);
তাপীয় অবস্থা পরিবর্তন হলে বিজ্ঞপ্তি পান
thermalStatus
একটি নির্দিষ্ট স্তরে না আসা পর্যন্ত আপনি thermalHeadroom
ভোট দেওয়া এড়াতে পারেন (উদাহরণস্বরূপ: THERMAL_STATUS_LIGHT
)। এটি করার জন্য, আপনি একটি কলব্যাক নিবন্ধন করতে পারেন যাতে যখনই স্থিতি পরিবর্তিত হয় তখন সিস্টেম আপনাকে অবহিত করতে পারে৷
সি++
int result = AThermal_registerThermalStatusListener(thermal_manager, callback);
if ( result != 0 ) {
// failed, check whether you have previously registered callback that
// hasn’t been unregistered
}
জাভা
// PowerManager.OnThermalStatusChangedListener is an interface, thus you can
// also define a class that implements the methods
PowerManager.OnThermalStatusChangedListener listener = new
PowerManager.OnThermalStatusChangedListener() {
@Override
public void onThermalStatusChanged(int status) {
Log.d("ADPF", "ThermalStatus changed: " + status);
// check the status and flip the flag to start/stop pooling when
// applicable
}
};
powerManager.addThermalStatusListener(listener);
হয়ে গেলে শ্রোতাকে সরিয়ে দিতে মনে রাখবেন
সি++
int result = AThermal_unregisterThermalStatusListener(thermal_manager, callback);
if ( result != 0 ) {
// failed, check whether the callback has been registered previously
}
জাভা
powerManager.removeThermalStatusListener(listener);
ক্লিনআপ
একবার আপনি হয়ে গেলে, আপনাকে অর্জিত থার্মাল_ম্যানেজারটি পরিষ্কার করতে হবে। আপনি যদি জাভা ব্যবহার করেন, তাহলে PowerManager রেফারেন্স স্বয়ংক্রিয়ভাবে আপনার জন্য সংগ্রহ করা আবর্জনা হতে পারে। কিন্তু আপনি যদি JNI এর মাধ্যমে Java API ব্যবহার করছেন এবং একটি রেফারেন্স ধরে রেখেছেন, তাহলে রেফারেন্স পরিষ্কার করতে ভুলবেন না!
সি++
AThermal_releaseManager(thermal_manager);
C++ API (NDK API) এবং Java API (JNI-এর মাধ্যমে) উভয় ব্যবহার করে কীভাবে একটি নেটিভ C++ গেমে থার্মাল এপিআই প্রয়োগ করতে হয় তার সম্পূর্ণ গাইডের জন্য, অ্যাডাপ্টেবিলিটি কোডল্যাব বিভাগে ইন্টিগ্রেট থার্মাল এপিআই বিভাগটি দেখুন।
থার্মাল হেডরুম নির্দেশিকা
আপনি getThermalHeadroom
পদ্ধতিতে ভোট দিয়ে ডিভাইসের তাপীয় অবস্থা নিরীক্ষণ করতে পারেন। এই পদ্ধতিটি ভবিষ্যদ্বাণী করে যে কতক্ষণ ডিভাইসটি THERMAL_STATUS_SEVERE
পৌঁছানোর আগে বর্তমান কর্মক্ষমতা স্তর বজায় রাখতে পারে৷ উদাহরণস্বরূপ, যদি getThermalHeadroom(30)
0.8 রিটার্ন করে, তাহলে এটি নির্দেশ করে যে 30 সেকেন্ডের মধ্যে, হেডরুমটি 0.8-এ পৌঁছবে বলে আশা করা হচ্ছে, যেখানে গুরুতর থ্রটলিং থেকে 0.2 দূরত্ব বা 1.0। যদি কাজের চাপ চালানোর জন্য প্রয়োজনীয় পরিমাণের চেয়ে কম সময় হয়, তাহলে আপনার গেমটি কাজের চাপকে টেকসই স্তরে হ্রাস করবে। উদাহরণস্বরূপ, গেমটি ফ্রেম রেট কমাতে পারে, বিশ্বস্ততা কমাতে পারে বা নেটওয়ার্ক সংযোগের কাজ কমাতে পারে।
তাপীয় অবস্থা এবং অর্থ
- যদি ডিভাইসটি তাপগতভাবে থ্রোটল করা না হয়:
- কিছু থ্রটলিং, কিন্তু কর্মক্ষমতা উপর কোন উল্লেখযোগ্য প্রভাব:
- উল্লেখযোগ্য থ্রটলিং যা কর্মক্ষমতা প্রভাবিত করে:
তাপীয় API-এর ডিভাইসের সীমাবদ্ধতা
পুরানো ডিভাইসগুলিতে তাপীয় API প্রয়োগের কারণে তাপীয় API-এর কিছু পরিচিত সীমাবদ্ধতা বা অতিরিক্ত প্রয়োজনীয়তা রয়েছে। সীমাবদ্ধতা এবং তাদের চারপাশে কিভাবে কাজ করতে হয় তা নিম্নরূপ:
- খুব ঘন ঘন
GetThermalHeadroom()
API কল করবেন না। এটি করার ফলে API ফেরত NaN হবে। আপনি প্রতি সেকেন্ডে একবার এটি কল করা উচিত. -
GetThermalHeadroom()
এর প্রাথমিক মান যদি NaN হয়, তাহলে এপিআই ডিভাইসে উপলভ্য নয় - যদি
GetThermalHeadroom()
একটি উচ্চ মান প্রদান করে (যেমন: 0.85 বা তার বেশি) এবংGetCurrentThermalStatus()
তারপরওTHERMAL_STATUS_NONE
ফেরত দেয়, স্থিতি সম্ভবত আপডেট করা হবে না। সঠিক থার্মাল থ্রটলিং স্ট্যাটাস অনুমান করতে হিউরিস্টিক ব্যবহার করুন অথবাgetCurrentThermalStatus()
getThermalHeadroom()
ব্যবহার করুন।
হিউরিস্টিক উদাহরণ:
- তাপীয় API সমর্থিত কিনা তা পরীক্ষা করুন।
isAPISupported()
getThermalHeadroom
এ প্রথম কলের মান পরীক্ষা করে নিশ্চিত করে যে এটি 0 বা NaN নয় এবং প্রথম মানটি 0 বা NaN হলে API ব্যবহার করে এড়িয়ে যায়। -
getCurrentThermalStatus()
যদিTHERMAL_STATUS_NONE
ব্যতীত অন্য কোনো মান প্রদান করে, তাহলে ডিভাইসটি তাপগতভাবে থ্রোটল করা হচ্ছে। -
getCurrentThermalStatus()
যদিTHERMAL_STATUS_NONE
ফেরত দিতে থাকে, তাহলে এর মানে এই নয় যে ডিভাইসটি তাপগতভাবে থ্রোটল হচ্ছে না। এর অর্থ হতে পারে যেgetCurrentThermalStatus()
ডিভাইসে সমর্থিত নয়। ডিভাইসের অবস্থা নিশ্চিত করতেgetThermalHeadroom()
এর রিটার্ন মান পরীক্ষা করুন। -
getThermalHeadroom()
যদি > 1.0 এর একটি মান প্রদান করে, তবে স্থিতিটি আসলেTHERMAL_STATUS_SEVERE
বা তার বেশি হতে পারে, অবিলম্বে কাজের চাপ কমিয়ে দিন এবংgetThermalHeadroom()
কম মান না দেওয়া পর্যন্ত কম কাজের চাপ বজায় রাখুন -
getThermalHeadroom()
0.95 এর মান প্রদান করলে, স্থিতিটি আসলেTHERMAL_STATUS_MODERATE
বা তার বেশি হতে পারে, অবিলম্বে কাজের চাপ কমিয়ে দিন এবং উচ্চ পড়া রোধ করতে সতর্ক থাকুন -
getThermalHeadroom()
0.85 এর মান প্রদান করলে, স্থিতিটি আসলেTHERMAL_STATUS_LIGHT
হতে পারে, সতর্কতা বজায় রাখুন এবং সম্ভব হলে কাজের চাপ কমিয়ে দিন
সিউডোকোড:
bool isAPISupported() {
float first_value_of_thermal_headroom = getThermalHeadroom();
if ( first_value_of_thermal_headroom == 0 ||
first_value_of_thermal_headroom == NaN ) {
// Checked the thermal Headroom API's initial return value
// it is NaN or 0,so, return false (not supported)
return false;
}
return true;
}
if (!isAPISupported()) {
// Checked the thermal Headroom API's initial return value, it is NaN or 0
// Don’t use the API
} else {
// Use thermalStatus API to check if it returns valid values.
if (getCurrentThermalStatus() > THERMAL_STATUS_NONE) {
// The device IS being thermally throttled
} else {
// The device is not being thermally throttled currently. However, it
// could also be an indicator that the ThermalStatus API may not be
// supported in the device.
// Currently this API uses predefined threshold values for thermal status
// mapping. In the future you may be able to query this directly.
float thermal_headroom = getThermalHeadroom();
if ( thermal_headroom > 1.0) {
// The device COULD be severely throttled.
} else if ( thermal_headroom > 0.95) {
// The device COULD be moderately throttled.
} else if ( thermal_headroom > 0.85) {
// The device COULD be experiencing light throttling.
}
}
}
চিত্র: