언리얼 엔진 4 – 200 FPS 가이드

언리얼 엔진 4 – 200 FPS 가이드(번역)

원문 링크


업데이트: 일부 개발자들이 이 글을 언급해서 몇 마디 남기자면, 이 가이드는 인디 개발자(성능 최적화를 위한 전문 엔진 프로그래머가 없는)를 위한 내용입니다. 이 가이드는 규모가 큰 스튜디오에는 맞지 않을 수도 있습니다.

업데이트: 언리얼 4.14에 포워드 렌더러가 추가됐습니다. Dashing Dinos에 포워드 렌더러를 적용해 ~5-10ms 정도의 프레임 시간을 절약했습니다. 포워드 렌더러를 사용하기 전과 시각적 퀄리티는 비슷하거나, 어느 부분에서는 심지어 이전보다 나은 퀄리티를 보여줬기 때문에 풀 1080p 해상도를 지원할 수 있었습니다(r.ScreenPercentage=100). 유일한 단점은 SSAO를 사용할 수 없다는 점입니다.


우리 게임을 XboxOne으로 포팅하는 과정에서 기존의 그래픽 설정을 적용하면 20FPS라는 결과를 얻었습니다(성능 좋은 PC에서 90FPS의 속도에서 떨어진 수치). Dashing Dinos는 부드러운 느낌을 주기위해 최소 60FPS의 속도로 실행되어야 했습니다. 포팅 과정에서 비주얼 퀄리티를 많이 낮추고 싶지 않았기 때문에 이는 매우 큰 도전이었습니다. 특히 VR 시장이 점점 커짐에따라 이미 여러 포스트에서 UE4의 성능을 향상시키는 방법에 대해 다루고 있습니다. 그럼에도 자세하게 적은 이 포스팅이 동일한 문제를 겪고있는 누군가에게 도움이 되길 바랍니다.

우선 이 가이드는 CPU가 아닌 GPU 성능 최적화에 중점을 두고있습니다. 본 가이드에서는 엔진에 대한 수정을 거치지 않으며 C++의 기반 지식이 없어도 쉽게 이해할 수 있을 것입니다. 하지만 여러분 게임의 성능을 프로파일링하는 방법은 확실히 알고 있어야 합니다. 프로파일링 방법을 모르는 경우에는 에픽에서 제공하는 문서 퍼포먼스와 프로파일링을 참고하시기 바랍니다.

“stat fps” 명령을 이용해서 성능을 제한하는 항목을 확인하고, 성능을 제한하는 항목이 GPU 바인딩인지 확인합니다. 성능을 조절할 때 GPU 프로파일러를 자주 사용하는 것이 좋습니다(단축키: Ctrl + Shift + ,).

 

퀄리티 설정 (~80FPS)

 

명령 우선 순위(Command Priorities)

구체적으로 설정 변수(config variables) 및 성능 설정에 대해 살펴보기 전에 이 값들을 설정하기 위해 UE4가 어떻게 여러 메소드의 우선순위를 정하는지에 대한 내용에 대해 살펴보겠습니다. 높은 우선순위를 갖는 값이 낮은 우선순위를 갖는 값을 항상 덮어씁니다. 따라서 게임의 품질 수준을 다르게 설정할 때 이 점을 항상 명심하고 작업에 임해야 합니다. 다음은 우선순위가 가장 높은 순서부터 낮은 우선순위를 갖는 값까지 나열한 것입니다.

1. 장치 프로파일(DeviceProfiles)

2. 콘솔 명령어(Console commands)

3. 품질 설정(Scalability settings)

 

DefaultDeviceProfiles.ini

DefaultDeviceProfiles.ini는 프로젝트의 config 폴더에 있는 설정 파일입니다(예: \DashingDinos\Config\DefaultDeviceProfiles.ini). 이 파일이 존재하지 않는 경우 그냥 만들면 됩니다. .ini  파일에 명령을 바로 설정하거나 에디터를 통해서 설정할 수 있습니다. 다음은 에디터에서 파일 내부에 접근하는 방법과 Notepad++와 같은 텍스트 편집기에서 설정 파일이 어떻게 보이지는 지를 보여주는 예제입니다.

DefaultDeviceProfiles.ini 변경하기

 

DeviceProfile 명령은 다른 명령을 모두 덮어쓰기 때문에 이 곳에 설정하는 항목을 잘 고려해야 합니다. 따라서 우리는 XboxOne에 포팅하는 과정에서 DeviceProfile을 거의 독점적으로 사용합니다(한 레벨의 품질만 필요하기 때문에). PC의 경우 하드웨어 사양에 따라서 사용자가 품질 수준을 전환하고 싶어할 수도 있기 있기 때문에 콘솔 명령이나 품질 설정(scalability)을 통해 값을 설정할 필요가 있습니다. 모든 품질에서 공유되는 명령만 Windows DeviceProfile에 기록합니다.

 

