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.
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.
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 bakın.
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
- Cihaz termal olarak kısıtlanmıyorsa:
- Kısıtlamalar uygulanır, ancak performans üzerinde önemli bir etkisi yoktur:
- Performansı etkileyen önemli ölçüde kısıtlama:
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 mevcutGetThermalHeadroom()
, yüksek bir değer (ör. 0,85 veya daha yüksek) döndürürse veGetCurrentThermalStatus()
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 veyagetCurrentThermalStatus()
olmadan sadecegetThermalHeadroom()
kullanın.
Buluşsal yöntemler örneği:
- Thermal API'nin desteklenip desteklenmediğini kontrol edin.
isAPISupported()
, 0 veya NaN olmadığından emin olmak içingetThermalHeadroom
için yapılan ilk çağrı ve ilk değer 0 veya NaN ise API'yi kullanarak atlar. getCurrentThermalStatus()
, şundan farklı bir değer döndürürse:THERMAL_STATUS_NONE
, cihaz termal olarak kısıtlanıyor.getCurrentThermalStatus()
,THERMAL_STATUS_NONE
sağlayıcısını döndürmeye devam ederse cihazın termostatıyla kısıtlanmadığı anlamına gelmez. BugetCurrentThermalStatus()
ürününün bu cihazda desteklenmediği anlamına gelir. Şu koşulun sağlandığından emin olmak içingetThermalHeadroom()
işlevinin döndürülen değerini kontrol edin: için geçerlidir.getThermalHeadroom()
, > değerini döndürürse 1.0 iseTHERMAL_STATUS_SEVERE
veya daha yüksek olursa iş yükünü anında azaltır vegetThermalHeadroom()
daha düşük değer döndürene kadar daha düşük iş yükü sürdürürgetThermalHeadroom()
, 0,95 değerini döndürürse durumTHERMAL_STATUS_MODERATE
veya daha yüksek olabileceği için iş yükünü hemen azaltın yüksek okuma yapmamak için dikkatli olungetThermalHeadroom()
, 0,85 değerini döndürürse durumTHERMAL_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: