थर्मल एपीआई

रिलीज़ किया गया:

Android 11 (एपीआई लेवल 30) - थर्मल एपीआई

Android 12 (एपीआई लेवल 31) - NDK API

(झलक) Android 15 (DP1) - getThermalHeadroomThresholds()

आपके ऐप्लिकेशन की संभावित परफ़ॉर्मेंस, घर के गर्म होने की स्थिति के हिसाब से तय होती है कुछ चीज़ों के आधार पर डिवाइस का इस्तेमाल किया जा सकता है. जैसे, मौसम, हाल ही में इस्तेमाल, और डिवाइस का थर्मल डिज़ाइन तैयार किया है. डिवाइस सिर्फ़ हाई लेवल पर बने रह सकते हैं परफ़ॉर्मेंस को थोड़े समय के लिए कम कर सकता है. एक कुंजी विज्ञापन फ़ॉर्मैट को लागू करने का लक्ष्य, कैंपेन की परफ़ॉर्मेंस के लक्ष्यों को हासिल करना होना चाहिए तापमान कम हो रहा है. Thermal API की मदद से, बिना किसी रुकावट के काम किया जा सकता है डिवाइस के हिसाब से ऑप्टिमाइज़ करने के लिए. इसके अलावा, परफ़ॉर्मेंस को डीबग करते समय क्या आपको पता है कि आपके डिवाइस के गर्म होने की स्थिति, परफ़ॉर्मेंस को सीमित कर रही है या नहीं अहम है. इसके अलावा, परफ़ॉर्मेंस की समस्याओं को डीबग करते समय, यह पता करना कि आपके डिवाइस की थर्मल स्टेट, परफ़ॉर्मेंस को सीमित कर रही है या नहीं अहम है.

गेम इंजन में आम तौर पर, रनटाइम की परफ़ॉर्मेंस के पैरामीटर होते हैं. ये पैरामीटर, वह वर्कलोड जो इंजन डिवाइस पर डालता है. उदाहरण के लिए, ये पैरामीटर सेट वर्कर थ्रेड की संख्या, बड़े और छोटे कोर के लिए वर्कर-थ्रेड अफ़िनिटी, जीपीयू फ़िडेलिटी के विकल्प और फ़्रेमबफ़र रिज़ॉल्यूशन. Unity Engine में, गेम डेवलपर, वर्कलोड को कम या ज़्यादा करने के लिए, क्वालिटी सेटिंग अडैप्टिव परफ़ॉर्मेंस प्लगिन का इस्तेमाल करके. अनरियल इंजन के लिए, स्केलेबिलिटी सेटिंग का इस्तेमाल करके अडजस्ट करें क्वालिटी लेवल को लगातार अपडेट किया जाता है.

जब कोई डिवाइस असुरक्षित थर्मल स्टेट में पहुंच जाता है, तो आपका गेम को इन पैरामीटर के ज़रिए, वर्कलोड को कम करके थ्रॉटल किया जाता है. इससे बचने के लिए थ्रॉटलिंग के दौरान, आपको डिवाइस की थर्मल स्थिति पर नज़र रखनी चाहिए और गेम इंजन के वर्कलोड को कम या ज़्यादा किया जा सकता है. डिवाइस के ज़्यादा गर्म होने पर, वर्कलोड को काफ़ी कम हो जाता है. इस तारीख के बाद थर्मल हेडरूम सुरक्षित स्तर तक कम हो जाता है, गेम क्वालिटी सेटिंग को फिर से सेट अप करना होगा, लेकिन यह पक्का करना होगा कि पब्लिशर ऐसा लगातार कॉन्टेंट अपलोड कर सकें वीडियो गेम खेलने के आपके अनुभव को बेहतर बनाने में मदद करें.

डिवाइस की तापीय स्थिति को मॉनिटर करने के लिए, getThermalHeadroom तरीका. इस तरीके से यह अनुमान लगाया जाता है कि डिवाइस, मौजूदा डेटा को कितने समय तक बनाए रख सकता है परफ़ॉर्मेंस लेवल को बिना ज़्यादा गर्म किए. अगर समय काम का बोझ कम है, तो गेम से आपका वर्कलोड कम होकर पर्यावरण को नुकसान पहुंचाए बिना, उदाहरण के लिए, गेम छोटे कोर पर शिफ़्ट हो सकता है, फ़्रेम रेट या कम फ़िडेलिटी.

