তাপীয় API

মুক্তিপ্রাপ্ত :

অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) - থার্মাল এপিআই

Android 12 (API লেভেল 31) - NDK API

(প্রিভিউ) অ্যান্ড্রয়েড ১৫ (ডিপি১) - getThermalHeadroomThresholds()

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

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

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

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

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

ADPF তাপীয় API প্রাক-একত্রীকরণ
চিত্র ১. getThermalHeadroom সক্রিয়ভাবে পর্যবেক্ষণ না করে থার্মাল হেডরুম
ADPF তাপীয় API পোস্ট-ইন্টিগ্রেশন
চিত্র ২. `getThermalHeadroom`-এর সক্রিয় পর্যবেক্ষণের মাধ্যমে থার্মাল হেডরুম।

থার্মাল ম্যানেজার অর্জন করুন

থার্মাল এপিআই ব্যবহার করার জন্য, প্রথমে আপনাকে থার্মাল ম্যানেজার সংগ্রহ করতে হবে।

সি++

AThermalManager* thermal_manager = AThermal_acquireManager();

জাভা

PowerManager powerManager = (PowerManager)this.getSystemService(Context.POWER_SERVICE);

তাপীয় উচ্চতা সম্পর্কে জিজ্ঞাসা করুন

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

ফলাফলের পরিসীমা 0.0f (কোনো থ্রটলিং নেই, THERMAL_STATUS_NONE ) থেকে শুরু করে

১.০এফ পর্যন্ত (হেভি থ্রটলিং, THERMAL_STATUS_SEVERE )। আপনার গেমগুলিতে যদি বিভিন্ন গ্রাফিক্স কোয়ালিটি লেভেল থাকে, তাহলে আপনি আমাদের থার্মাল হেডরুম গাইডলাইন অনুসরণ করতে পারেন।

সি++

float thermal_headroom = AThermal_getThermalHeadroom(0);
ALOGI("ThermalHeadroom: %f", thermal_headroom);

জাভা

float thermalHeadroom = powerManager.getThermalHeadroom(0);
Log.d("ADPF", "ThermalHeadroom: " + 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 একটি নির্দিষ্ট স্তরে (যেমন: THERMAL_STATUS_LIGHT ) না পৌঁছানো পর্যন্ত আপনি thermalHeadroom পোলিং এড়িয়ে যেতে পারেন। এটি করার জন্য, আপনি একটি কলব্যাক রেজিস্টার করতে পারেন, যাতে স্ট্যাটাস পরিবর্তিত হলেই সিস্টেম আপনাকে অবহিত করে।

সি++

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);

পরিষ্কার-পরিচ্ছন্নতা

আপনার কাজ শেষ হয়ে গেলে, আপনার অর্জিত thermal_manager-টি পরিষ্কার করতে হবে। আপনি যদি জাভা ব্যবহার করেন, তাহলে PowerManager রেফারেন্সটি আপনার জন্য স্বয়ংক্রিয়ভাবে গার্বেজ কালেক্টেড হয়ে যেতে পারে। কিন্তু আপনি যদি JNI-এর মাধ্যমে জাভা এপিআই ব্যবহার করেন এবং একটি রেফারেন্স ধরে রাখেন, তাহলে রেফারেন্সটি পরিষ্কার করতে মনে রাখবেন!

সি++

AThermal_releaseManager(thermal_manager);

C++ API (NDK API) এবং Java API (JNI-এর মাধ্যমে) উভয়ই ব্যবহার করে একটি নেটিভ C++ গেমে কীভাবে থার্মাল এপিআই প্রয়োগ করতে হয়, তার একটি সম্পূর্ণ নির্দেশিকার জন্য, অ্যাডাপ্টেবিলিটি কোডল্যাব বিভাগের ইন্টিগ্রেট থার্মাল এপিআই অংশটি দেখুন।

তাপীয় উচ্চতা নির্দেশিকা

আপনি getThermalHeadroom মেথডটি পোল করে ডিভাইসটির থার্মাল অবস্থা পর্যবেক্ষণ করতে পারেন। এই মেথডটি পূর্বাভাস দেয় যে, THERMAL_STATUS_SEVERE পৌঁছানোর আগে ডিভাইসটি কতক্ষণ বর্তমান পারফরম্যান্স লেভেল বজায় রাখতে পারবে। উদাহরণস্বরূপ, যদি getThermalHeadroom(30) 0.8 রিটার্ন করে, তবে এটি নির্দেশ করে যে ৩০ সেকেন্ডের মধ্যে হেডরুম 0.8-এ পৌঁছানোর সম্ভাবনা রয়েছে, যেখানে এটি মারাত্মক থ্রটলিং বা 1.0 থেকে 0.2 দূরে আছে। যদি ওয়ার্কলোড চালানোর জন্য প্রয়োজনীয় সময়ের চেয়ে এই সময় কম হয়, তবে আপনার গেমের উচিত ওয়ার্কলোড একটি সহনীয় পর্যায়ে কমিয়ে আনা। উদাহরণস্বরূপ, গেমটি ফ্রেম রেট কমাতে পারে, ফিডেলিটি কমাতে পারে, অথবা নেটওয়ার্ক কানেক্টিভিটির কাজ কমাতে পারে।

