티스토리 뷰
간략히, 디바이스상태(정상/쓰로틀링직전/쓰로틀링상태, CPU delay, GPU delay)에 따라 targetFrameRate를 조절하거나 CPU/GPU level의 조정, LOD의 제어를 하게하는 기술 (삼성 디바이스에서만 가능..)
Adaptive Performance Samsung (Android)은 현재 Android 10을 실행하는 다음 Samsung 장치를 지원합니다.
- 모든 구형 및 신형 Samsung Galaxy 모델
Samsung GameSDK 3.2+가 설치된 장치를 지원합니다.
가변 주사율 은 현재 Galaxy S20에서만 지원됩니다.
Unity 패키지 관리자를 통해 어댑티브 퍼포먼스를 설치한 후 디바이스에 프로젝트를 빌드하면, Unity에서 삼성 GameSDK 하위 시스템을 프로젝트에 자동으로 추가합니다. Unity는 런타임 동안 지원 디바이스에 어댑티브 퍼포먼스 관리자(Adaptive Performance Manager)를 생성하고 실행하여 해당 모바일 디바이스의 발열 상태에 대한 피드백을 제공합니다. 어댑티브 퍼포먼스 관리자의 이벤트를 수신하거나 정보를 쿼리하여 런타임 동안 실시간으로 대응할 수 있습니다. 아무런 행동도 취하지 않는 경우에는 콘솔에만 상태를 알려줍니다.
어댑티브퍼포먼스 활용전략
- 병목 현상을 없애기 위해 CPU 및 GPU를 중간 수준에서 시작해서 점진적으로 증가시킴으로써 에너지 소비량을 적게 유지할 수 있었습니다.
- 디바이스가 스로틀링 상태에 가까워지면 품질 설정을 조정하여 발열 로드를 줄일 수 있었으며 결과적으로 LOD 수준을 낮추기로 결정했습니다.
- 스로틀링 상태에 가까워질 때 목표 프레임 속도를 낮췄습니다.
- 목표 프레임 속도에 도달했을 때 온도가 감소 중이라면 LOD 수준과 목표 프레임 속도를 높이고 CPU 및 GPU 수준을 다시 낮췄습니다.
애플리케이션은 현재 성능 요구사항에 대해 인식한 특수 정보를 바탕으로 해당 프로퍼티를 설정할 수 있으며, 시나리오를 기반으로 수준을 높일 것인지 낮출 것인지를 결정할 수 있습니다.
- 애플리케이션이 이전 프레임에서 목표 프레임 속도에 도달했는가?
- 애플리케이션이 게임 내 씬(in-game scene) 또는 메뉴에 있는가?
- 앞으로 리소스가 많은 씬이 등장하는가?
- 다가오는 이벤트가 CPU 또는 GPU에 많은 부하를 주는가?
- 높은 CPU/GPU 수준을 요구하지 않는 광고를 게재하는가?
활용예제코드 - AdaptivePerformance 1.1.10
using System;
using UnityEngine;
using UnityEngine.AdaptivePerformance;
public class AdaptivePerformanceController : MonoBehaviour
{
private IAdaptivePerformance ap = null;
void Start() {
ap = Holder.Instance;
if (!ap.Active) // 해당 디바이스가 ap를 지원하는지 체크.
return;
QualitySettings.lodBias = 1.0f;
ap.ThermalStatus.ThermalEvent += OnThermalEvent;
ap.PerformanceStatus.PerformanceBottleneckChangeEvent += OnBottleneckChange;
}
private void OnBottleneckChange(PerformanceBottleneckChangeEventArgs ev) {
var ctrl = ap.DevicePerformanceControl;
switch (ev.PerformanceBottleneck) {
case PerformanceBottleneck.TargetFrameRate:
if (ctrl.CpuLevel > 0) {
ctrl.CpuLevel--;
}
if (ctrl.GpuLevel > 0) {
ctrl.GpuLevel--;
}
break;
case PerformanceBottleneck.GPU:
if (ctrl.GpuLevel < ctrl.MaxGpuPerformanceLevel) {
ctrl.GpuLevel++;
}
break;
case PerformanceBottleneck.CPU:
if (ctrl.CpuLevel < ctrl.MaxCpuPerformanceLevel) {
ctrl.CpuLevel++;
}
break;
}
}
void OnThermalEvent(ThermalMetrics ev) {
//frame time을 얻거나 설정할때 사용.
//ap.PerformanceStatus.FrameTiming.CurrentFrameTime
// warninglevel에 따라 lod조정 예.
switch (ev.WarningLevel) {
case WarningLevel.NoWarning:
QualitySettings.lodBias = 1;
break;
case WarningLevel.ThrottlingImminent:
if (ev.TemperatureLevel > 0.8f)
QualitySettings.lodBias = 0.75f;
else
QualitySettings.lodBias = 1.0f;
break;
case WarningLevel.Throttling:
QualitySettings.lodBias = 0.5f;
break;
}
}
public void EnterMenu_Automatic() {
if (!ap.Active)
return;
Application.targetFrameRate = 30;
// Enable automatic regulation of CPU and GPU level by Adaptive Performance
var ctrl = ap.DevicePerformanceControl;
ctrl.AutomaticPerformanceControl = true;
}
// manual로 설정하는것은 권장하지는 않음.
public void EnterMenu_Manually() {
if (!ap.Active)
return;
var ctrl = ap.DevicePerformanceControl;
// Set low CPU and GPU level in menu
ctrl.CpuLevel = 0;
ctrl.GpuLevel = 0;
// Set low target FPS
Application.targetFrameRate = 15;
}
public void ExitMenu() {
if (!ap.Active)
return;
var ctrl = ap.DevicePerformanceControl;
// Set higher CPU and GPU level when going back into the game
ctrl.CpuLevel = ctrl.MaxCpuPerformanceLevel;
ctrl.GpuLevel = ctrl.MaxGpuPerformanceLevel;
}
}
'Unity > 최적화' 카테고리의 다른 글
[Youtube] 유나이트 서울 2020 - Unity 엔지니어를 위한 Profiler 노하우 (0) | 2021.02.26 |
---|---|
[Youtube] 유나이트 서울 2020 - 최대 성능을 위한 최적화 팁 (0) | 2021.02.26 |
[Youtube] 유나이트 서울 2020 - Adaptive Performance를 활용한 모바일 단말의 지속성능 최적화 Track2-5 (0) | 2021.02.25 |
Unite Now: 버스트 컴파일러를 사용한 Android 모바일 최적화 (0) | 2021.02.24 |
[Youtube] 성능 프로파일링과 최적화 (0) | 2021.02.16 |
- Total
- Today
- Yesterday