Adaptive Performance 1.0





모바일 단말은 PC나 콘솔에 비해 물리적인 한계를 지니고 있으며, 게임과 같은 복잡한 어플리케이션에서 성능의 제약이 발생할 수 있습니다. Adaptive Performance 프로젝트는 모바일 단말이 지니는 이 물리적 한계점을 개선하고 보완하기위해 시작되었습니다.

우선 첫번째 버전인 1.0에서는 게임 성능이 하락하지않는 범위 안에서 사전에 단말의 불필요한 전류 소모를 줄이는 방법에 대해 집중했습니다. 모바일 단말의 물리적 한계 중에 배터리 소모와 발열 관리에 따른 성능의 제어가 큰 비중을 차지하기 때문입니다.

이를 위해 3가지의 핵심 내용들이 구현되었습니다.


  • Power Manager
  • Bottleneck Detection & Auto Performance Control
  • Custom Scaler using device thermal feedback

각 구현 내용에 대한 세부 사항은 아래와 같습니다.




Power Manager


Power Manager (PM)는 단말의 온도가 높아져서 급격하게 성능이 떨어지는 발열 제한 (Thermal Throttling)을 피하고 배터리의 지속 시간을 늘릴 수 있도록 구현된 시스템입니다. 이를 위해 Power Manager에서는 게임이 필요로 하는 CPU/GPU 수준을 예측하고, 그에 딱 맞는 전류 소모량을 최적화합니다.





위 그래프는 Power Manager 시스템의 구조와 동작 순서에 대해 나타낸 그래프입니다. PM의 구동 순서를 차례대로 살펴보면 다음과 같습니다.



  1. 단말 안에 탑재된 GameSDK를 통해 받아 온 단말의 온도 등 실시간 성능 상태정보를 이전 Frame의 정보와 비교, 계산합니다.
  2. 계산된 Frame 정보와 단말의 성능 상태정보 등을 통해 현재 단말의 상황을 파악합니다. 이 과정에서 GameSDK를 통해 얻은 정보들을 토대로 현재 단말이 Target Framerate을 달성하고 있는지 확인하고, 또한 현재 게임이 CPU를 많이 사용하고 있는지(CPU Bottleneck), GPU를 많이 쓰는 상황 (GPU Bottleneck)인지를 파악합니다. (Bottleneck Detection)
  3. 2)에서 확인된 Bottleneck 상황에 따라 성능을 떨어트리지 않으면서 전류 소모를 줄일 수 있는 파워 수준을 찾습니다. (Auto Performance Controller)
  4. Auto Performance Controller를 통해 찾아낸 적정 값을 단말에 전달합니다.


게임이 단말에서 플레이 되는 동안 Adaptive Performance 내의 Power Management는 위 순서를 반복하며 변화하는 단말의 상황에 적합한 동작을 제공하게 됩니다.




Bottleneck Detection & Auto Performance Control




Power Manager의 동작 과정 중, 단말에 부하를 주는 부분을 찾아내는 것을 Bottleneck Detection이라고 합니다. Adaptive Performance에서는 Frame time과 CPU/GPU time 정보를 이용해 Bottleneck 포인트를 찾아냅니다. 앞의 세가지 정보를 통해, 이 게임이 CPU를 너무 많이 써서 Target Frame rate을 달성하지 못한 것인지, 아니면 GPU time이 더 많이 소요되었기 때문인지를 판단할 수 있습니다. GPU time의 경우, GameSDK를 통해 더 정확한 정보를 얻어올 수 있어 Bottleneck 포인트를 찾는 것이 더 쉬워졌습니다.

이렇게 CPU/GPU 중 어느 곳에서 Bottleneck이 발생하는지를 찾으면 각 상황에 맞는 적절한 조치를 취할 수 있습니다. 예를 들어, 게임이 GPU를 많이 쓰고 있는 상황이라면, 높은 온도일 때 상대적으로 적게 필요한 CPU를 제어하여 온도를 낮출 수 있습니다. 발열 상태가 양호한 상황이라면, 게임이 GPU를 필요한 만큼 충분히 사용할 수 있도록 조절할 수도 있습니다. 또한, 만약 게임이 CPU와 GPU를 둘 다 적게 사용하는 상황이라면, 각 사용 가능 범위를 줄여 소모 전류를 절감하고, 이를 통해 배터리 사용 시간을 늘릴 수 있습니다.

Adaptive Performance에서는 위와 같이 단말 상황에 맞는 Power Managing을 자동으로 할 수 있는 기능을 제공하는데, 이를 Auto Performance Control 이라고 합니다.





Auto Performance Control 기능을 통해, 개발자는 별도의 추가 작업없이 Auto Performance Control 시스템을 켜는 것 만으로 자동으로 단말과 소통하며 게임의 성능을 단말 상태에 맞춰 최적화 할 수 있습니다.




Configuring CPU/GPU Levels


기본적으로 Adaptive Performance에서는 Auto Performance Mode를 켜면 Auto Performance Control 시스템을 통해 자동으로 Bottleneck Detection 및 적절한 CPU/GPU 설정을 하게 되며, 이를 권장하고 있습니다.

