Thermal API

Yayınlanma tarihi:

Android 11 (API Düzeyi 30) - Termal API

Android 12 (API Düzeyi 31) - NDK API

(Önizleme) Android 15 (DP1) - getThermalHeadroomThresholds()

Uygulamanızın potansiyel performansı, cihazınızın termal durumuyla hava durumu, son kullanım, ve cihazın termal tasarımı. Cihazların performansa sınırlı bir süre boyunca izin verilir. Anahtar uygulamanızın hedefi, olduğunu unutmayın. Thermal API, API sayesinde ihtiyaç duymadan optimizasyon yapabilirsiniz. Ayrıca, performans hata ayıklaması sırasında olduğunu bilmeden, cihazın termal durumunun performansı sınırlayıp sınırlamadığını önemlidir. Ayrıca performans sorunlarını ayıklarken sıcaklığının performansı sınırlayıp sınırlamadığını önemlidir.

Oyun motorlarının genellikle yerleştirdiği iş yükünü ifade eder. Örneğin, şu parametreler çalışan iş parçacığı sayısı, büyük ve küçük çekirdekler için çalışan iş parçacığı GPU kalite seçenekleri ve çerçeve arabelleği çözünürlükleri. Unity Engine'de, oyun geliştiriciler, Kalite Ayarlar Uyarlanabilir Performans eklentisini kullanın. Unreal Engine'de Ölçeklenebilirlik Ayarları'nı kullanarak dinamik olarak da uygulayacaksınız.

Bir cihaz güvenli olmayan bir termal duruma yaklaştığında, oyununuz güvenli olmayan bir termal duruma geldiğinde azaltılmasıyla kısıtlanabilir. Kaçınılması gerekenler bu nedenle, cihazın termal durumunu izlemeli ve proaktif olarak iş yükünü ayarlayabilirsiniz. Cihaz aşırı ısındığında iş yükü için sürdürülebilir performans seviyesinin altına düşmesi iyi bir fikir olabilir. Şu tarihten sonra: Termal boşluk payı daha güvenli seviyelere düşerse oyun, Ancak sürdürülebilir bir kalite seviyesi bulmaya çalışın. size zaman kazandırır.

Termal cihazın sıcaklığını getThermalHeadroom yöntemidir. Bu yöntem, cihazın mevcut veri akışını ne kadar süre boyunca koruyabileceğini performansa sahip olmanız gerekir. Süre, tutardan azsa iş yükünü çalıştırmak için gereken iş yükünü çalıştırmakta zorlanıyorsanız oyununuzun iş yükünü sürdürülebilir bir seviyedir. Örneğin, oyun daha küçük çekirdeklere geçebilir ve veya kalite düşüyor.

ADPF Thermal API Ön Entegrasyonu
Şekil 1. getThermalHeadroom'u aktif olarak izlemeden Termal Headroom
'nı inceleyin.
ADPF Termal API Entegrasyon Sonrası
Şekil 2. "getThermalHeadroom"un aktif izlenebildiği Termal Headroom

Termal Müşteri Edinme Yöneticisi

Thermal API'yi kullanmak için önce Thermal Manager'ı edinmeniz gerekir

C++

AThermalManager* thermal_manager = AThermal_acquireManager();

Java

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

Daha fazla kontrol için Termal Boşluğu x saniye önceden tahmin edin

Sistemden, sıcaklığın x saniye kadar önündeki sıcaklığı tahmin etmesini yardımcı olur. Bu sayede daha hassas kontrol sahibi olabilir ve öğeleri kontrol etmek için tepki vermek için iş yükünü azaltarak termal kısıtlamanın devreye girmesini önleyin.

Sonuç 0.0f (kısıtlama yok, THERMAL_STATUS_NONE) ile 1.0f arasında değişir. (yoğun kısıtlama, THERMAL_STATUS_SEVERE). Oyunlarınızda farklı grafik kalitesi seviyeleri varsa Termal Headroom Kuralları.

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

Alternatif olarak, açıklama için termal durumlardan yararlanabilirsiniz.

Her cihaz modeli farklı şekilde tasarlanmış olabilir. Bazı cihazlar ısıyı daha iyi dağıtır ve böylece daha yüksek termal boşluk payına dayanabilir. kısıtlamadan geçer. Basitleştirilmiş bir aralıktaki kümeyi okumak için: varsa, ısıyı ayarlayarak sıcaklık durumunu kontrol edebilirsiniz. mevcut cihazdaki termal boşluk payı değerini alır.

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

Termal durum değiştiğinde bildirim alın

Ayrıca, thermalStatus isabet edene kadar thermalHeadroom öğesini yoklamaktan kaçınabilirsiniz. belirli bir düzeyde (örneğin: THERMAL_STATUS_LIGHT). Bunu yapmak için bir geri arama kaydedebilirsiniz. Böylece, durumu değişti.

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