[Windows DeviceProfile]

+CVars=r.HZBOcclusion=0
+CVars=r.MotionBlurQuality=0

 

Windows에 대한 설정은 나중에 다시 살펴보고 일단은 XboxOne에 집중하겠습니다. 다음은 Dashing Dinos에 사용되는 모든 명령에 대한 내용입니다.

[XboxOne DeviceProfile]

DeviceType=XboxOne
BaseProfileName=
MeshLODSettings=
TextureLODSettings=

; SetQuality
+CVars=sg.AntiAliasingQuality=4
+CVars=sg.EffectsQuality=3
+CVars=sg.PostProcessQuality=3
+CVars=sg.ShadowQuality=1
+CVars=sg.TextureQuality=3
+CVars=sg.ViewDistanceQuality=1

; SetQualityAdvanced
+CVars=r.HZBOcclusion=0
+CVars=r.SceneColorFringeQuality=0
+CVars=r.SSR.Quality=0
+CVars=r.SceneColorFormat=3
+CVars=r.TranslucentLightingVolume=0
+CVars=r.TranslucencyVolumeBlur=0
+CVars=r.TranslucencyLightingVolumeDim=4
+CVars=r.TiledDeferredShading=0
+CVars=r.TiledReflectionEnvironmentMinimumCount=10

; PostProcessEffects
+CVars=r.PostProcessAAQuality=3
+CVars=r.LightshaftQuality=0
+CVars=r.MotionBlurQuality=0
+CVars=r.BloomQuality=0
+CVars=r.EyeAdaptationQuality=0
+CVars=r.LensFlareQuality=0
+CVars=r.AmbientOcclusionLevels=0

; ScreenPercentage
+CVars=r.ScreenPercentage=85

설정에서 볼 수 있듯이 품질 명령(scalability commands)이 먼저 설정되고 (sg.xxx) 개별 값들은 나중에 설정됩니다. 품질 설정을 살펴보면 꽤 높은 품질(Effects-, PostProcessing-, TextureQuality=3)이 사용될 거라고 가정하지만, 대부분의 설정들은 나중에 아래쪽에 있는 개별 명령에 의해 덮어 쓰여집니다.

여기서 사용되는 모든 값들은 시각적 퀄리티와 성능 사이에서 서로 균형을 이루는데(시각적 퀄리티를 높이면 성능이 떨어지고, 성능을 높이면 시각적 퀄리티가 낮아짐) 특히 “r.ScreenPercentage”가 그렇습니다. 이 값을 85로 낮추면, 성능에 엄청난 영향을 줍니다. 더 적은 픽셀을 렌더링하고 이렇게 렌더링된 이미지를 확대하면 분명 퀄리티는 낮아지지만 AntiAliasing 및 TextureQuility 설정을 늘리며 최대한 좋은 결과를 얻으려고 노력했습니다. 시각적 퀄리티를 크게 잃지 않는 수준에서 “r.ScreenPercentage”를 낮게 설정하면 FPS가 치솟는 것을 볼 수 있을 것입니다.

 

PC – 품질 수준

모든 설정이 좀 더 복잡한 Windows를 다시 살펴보겠습니다. 플레이어들은 게임이 완전히 다른 방식으로 동작하는 다양한 하드웨어 설정을 갖고 있습니다. 이는 여러분들에게 어려움으로 다가오지만, 이에 대해 여러분이 할 수 있는 것은 없습니다. 하지만 개발자로서 우리가 할 수 있는 일은 플레이어가 원활한 플레이 경험을 얻을 수 있도록 자신의 필요에 따라 설정을 변경할 수 있도록 하는 것입니다. Dashing Dinos에 수백 개의 개별 설정을 제공할 수는 없었기 때문에 품질 수준에 따라 미리 지정해 놓은 몇 가지 설정을 따로 제작했습니다.

C++를 활용해 품질 레벨 데이터 애샛 설정하기

 

데이터 애샛을 생성하는 방법이 궁금한 경우 왼쪽의 코드를 살펴보면 됩니다. 데이터 애샛은 개별 품질 설정 값들을 저장하기 때문에 그래픽 옵션에서 이를 적용할 수 있습니다.

데이터 애샛에 설정한 값이 XboxOne의 DefaultDeviceProfile.ini에서 설정한 값과 매우 유사하다는 것을 확인할 수 있을 것입니다. 하지만 이 시스템은 여러 수준의 품질을 지원할 때 훨씬 유연하고, 이 점 때문에 PC에서 매우 유용하게 사용할 수 있습니다.

품질 수준에 대한 개별 값에 대해 궁금하거나 이런 설정 값들을 적용하는 방법이 궁금한 경우 댓글(원문에 댓글을 달아주세요)을 달아주시면 해당 정보를 추가하겠습니다.

이를 통해 주요 최적화가 완료되었습니다. 흥미로운 부분이 이제 나오는데, 그리 명확하지 않은 부분에 대한 최적화를 진행합니다.

 