아래 예제 코드는 Adaptive Performance의 Auto Performance Control을 사용하여 어떻게 발열과 소모 전류를 줄이는지 나타내고 있습니다. 개발자가 Auto Performance Control 모드를 켜고(true), 원하는 targetFrameRate을 설정하면, 이를 기반으로 Auto Performance Control 시스템이 Power Level을 조절하여 적절한 성능을 달성할 수 있도록 돕습니다.




public void EnterMenu()
{
 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;
}

public void EnterBenchmark()
{
 var ctrl = ap.DevicePerformanceControl;
 // Set higher CPU and GPU level when benchmarking a level
 ctrl.cpuLevel = ctrl.MaxCpuPerformanceLevel;
 ctrl.gpuLevel = ctrl.MaxGpuPerformanceLevel;
}



Adaptive Performance API를 통해 개발자가 직접 CPU/GPU 레벨을 설정하는 것도 가능하지만 이 방법은 권장하지 않습니다.

직접 조정할 수 있는 것은 실제 동작 Frequency 값이 아닌 추상화된 Level 값이며, 이는 각 단말이 지니고있는 성능 차이에 따라 의도하지않은 배터리 소모와 성능 저하 문제등을 일으킬 수 있기 때문입니다. (예를 들어, A 단말을 생각하고 직접 설정한 레벨 값이 다른 사양의 B단말에서는 오히려 성능에 악영향을 가져올 수 있습니다.)

따라서 개발자가 직접 레벨을 설정하는 것 보다는 유니티와 삼성의 경험있는 개발자들이 어떠한 단말에서든 최상의 성능을 달성할 수 있도록 구현하여 제공하는 Auto Performance Control 을 사용하는 것을 추천합니다.

그럼에도 불구하고, 개발자가 수동으로 CPU, GPU 레벨을 설정하고 싶다면,
Instance.DevicePerformanceControl.AutomaticPerformanceControlfalse로 세팅하고, Instance.DevicePerformanceControl.cpulevelInstance.DevicePeformanceControl.gpulevel 값으로 CPU/GPU 레벨을 변경할 수 있습니다.

다시 한번 강조하듯 이는 권장 사용방법이 아니며, 주의할 점은 사용자가 CPU/GPU level을 설정하더라도 단말의 상황이나 정책에 따라 항상 설정한 level 값이 적용 되거나 유지되는 것은 아닙니다.




Control Custom Scaler with Device thermal feedback


만약 개발자가 Power Manager를 통한 자동 성능 조절 기능 외에 추가적인 성능 개선을 하고 싶다면 Custom Scaler를 사용할 수 있습니다.

Adaptive Performance API는 현재 단말의 온도 정보를 warning level 을 통해 알려주고, 더 자세한 온도 레벨은 Temperature Level을 통해 제공합니다. 이를 통해, 개발자는 Adaptive Performance에서 제공하는 Warning Level signal로 단말의 온도 변화와 Throttling 제어 시점을 알 수 있습니다. 이런 타이밍 정보를 활용하여 개발자가 원하는 부분의 Quality Scaling을 조절한다면 단말의 발열 제어 시점 이전에 선제적으로 발열을 관리하고, 배터리를 오래 쓸 수 있도록 할 수 있습니다.

아래 예시는 Custom Scaler factor로 온도 정보를 이용해 global LOD bias를 조절하는 구현 예제입니다.


using UnityEngine;
using UnityEngine.AdaptivePerformance;

public class AdaptiveLOD : MonoBehaviour
{
    private IAdaptivePerformance ap = null;

    void Start() {
        ap = Holder.Instance;
        if (!ap.Active)
            return;

        QualitySettings.lodBias = 1.0f;
        ap.ThermalStatus.ThermalEvent += OnThermalEvent;
    }
        void OnThermalEvent(ThermalMetrics ev) {
        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;
        }
    }
}





Adaptive Performance 1.0 Performance Result


지금까지 Adaptive Performance 1.0에서 제공하는 기능에 대해 알아 보았습니다. 다음은 Unity의 Megacity Demo에 Adaptive Performance를 적용하여 그 효과를 확인한 결과입니다.



위의 파란색 그래프는 Adaptive Performance를 적용하여 Auto Performance Control 기능을 사용한 경우이고, 빨간색 그래프는 Adaptive Performance를 사용하지 않은 경우를 나타냅니다. Target FPS는 두 케이스 모두 30이지만, Adaptive Performance를 사용한 경우 훨씬 안정적으로, 오래 30fps를 유지하는 결과를 확인 할 수 있습니다.




※ Adaptive Performance 1.0 지원 버전과 더 자세한 User Guide 및 FAQ에 대해서는 아래에서 확인하실 수 있습니다.


Unity Editor Version Adaptive Performance Package Version
Unity 2018 LTS+ 1.1.9
Unity 2020.1+
Unity 2019 LTS

1.2.0


  • Detailed User Guide from Unity (Click)

  • Unity Adaptive Performance FAQs (Click)