ADPF थर्मल एपीआई प्री-इंटिग्रेशन
पहली इमेज. थर्मल हेडरूम, लेकिन getThermalHeaderroom पर सक्रिय रूप से नज़र नहीं रखता
ADPF थर्मल एपीआई पोस्ट-इंटिग्रेशन
दूसरी इमेज. 'getThermalheadroom` की निगरानी करने के लिए, थर्मल हेडरूम

थर्मल मैनेजर हासिल करें

Thermal API का इस्तेमाल करने के लिए, सबसे पहले आपको थर्मल मैनेजर का ऐक्सेस लेना होगा

C++

AThermalManager* thermal_manager = AThermal_acquireManager();

Java

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

ज़्यादा कंट्रोल के लिए, थर्मल हेडरूम को x सेकंड आगे का अनुमान लगाएं

सिस्टम को तापमान का पूर्वानुमान x सेकंड आगे बढ़ाने के लिए कहा जा सकता है. इसके लिए, मौजूदा वर्कलोड. इससे आपको वीडियो पर ज़्यादा कंट्रोल और ज़्यादा समय मिलता है थर्मल थ्रॉटलिंग को किक इन होने से रोकने के लिए, वर्कलोड को कम करके प्रतिक्रिया करें.

नतीजा 0.0f (थ्रॉटलिंग नहीं, THERMAL_STATUS_NONE) से 1.0f तक है (हैवी थ्रॉटलिंग, THERMAL_STATUS_SEVERE). अगर आपके गेम में अलग-अलग ग्राफ़िक क्वालिटी लेवल हैं, तो हमारे थर्मल हेडरूम से जुड़े दिशा-निर्देश.

C++

float thermal_headroom = AThermal_getThermalHeadroom(10);
ALOGI("ThermalHeadroom in 10 sec: %f", thermal_headroom);

Java

float thermalHeadroom = powerManager.getThermalHeadroom(10);
Log.d("ADPF", "ThermalHeadroom in 10 sec: " + thermalHeadroom);

इसके अलावा, जवाब पाने के लिए थर्मल स्टेटस पर भरोसा करें

डिवाइस के हर मॉडल को अलग तरह से डिज़ाइन किया जा सकता है. कुछ डिवाइसों में ये काम किए जा सकते हैं ऊष्मा को बेहतर तरीके से वितरित करती है और इस तरह ज़्यादा तापीय हेडरूम को झेल सकती है उन्हें थ्रॉटल नहीं किया जा सकता. अगर आपको रेंज के ऐसे ग्रुप को पढ़ना है जो सामान्य तरीके से हो, तो थर्मल हेडरूम है, तो आप तापीय स्थिति को देखकर मौजूदा डिवाइस पर थर्मल हेडरूम मान.

C++

AThermalStatus thermal_status = AThermal_getCurrentThermalStatus(thermal_manager);
ALOGI("ThermalStatus is: %d", thermal_status);

Java

int thermalStatus = powerManager.getCurrentThermalStatus();
Log.d("ADPF", "ThermalStatus is: " + thermalStatus);

थर्मल स्टेटस में बदलाव होने पर सूचना पाएं

thermalStatus हिट होने तक, thermalHeadroom को पोल करने से भी बचा जा सकता है कोई खास लेवल (उदाहरण के लिए: THERMAL_STATUS_LIGHT). ऐसा करने के लिए, एक कॉलबैक रजिस्टर किया जा सकता है, ताकि सिस्टम आपको जब भी सूचना दे स्थिति बदल गई है.

C++

int result = AThermal_registerThermalStatusListener(thermal_manager, callback);
if ( result != 0 ) {
  // failed, check whether you have previously registered callback that
  // hasn’t been unregistered
}

Java

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

इसे पूरा करने के बाद, लिसनर को हटाना न भूलें

C++

