en ko

Adaptive Performance 2.0





Adaptive Performance가 첫 선을 보인 후 12개월만인 2020년 8월 발표된 2.0 버전에서는 1.0에서 아쉬웠던 부분에 대해 집중했습니다. 컨텐츠 조절 기능과 개발자들의 사용성 강화를 위해 3가지 측면의 개선을 진행했습니다.


  • Indexer and Quality Scaler
  • Unity Editor UX/UI
  • Simulator

1.0에서 개발자가 직접 구현해야 했던 컨텐츠의 실시간 조절 기능을 Quality Manager 시스템을 구현하여 다양한 Built-in Scaler로 제공하면서, 개발자들이 Adaptive Performance 의 여러기능들을 더 쉽고, 편하게 사용할 수 있도록 Editor의 UX/UI를 추가했고, Simulator를 통해 단말에 직접 연결하지 않고도 손쉽게 동작 상황에 대한 테스트를 할 수 있게 만들었습니다.

세부 구현 사항은 아래와 같습니다.




Unity Editor UX/UI


Adaptive Performance Package와 Adaptive Performance Samsung Android Package를 설치하면, Project Settings 에 Adaptive Performance 가 추가 된 것을 확인 할 수 있습니다. 정상적인 사용을 위해서는 우선 Providers를 선택해야 합니다.

단말에서 사용하는 경우, 아래와 같이 Samsung Android Provider를 선택합니다.





Simulator에서 사용하는 경우, PC MAC & Linux Standalone settings에서 Device Simulator Provider를 선택하면 됩니다.

Provider을 선택까지 완료했다면, Project Settings의 Adaptive Performance UI를 통해 간편하게 Adaptive Performance 기능을 사용할 수 있습니다.

Auto Performance Mode는 1.0 부터 제공되어 온 Power Manager 사용에 대한 항목으로 최고의 성능을 제공하면서 동시에 배터리 소모를 줄이기 위해 CPU와 GPU Level 변화에 따라 자동으로 성능을 조절합니다. Adaptive Performance setting에서 이 모드를 체크하고, Indexer Settings의 Active 항목을 활성화 하면 설정하려는 Scaler를 간단한 checkbox와 단계 조정만으로 사용할 수 있습니다. 이 경우, Scaler의 설정이 프로젝트 전체에 적용됩니다. Scene 별로 다르게 설정하고 싶다면, Adaptive Performance Setting Object를 Scene에 붙여 더 세세한 설정을 할 수 있습니다.




Simulator


2.0 에서는 시뮬레이터 기능을 추가해 개발자들이 단말 없이도 간단하게 발열 상황에서의 동작을 확인하거나, Scaler 값을 변경한 결과를 확인할 수 있도록 했습니다. 시뮬레이터를 사용하려면 Package Manager에서 Device Simulator Package를 다운받아야 합니다. Project Settings > Adaptive Performance > Simulator 에서 위의 Unity Editor UX/UI 와 마찬가지로 Scaler 별 세팅을 할 수 있습니다.



원하는 Scaler 세팅을 마쳤다면, Window > General > Device Simulator 로 시뮬레이터 창을 열고, 이를 통해 온도와 Bottleneck 조건에 따라 조절되는 Adaptive Performance 동작을 미리 확인 할 수 있습니다.






Indexer and Quality Scaler


Indexer는 단말의 온도와 성능 상태에 따라 게임의 퀄리티를 조절하는 Adaptive Performance System을 말하며, 이 시스템 안에서 퀄리티를 조절할 수 있는 각각의 항목을 Scaler라고 합니다.

Scaler는 다음과 같은 우선 순위에 영향을 받아 실시간으로 각각 어떻게 조절될 지 결정됩니다.


  • Target Current Bottleneck
  • Lowest Level
  • Lowest Visual Impact

Scaler는 Indexer Settings이 Active 로 활성화 되어있을 때만 동작하며, 이는 앞서 Editor UI에서 살펴 본 Project Setting 창에서 설정할 수 있습니다.





Built-in Scalers


현재 2.0에서 제공하는 Built-in Scaler 들은 아래와 같습니다.

General Render

  • Adaptive Framerate : 정의된 최소/최대값의 범위 안에서 게임의 framerate를 자동으로 조절
  • Adaptive LOD : 단말의 온도와 성능 로드에 따라 LOD bias 값을 조절
  • Adaptive Resolution : 정의된 범위 내에서 화면 해상도를 자동으로 조절

Universal Render Pipeline Scalers

Universal Render Pipeline(URP)의 세팅 값을 이용하는 Scaler입니다. URP가 아닌 다른 Render Pipeline을 사용할 시, 변화가 없습니다.

  • Adaptive Batching : 온도와 성능 로드에 따라 Dynamic batching을 전환
  • Adaptive LUT : Universal Render Pipeline의 LUT bias 값을 변경
  • Adaptive MSAA : URP의 Anti Aliasing Quality Bias 값을 변경. 카메라의 SMAA(Post Processing Subpixel Morphological Anti-Aliasing) 품질 수준에만 영향
  • Adaptive Shadow Cascades : URP의 Main Light Shadow Cascades Count Bias 값을 변경
  • Adaptive Shadow Distance : URP의 Max Shadow Distance Multiplier 값을 변경
  • Adaptive Shadow Quality : URP의 Shadow Quality Bias 값을 변경
  • Adaptive Shadow map Resolution : URP의 Main Light Shadowmap Resolution Multiplier 값을 변경
  • Adaptive Sorting : URP의 front-to-back sorting 방식을 건너 뜀