İşiniz bittiğinde dinleyiciyi kaldırmayı unutmayın

C++

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

Java

powerManager.removeThermalStatusListener(listener);

Temizle

İşiniz bittiğinde, edindiğiniz thermal_Manager'ı temizlemeniz gerekir. Java kullanıyorsanız PowerManager referansı otomatik olarak topladık. Ancak JNI aracılığıyla Java API'si kullanıyorsanız ve referans korundu. Referansı temizlemeyi unutmayın.

C++

AThermal_releaseManager(thermal_manager);

Termal API'nin yerel bir C++ oyununa nasıl uygulanacağına ilişkin eksiksiz bir rehber için C++ API (NDK API) ve Java API'si (JNI aracılığıyla) için Google+ Entegre Termal API Adaptability codelab bölümüne ekleyin.

Termal boşluk payı kuralları

Termal cihazın sıcaklığını getThermalHeadroom yöntemidir. Bu yöntem, cihazın mevcut veri akışını ne kadar süre boyunca koruyabileceğini THERMAL_STATUS_SEVERE hedefine ulaşmadan önceki performans düzeyini kontrol eder. Örneğin, getThermalHeadroom(30) 0,8 değerini döndürürse bu değer, 30 saniyede 0, 8'e ulaşması beklenir.Bu değer 0, 2 saniyedir. veya 1.0'dan daha yüksek bir performansa neden olabilir. Süre, tamamlanması gerekenden azsa iş yükünü çalıştırıyorsanız, oyununuz da iş yükünü sürdürülebilir bir seviyesinde olmalıdır. Örneğin oyun, kare hızını düşürebilir, kaliteyi düşürebilir veya ağ bağlantısı işini azaltabilir.

Termal durumlar ve anlam

Thermal API'nin cihaz sınırlamaları

Thermal API'nin bilinen bazı sınırlamaları veya ek gereksinimleri vardır uygulama odaklı bir proje yönetimi yaklaşımıdır. Sınırlamalar ve bunların nasıl şu şekilde ele alabilirsiniz:

  • GetThermalHeadroom() API'yi çok sık çağırmayın. Bu işlemle ile başlar. Saniyede en fazla bir kez çağrılmalıdır.
  • GetThermalHeadroom() öğesinin ilk değeri NaN ise API değil cihazda mevcut
  • GetThermalHeadroom(), yüksek bir değer (ör. 0,85 veya daha yüksek) döndürürse ve GetCurrentThermalStatus() hâlâ THERMAL_STATUS_NONE değerini döndürüyor. Durum: muhtemelen güncellenmemiştir. Doğru termal kısıtlamayı tahmin etmek için buluşsal yöntemler kullanma veya getCurrentThermalStatus() olmadan sadece getThermalHeadroom() kullanın.

Buluşsal yöntemler örneği:

  1. Thermal API'nin desteklenip desteklenmediğini kontrol edin. isAPISupported(), 0 veya NaN olmadığından emin olmak için getThermalHeadroom için yapılan ilk çağrı ve ilk değer 0 veya NaN ise API'yi kullanarak atlar.
  2. getCurrentThermalStatus(), şundan farklı bir değer döndürürse: THERMAL_STATUS_NONE, cihaz termal olarak kısıtlanıyor.
  3. getCurrentThermalStatus(), THERMAL_STATUS_NONE sağlayıcısını döndürmeye devam ederse cihazın termostatıyla kısıtlanmadığı anlamına gelmez. Bu getCurrentThermalStatus() ürününün bu cihazda desteklenmediği anlamına gelir. Şu koşulun sağlandığından emin olmak için getThermalHeadroom() işlevinin döndürülen değerini kontrol edin: için geçerlidir.
  4. getThermalHeadroom(), > değerini döndürürse 1.0 ise THERMAL_STATUS_SEVERE veya daha yüksek olursa iş yükünü anında azaltır ve getThermalHeadroom() daha düşük değer döndürene kadar daha düşük iş yükü sürdürür
  5. getThermalHeadroom(), 0,95 değerini döndürürse durum THERMAL_STATUS_MODERATE veya daha yüksek olabileceği için iş yükünü hemen azaltın yüksek okuma yapmamak için dikkatli olun
  6. getThermalHeadroom(), 0,85 değerini döndürürse durum THERMAL_STATUS_LIGHT, dikkatli olun ve iş yükünü azaltın mümkünse

Sözde kod:

  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.
      }
    }
  }

Diyagram:

ADPF Buluşsal Örneği
Şekil 3.Daha eski cihazlarda Thermal API desteğini belirlemek için buluşsal yöntem örneği