int result = AThermal_unregisterThermalStatusListener(thermal_manager, callback);
if ( result != 0 ) {
  // failed, check whether the callback has been registered previously
}

Java

powerManager.removeThermalStatusListener(listener);

क्लीनअप करें

काम पूरा होने के बाद, आपको उस थर्मल_मैनेजर खाते को खाली करना होगा जिसे आपने खरीदा था. अगर Java का इस्तेमाल किया जा रहा है, तो PowerManager रेफ़रंस अपने-आप खराब हो सकता है जो आपके लिए इकट्ठा किए गए हैं. लेकिन यदि आप JNI के माध्यम से Java API का उपयोग कर रहे हैं और रेफ़रंस बनाए रखा है, तो रेफ़रंस को हटाना न भूलें!

C++

AThermal_releaseManager(thermal_manager);

इस्तेमाल किए जा रहे नेटिव C++ गेम में Thermal API को इस्तेमाल करने का तरीका जानने के लिए, C++ API (NDK API) और Java API (JNI के ज़रिए), दोनों इस्तेमाल करने के लिए, इंटिग्रेशन Adaptability codelab में, Thermal API सेक्शन सेक्शन में जाएं.

थर्मल हेडरूम से जुड़े दिशा-निर्देश

डिवाइस की थर्मल स्थिति को मॉनिटर करने के लिए, getThermalHeadroom तरीका. इस तरीके से यह अनुमान लगाया जाता है कि डिवाइस, मौजूदा डेटा को कितने समय तक बनाए रख सकता है परफ़ॉर्मेंस लेवल को THERMAL_STATUS_SEVERE तक पहुंचने से पहले पूरा कर लें. उदाहरण के लिए, अगर getThermalHeadroom(30), 0.8 दिखाता है, तो इसका मतलब है कि 30 में वहीं, 0.2 सेकंड की दूरी पर, हेडरूम के 0.8 तक पहुंचने की उम्मीद है गंभीर थ्रॉटलिंग या 1.0 से. अगर समय आपकी ज़रूरत से कम है, तो आपका गेम वर्कलोड कम करेगा. लेवल. उदाहरण के लिए, गेम फ़्रेम रेट को कम कर सकता है, वीडियो की क्वालिटी कम कर सकता है या नेटवर्क कनेक्टिविटी के काम को कम करें.

थर्मल स्टेटस और मतलब

Thermal API के लिए डिवाइस की सीमाएं

Thermal API की कुछ सीमाएं या अन्य ज़रूरी शर्तें हैं. इन वजहों से ऐसा हो सकता है पुराने डिवाइसों पर थर्मल एपीआई लागू करने के लिए किया जा सकता है. सीमाएं और तरीका यहां बताए गए तरीके से काम किया जा सकता है:

  • GetThermalHeadroom() एपीआई को बार-बार कॉल न करें. ऐसा करने से नतीजे के तौर पर API, NaN दिखाता है. आपको इसे हर सेकंड ज़्यादा से ज़्यादा एक बार कॉल करना चाहिए.
  • अगर GetThermalHeadroom() की शुरुआती वैल्यू NaN है, तो एपीआई डिवाइस पर उपलब्ध
  • अगर GetThermalHeadroom() ज़्यादा वैल्यू दिखाता है (उदाहरण: 0.85 या उससे ज़्यादा) और GetCurrentThermalStatus() अब भी THERMAL_STATUS_NONE दिखाता है. स्टेटस यह है शायद अपडेट नहीं है. सही थर्मल थ्रॉटलिंग का अनुमान लगाने के लिए, अनुभव की मदद लें स्टेटस या getCurrentThermalStatus() के बिना सिर्फ़ getThermalHeadroom() का इस्तेमाल करें.

अनुभव के हिसाब से उदाहरण:

  1. देखें कि Thermal API काम करता है या नहीं. 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.
      }
    }
  }

डायग्राम:

एडीएपीएफ़ अनुमान का उदाहरण
तीसरी इमेज.पुराने डिवाइसों पर Thermal API की सुविधा काम करती है या नहीं, यह पता करने के लिए ह्यूरिस्टिक का उदाहरण