Built-in Scaler는 개발자들이 좀 더 편하게 컨텐츠의 Quality 조절 을 할 수 있도록 기본 제공됩니다. 개발자들은 어떤 Quality를, 어느 범위 안에서 조절할 것인지 기본 제공 UI에서 선택할 수 있기 때문에 쉽고 안전하게 사용할 수 있습니다.



Custom Scaler

위 Built-in Scaler 외에 개발자가 직접 Custom Scaler를 만들 수 있는데, 이는 AdaptivePerformanceScaler 를 상속받는 새로운 클래스를 생성하면 됩니다.

아래는 AdaptivePerformanceScaler를 상속받은 TextureQualityScaler 예제입니다.




public class TextureQualityScaler : AdaptivePerformanceScaler
{
   public override ScalerVisualImpact VisualImpact => ScalerVisualImpact.High;
   public override ScalerTarget Target => ScalerTarget.GPU;
   public override int MaxLevel => 2;

   int m_DefaultTextureQuality;

   protected override void OnDisabled()
   {
       QualitySettings.masterTextureLimit = m_DefaultTextureQuality;
   }

   protected override void OnEnabled()
   {
       m_DefaultTextureQuality = QualitySettings.masterTextureLimit;
   }

   protected override void OnLevel()
   {
      switch (CurrentLevel)
      {
         case 0:
            QualitySettings.masterTextureLimit = 0;
            break;
         case 1:
            QualitySettings.masterTextureLimit = 1;
            break;
         case 2:
            QualitySettings.masterTextureLimit = 2;
            break;
      }
   }
}



Samsung Provider Scaler


Samsung Provider를 선택하여 Samsung Provider Scaler를 사용하도록 설정한 경우, VRR (Variable Refresh Rate) 과 관련된 삼성 특화 feature인 Adaptive VRR scaler를 사용할 수 있습니다. 현재 Galaxy 단말 중 VRR을 지원하는 단말은 Galaxy S20입니다.

기본적으로 VRR을 지원하는 단말에서는 Automatic VRR 기능을 사용할 수 있습니다. 이는 Project Settings에서 enable 할 수 있는 항목으로, 자동으로 현재 framerate에 맞는 refresh rate를 설정해 배터리 소모를 줄일 수 있는 Scaler입니다.

Samsung Provider에서는 Automatic VRR과 Adaptive Framerate을 동시에 enable 할 경우, Adaptive VRR 기능이 동작합니다. Adaptive VRR이 동작하면 Automatic VRR과 Adaptive Framerate 세팅에서 최소/최대값으로 설정해둔 값 사이에서, 달성할 수 있는 framerate에 가장 가까운 refresh rate으로 동작합니다. 이를 통해 씬 별 target framerate 설정이 가능하며, 원하는 범위 안에서 단말의 온도나 상태 등에 따라 framerate을 부드럽게 조절할 수 있어 사용자들이 VRR 조절에 따른 위화감을 느끼지 않고 게임을 플레이 할 수 있습니다.

Adaptive VRR은 Adaptive Framerate Sample을 통해 동작을 확인 할 수 있습니다.





What will change with Quality Scaler


컨텐츠의 Quality 조절은 게임의 서비스 품질이 떨어질 수 있기 때문에 개발자들에게 거부감을 줍니다. 그러나 2.0 의 Quality Manager 는 Scaler 조절에 따른 Visual Impact을 최소화 하도록 추가적인 옵션을 제공합니다. 각각의 Scaler들은 Visual Impact 옵션을 가지고 있는데, 성능 조절 시 해당 값을 반영하여 동작하게 됩니다.

아래의 이미지는 Unity Boat Attack Demo이며, LOD Level에 따른 차이가 얼마나 눈에 보이는지 비교할 수 있습니다. 비교 확대한 부분을 보면, LOD Level이 낮을 때 일부 나무가 사라진 것을 볼 수 있습니다.





이처럼 화면 상의 차이를 육안으로 확인 할 수 있는 Scaler가 있는가 하면, 반대로 Visual Impact이 거의 없는 Scaler도 있습니다.

다음은 Texture Quality Level에 따른 차이를 비교한 예시입니다. 눈으로는 거의 차이를 확인할 수 없지만, RenderDoc 캡쳐를 보면, 실제 텍스쳐의 크기가 줄어든 것을 확인 할 수 있습니다.





두 가지 예시에서 볼 수 있듯, Scaler의 종류에 따라서 Visual Impact의 차이가 생기기도 하지만, 같은 Scaler 안에서도 범위를 어떻게 설정하느냐에 따라 다른 Visual Impact이 생길 수 있습니다. 따라서 개발자가 각자의 기준에 맞춰 성능과 Quality 사이의 균형을 적절하게 설정하는 것을 권장합니다.




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


Unity Editor Version Adaptive Performance Package Version
Unity 2020.2.0a7+
Unity 2020.1.0b5+
Unity 1019.3.11f1

2.0.0


  • Detailed User Guide from Unity (Click)

  • Unity Adaptive Performance FAQs (Click)