তাপীয় API

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

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

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

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

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

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

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

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

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

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

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

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

সি++

AThermalManager* thermal_manager = AThermal_acquireManager();

জাভা

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

আরও নিয়ন্ত্রণের জন্য থার্মাল হেডরুম x সেকেন্ড এগিয়ে পূর্বাভাস দিন

আপনি বর্তমান কাজের চাপের সাথে সাথে তাপমাত্রা x সেকেন্ড আগে পূর্বাভাস দিতে সিস্টেমকে বলতে পারেন। এটি আপনাকে আরও সূক্ষ্ম নিয়ন্ত্রণ এবং তাপীয় থ্রটলিং প্রতিরোধ করার জন্য কাজের চাপ কমিয়ে প্রতিক্রিয়া জানাতে আরও সময় দেয়।

ফলাফল 0.0f থেকে শুরু হয় (কোনও থ্রটলিং নেই, THERMAL_STATUS_NONE )

১.০f পর্যন্ত (ভারী থ্রটলিং, 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);

তাপীয় অবস্থা পরিবর্তন হলে বিজ্ঞপ্তি পান

আপনি thermalHeadroom এ পোলিং এড়াতে পারবেন যতক্ষণ না thermalStatus একটি নির্দিষ্ট স্তরে পৌঁছায় (উদাহরণস্বরূপ: 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);

পরিষ্কার করা

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

সি++

AThermal_releaseManager(thermal_manager);

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

তাপীয় হেডরুম নির্দেশিকা

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

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

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

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

  • GetThermalHeadroom() API-তে খুব বেশি কল করবেন না। যদি আপনি এটি করেন, তাহলে API NaN ফেরত দেবে। আপনার প্রতি 10 সেকেন্ডে একবারের বেশি এটি কল করা উচিত নয়।
  • একাধিক থ্রেড থেকে কল করা এড়িয়ে চলুন, কলিং ফ্রিকোয়েন্সি নিশ্চিত করা কঠিন এবং API NaN ফেরত দিতে পারে।
  • যদি GetThermalHeadroom() এর প্রাথমিক মান NaN হয়, তাহলে ডিভাইসে API উপলব্ধ থাকবে না।
  • যদি GetThermalHeadroom() উচ্চ মান (যেমন: 0.85 বা তার বেশি) প্রদান করে এবং GetCurrentThermalStatus() এখনও THERMAL_STATUS_NONE প্রদান করে, তাহলে সম্ভবত স্ট্যাটাসটি আপডেট করা হয়নি। সঠিক থার্মাল থ্রটলিং স্ট্যাটাস অনুমান করতে হিউরিস্টিক ব্যবহার করুন অথবা getCurrentThermalStatus() ছাড়াই getThermalHeadroom() ব্যবহার করুন।

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

  1. থার্মাল API সমর্থিত কিনা তা পরীক্ষা করুন। isAPISupported() getThermalHeadroom এ প্রথম কলের মান পরীক্ষা করে নিশ্চিত করে যে এটি 0 বা NaN নয় এবং যদি প্রথম মান 0 বা NaN হয় তবে API ব্যবহার এড়িয়ে যায়।
  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 হিউরিস্টিক উদাহরণ
চিত্র ৩। পুরোনো ডিভাইসে থার্মাল API সাপোর্ট নির্ধারণের জন্য হিউরিস্টিকের উদাহরণ