তাপীয় অবস্থা এবং অর্থ

থার্মাল এপিআই-এর ডিভাইস সীমাবদ্ধতা

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

  • GetThermalHeadroom() API-টি খুব ঘন ঘন কল করবেন না। তা করলে, API-টি NaN রিটার্ন করবে। প্রতি ১০ সেকেন্ডে একবারের বেশি এটি কল করা উচিত নয়।
  • একাধিক থ্রেড থেকে কল করা পরিহার করুন, কারণ এতে কলের পুনরাবৃত্তি নিশ্চিত করা কঠিন হয়ে পড়ে এবং এর ফলে API থেকে NaN রিটার্ন হতে পারে।
  • যদি GetThermalHeadroom() এর প্রাথমিক মান NaN হয়, তাহলে API-টি ডিভাইসে উপলব্ধ নয়।
  • যদি GetThermalHeadroom() একটি উচ্চ মান (যেমন: ০.৮৫ বা তার বেশি) রিটার্ন করে এবং GetCurrentThermalStatus() তারপরেও THERMAL_STATUS_NONE রিটার্ন করে, তাহলে সম্ভবত স্ট্যাটাসটি আপডেট হয়নি। সঠিক থার্মাল থ্রটলিং স্ট্যাটাস অনুমান করার জন্য হিউরিস্টিকস ব্যবহার করুন অথবা getCurrentThermalStatus() ব্যবহার না করে শুধু getThermalHeadroom() ব্যবহার করুন।

হিউরিস্টিকসের উদাহরণ:

  1. থার্মাল এপিআই সমর্থিত কিনা তা যাচাই করুন। isAPISupported() getThermalHeadroom এর প্রথম কলের মান 0 বা NaN নয় তা নিশ্চিত করতে পরীক্ষা করে এবং প্রথম মানটি 0 বা NaN হলে এপিআই ব্যবহার করা এড়িয়ে যায়।
  2. যদি getCurrentThermalStatus() ফাংশনটি THERMAL_STATUS_NONE ব্যতীত অন্য কোনো মান রিটার্ন করে, তাহলে ডিভাইসটি থার্মাল থ্রটলড হচ্ছে।
  3. যদি getCurrentThermalStatus() বারবার THERMAL_STATUS_NONE রিটার্ন করে, তার মানে এই নয় যে ডিভাইসটি থার্মালি থ্রটলড হচ্ছে না। এর মানে হতে পারে যে ডিভাইসটিতে getCurrentThermalStatus() সাপোর্টেড নয়। ডিভাইসটির অবস্থা নিশ্চিত করতে getThermalHeadroom() এর রিটার্ন ভ্যালু চেক করুন।
  4. যদি getThermalHeadroom() > 1.0 এর একটি মান রিটার্ন করে, তাহলে স্ট্যাটাসটি আসলে THERMAL_STATUS_SEVERE বা তার চেয়েও গুরুতর হতে পারে। সেক্ষেত্রে, অবিলম্বে ওয়ার্কলোড কমিয়ে দিন এবং getThermalHeadroom() একটি নিম্নতর মান রিটার্ন না করা পর্যন্ত সেই কম ওয়ার্কলোড বজায় রাখুন।
  5. যদি getThermalHeadroom() ফাংশন 0.95 মান রিটার্ন করে, তাহলে স্ট্যাটাসটি আসলে THERMAL_STATUS_MODERATE বা তার চেয়ে বেশি হতে পারে। অবিলম্বে ওয়ার্কলোড কমিয়ে দিন এবং এর চেয়ে বেশি রিডিং যাতে না আসে, সেদিকে সতর্ক দৃষ্টি রাখুন।
  6. যদি 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.
      }
    }
  }

চিত্র:

ADPF হিউরিস্টিক উদাহরণ
চিত্র ৩. পুরোনো ডিভাইসগুলিতে থার্মাল এপিআই সমর্থনের বিষয়টি নির্ধারণ করার হিউরিস্টিকের উদাহরণ।