Advanced Improvements (~55 FPS)

 

포스트 프로세싱 및 파티클 이펙트 (~10 FPS)

품질 수준 및 DeviceProfiles에서 포스트 프로세스 설정 중의 일부를 조정함으로써 포스트 프로세스와 관련된 대부분의 성능 저하 요인에 대해 이미 처리를 완료했습니다. 하지만 예를 들어 Dashing Dinos에서 Depth of Field는 완전히 비활성화 하고 싶었는데, 불행히도 Depth of Field가 필요한 특정 씬이 있었기 때문에 이 설정을 기본 설정에서 비활성화할 수 없었습니다. 일부 포스트 프로세스 이펙트는 플랫폼에 따라서 매우 다르고 이에 따른 유연성이 필요하기 때문에 PC와 XboxOne에서 사용할 PostProcessVolume을 두 개로 나눠서 제작했습니다. 그런 다음 플랫폼에 따라 이 볼륨을 각각 활성화 및 비활성화 시켰습니다. 다음은 게임에서 사용된 레벨 블루프린트에 대한 예시입니다.

플랫폼에 따라 PostProcessVolume과 파티클 이펙트 전환하기

 

XboxOne에서는 포스트 프로세스 효과외에도 배경 파티클 이펙트의 대부분을 비활성화 했습니다. 예를 들어 먼지 및 안개(Dust and fog) 파티클은 오버 드로우(OverDraw)로 인해 비용이 매우 높습니다. 뷰포트에서 Shader Complexity View Mode를 활성화하면 파티클 이펙트가 얼마나 비용이 높은지 확인할 수 있습니다.

레벨에서 사용된 먼지 및 godray 파티클 이펙트

 

파티클 이펙트의 쉐이더 복잡도

 

라이트 & 그림자 (~40 FPS)

동적 라이트 및 그림자는 성능을 저하시키는 요인입니다. 가능하면 이들의 사용을 피하는 것이 좋습니다. 미리 구울 수 있는 것은 모두 구워서 사용하고 스태틱 라이트와 스테이셔너리 라이트만 사용하는 것이 좋습니다. Dashing Dinos에서는 동적 라이트나 그림자가 전혀 사용되지 않습니다. 얼음, 수정, 바위 등에서 멋진 반사효과를 얻기 위해 스테이셔너리 라이트가 일부 사용되자만 동적 그림자는 모두 비활성화 했습니다.

가능하면 동적 그림자 비활성화하기

 

예를 들어 모든 캐릭터 그림자는 데칼(Decal)을 활용한 가짜 그림자를 사용합니다. 데칼을 적용한 그림자를 사용할 수 있는지 여부는 여러분이 제작한 게임에 달려있습니다. 이렇게 제작된 그림자는 실제 그림자처럼 보이지는 않기 때문에 이로 인해 시각적 퀄리티가 낮아질 수 있습니다. 하지만 우리의 경우와 같이 isometric perspective를 사용하는 경우 가짜 그림자를 사용하면서 발생하는 차이가 매우 작고 이를 통해 얻을 수 있는 성과는 매우 큽니다.

가짜 그림자를 위해 사용된 Decal 컴포넌트

 

게임 내에서 사용된 가짜 그림자

 

반투명 (Translucency) (~5 FPS)

반투명 (Translucent) 물체는 비용이 비싸기 때문에 항상 오버드로우(overdraw)를 최소화해야 합니다. 이는 파티클 이펙트에도 적용됩니다. 언리얼 엔진은 수만 개의 폴리곤을 아주 잘 처리하기 때문에 오버드로우를 줄이기 위해 여분의 메쉬를 만드는 것은 상황에 따라 좋은 방법이 될 수 있습니다. 아래 그림에서 로고를 살펴보면 많은 양의 오버드로우를 줄이기 위해 평면 대신 독특한 형태의 메쉬를 사용한 것을 볼 수 있습니다.

 

독특한 모양의 메쉬를 제작해서 오버드로우 줄이기

 

마무리

다음은 PC(CPU: i7-4790K, GPU: GTX 970) 및 XboxOne에서 실행한 FPS 결과 입니다.

  • XboxOne: 60FPS
  • PC 가장 높은 설정: ~90FPS
  • PC 가장 낮은 설정: ~200PFS

포스팅을 정리하며 다양한 품질 수준을 적용해 여러 플랫폼에서 실행한 스크린샷을 남깁니다.

 

Windows – 가장 높은 퀄리티 설정

 

Windows – 가장 낮은 퀄리티 설정

 

XboxOne – 60FPS

 

내용 끝까지 읽어주셔서 감사합니다.
배너 클릭은 저에게 많은 힘이 됩니다.
감사합니다 🙂

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, C++/C#, 1인 기업에 관심이 많습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Please turn AdBlock off

Notice for AdBlock users

Please turn AdBlock off