IT_Games/UNREAL

[펌][UE4] 모바일 디바이스용 퍼포먼스 지침서 / 모바일 퍼포먼스 팁과 꼼수

JJun ™ 2016. 10. 28. 04:20



 출처

 : https://docs.unrealengine.com/latest/KOR/index.html

 : https://docs.unrealengine.com/latest/KOR/Platforms/Mobile/Performance/index.html

 : https://docs.unrealengine.com/latest/KOR/Platforms/Mobile/Performance/TipsAndTricks/index.html




모바일 디바이스용 퍼포먼스 지침서

아래는 모바일 플랫폼에서 퍼포먼스를 최대화시키기 위한 콘텐츠 구성 방식의 주의 또는 제안 사항입니다. 순서는 중요도 순입니다.

  • 디바이스에서 실행하기 전 라이팅이 빌드되었는지 확인합니다.

  • 대부분의 포스트 프로세스 기능이 꺼졌는지 확인합니다. 사실 아이패드4 에 사용할 수 있는 기능은 템포럴 AA 와 비녜트를 포함한 필름 기능 뿐입니다. PC 에도 모바일에도 같은 세팅을 적용해 뒀기 때문에 블룸이나 DOF 같은 비싼 기능들도 기본적으로 켜져 있습니다. 기본 세팅으로만 해도 포스트 프로세스 기능의 비용은 60 ms 를 우습게 넘어갑니다. 고사양 디바이스에서는 블룸, DOF, 라이트 섀프트를 사용할 수 있게 되기를 바랍니다. 디바이스에서 show postprocessing 으로 포스트 프로세스를 토글시켜 가며 그 비용을 확인할 수 있습니다.

  • Precomputed Visibility 볼륨이 제대로 설정되었는지 확인합니다. 그러기 위해서는 플레이어가 걸어다닐 수 있는 구역에 PrecomputedVisibilityVolume 을 배치한 다음 라이팅을 빌드합니다. 라이팅 빌드시와 게임 실행시 같은 P 레벨이 사용되는지 확인해야 합니다 (즉 서브레벨 자체만 빌드할 필요는 없습니다). 디바이스나 프리뷰어에서 stat initviews 라 입력하고 Statically occluded primitives (정적으로 가려진 프리미티브)가 0 초과인지 확인하는 것으로 작동 여부를 점검할 수 있습니다. r.ShowPrecomputedVisibilityCells 1 를 사용하면 에디터에서 셀을 시각화시켜 볼 수 있습니다.

  • 반투명 & 마스크드 머티리얼을 사용할 때는, 화면의 작은 부분에만 적용되도록 주의해서 사용하세요. iOS 디바이스는 불투명한 표면의 셰이딩에 매우 최적화되어 있어서, 대부분 각 픽셀 셰이딩은 한 번만 합니다. 그러나 반투명 & 마스크드의 경우, 레이어 하나마다 셰이딩을 해야 합니다. 오버드로 때문에 한 프레임의 총 GPU 시간이 우습게 두배 이상 될 수 있는 것입니다. 모바일 프리뷰어의 셰이더 복잡도 뷰모드를 사용하면 핫 스팟을 조사해 볼 수 있습니다.

  • 전체 씬의 드로 콜 수는 어느 뷰에서는 700 이하여야 합니다. 오클루전이 거의 없어 배경이 펼쳐지는 영역에서 이 부분이 가장 큰 문제가 될 수 있습니다. 이 수치는 디바이스에서는 stat openglrhi 로, PC 의 ES2 프리뷰어에서는 stat d3d11rhi 로 확인할 수 있습니다.

  • 전체 씬의 트라이앵글 수는 어느 뷰에서는 500k 이하여야 합니다. 이 수치는 아이패드4 와 아이패드 에어에서 30 fps 를 맞추기 위해 결정된 수치입니다. 이 수치는 디바이스에서는 stat openglrhi 로, PC 의 ES2 프리뷰어에서는 stat d3d11rhi 로 확인할 수 있습니다.

  • 머티리얼에서 사용하는 텍스처 룩업 및 인스트럭션 수를 가급적 줄여야 합니다. 사용할 수 있는 텍스처 샘플러는 5 개까지이며, 그 전부를 사용하면 머티리얼 비용이 꽤나 비싸집니다. 현재로서는, PC 인스트럭션 수로 최적화시키고, ES2 프리뷰어 셰이더 복잡도 뷰모드로 총 비용을 시각화시켜 봅니다.

  • 머티리얼에서는 독립 텍스처 펫치만 사용합니다. 즉 픽셀 셰이더(베이스 컬러, 러프니스 등)의 UV 는 어떤 식으로든 (스케일 등의) 조작을 해서는 안된다는 뜻입니다. 대신 새로운 CustomizedUVs 기능을 사용하여 스케일 작업을 버텍스 셰이더에서 해 주세요. 인바이언먼트 매핑같은 특수 기능 일부는 UV 에서의 수학이 필요하나, 특별한 경우에는 괜찮습니다.

  • 메모리 낭비가 적은 정사각 텍스처를 사용하는 것이 좋으며, 항상 2 제곱수(512, 1024, 2048) 크기를 사용하세요. ES2 프리뷰어에서는 listtextures 로 텍스처 메모리가 어디로 갔는지 확인할 수 있습니다.

퍼포먼스 단계

UE4 에는 모바일 디바이스용 다양한 라이팅 기능을 지원합니다. 이 기능을 사용하면 퍼포먼스 비용이 들며, 느린 모바일 디바이스에서는 게임 퍼포먼스가 조악해 질 수 있습니다. UE4 의 모바일 라이팅 기능 대부분을 섞어 붙일 수는 있지만, 다음과 같은 기능 단계(feature tier)별로 나누는 것이 유용할 수는 있습니다. 모바일 게임을 만들 때는, 게임에 필요한 그래픽 퀄리티와 지원하고자 하는 디바이스 유형을 결정해야 합니다. 에픽에서 테스트를 거쳐 디바이스별로 적합하다 생각되는 기능 단계에 대한 정보는, iOS 개발 및 안드로이드 개발 문서를 참고해 주시기 바랍니다.

LDR (Low Dynamic Range)

로우 다이내믹 레인지(LDR) 모드는 UE4 에서 지원되는 퍼포먼스 단계 중 가장 높은 것으로, 라이팅이나 포스트 프로세싱 기능이 필요치 않은 게임에 추천됩니다. 이 모드를 사용하기 위해서는, 프로젝트 세팅 의 렌더링 부분에서 Mobile HDR 옵션을 꺼야 합니다.

장점

  • 모바일 디바이스에서 사용 가능한 모드 중 부하가 가장 적고 가장 빠른 모드입니다. 게임이 느린 모바일 디바이스에서 잘 돌아갈 수 있습니다.

  • 그럼에도 머티리얼 에디터의 모든 기능을 사용하여 커스텀 셰이더를 정의하거나, 심지어 단순한 셰이딩을 통해 라이팅을 흉내낼 수도 있습니다.

한계

  • 씬의 색 각 컬러 채널이 [0,1] 범위로 클램핑되어 감마 스페이스로 쓰여집니다.

  • 반투명 프리미티브가 감마 스페이스에서 블렌딩됩니다. 그때문에 대부분의 경우 HDR 이나 일반 PC 게임용 머티리얼을 제작할 때와는 다른 방식으로 반투명 텍스처와 머티리얼을 따로 제작해 줘야 합니다.

  • 이 모드에서는 포스트 프로세싱 기능을 사용할 수 없습니다.

추천

  • 최대 퍼포먼스를 위해 모든 머티리얼의 셰이딩 모델이 Unlit (라이팅제외)로 설정되었는지 확인합니다.

  • 씬에 라이트를 배치하지 않거나, 해도 최대한의 퍼포먼스를 내는 쪽으로 합니다.

  • 가급적 많은 연산을 머티리얼의 버텍스 셰이더에서 할 것을 고려합니다. Customized UVs 를 켜고, 노드를 연결해 준 다음, Texture Coordinate 노드로 픽셀 셰이더에서 읽어주면 됩니다.

기본 라이팅

이 단계는 스태틱 라이팅과 fully rough (풀 러프니스) 머티리얼을 활용하여 레벨에 유의미한 라이팅을 주면서도 퍼포먼스를 최대한 끌어올려 다양한 모바일 디바이스를 아우릅니다.

장점

  • 스태틱 라이팅, 글로벌 일루미네이션 기능을 사용할 수 있습니다.

  • 톤 매핑같은 일부 포스트 프로세싱 기능이 가능한 풀 HDR 파이프라인 입니다.

  • 반투명이 리니어 스페이스에서 블렌딩되어 다른 UE4 게임 제작시와 마찬가지의 콘텐츠 저작이 가능합니다.

한계

  • 모든 머티리얼을 풀 러프니스로 만들기 때문에, 재미난 스페큘러 반사가 없습니다.

  • 라이트맵 방향성도 끈다면 노멀 맵의 효과가 없습니다.

추천

  • 모든 머티리얼에 fully rough 플래그 세트를 붙여 만듭니다.

  • 머티리얼에 라이트맵 방향성을 꺼 추가적인 퍼포먼스를 낼 수 있습니다.

  • 맵에 스태틱 라이트만 사용합니다.

  • 블룸과 안티앨리어싱을 끕니다. 또한 기본적인 필름 및 컬러 콘트롤만 고수합니다. 자세한 것은 모바일 포스트 프로세스 문서를 참고하세요.

풀 HDR 라이팅

이 단계에서는 UE4 의 모바일용 HDR 라이팅 기능 뿐만 아니라 일부 포스트 프로세싱 기능까지도 최대한 활용합니다. 이 기능을 사용하면 하이 퀄리티 라이팅 기능을 댓가로 퍼포먼스가 꽤 듭니다.

장점

  • 스태틱 라이팅, 글로벌 일루미네이션 기능을 사용할 수 있습니다.

  • 일부 포스트 프로세싱 기능이 가능한 풀 HDR 파이프라인 입니다.

  • 반투명이 리니어 스페이스에서 블렌딩되어 다른 UE4 게임 제작시와 마찬가지의 콘텐츠 저작이 가능합니다.

  • 다양한 러프니스가 지원되어 표면에 사실적인 스페큘러 반사가 가능합니다.

  • 표면에 노멀 맵이 완벽 지원되어 메시에 다수의 폴리곤을 추가하지 않고도 재미난 표면 디테일이 가능합니다.

추천

  • 블룸을 켜서 HDR 라이팅 파이프라인의 장점을 최대한 활용해 보세요.

  • HDR 라이팅 조화된 사실적인 스페큘러 반사로 스페큘러에 계단현상이 생길 수 있습니다. 노멀 맵의 고주파 정보로 인한 스페큘러 계단현상을 줄이기 위해서는 러프니스 기능에 노멀 맵을 활용해야 할 것입니다. 이러한 부작용을 줄이기 위해 포스트 프로세스 볼륨에 안티앨리어싱을 켜는 것도 고려해 볼 만 합니다.

  • 최적의 결과를 얻기 위해서는 Reflection Captures (리플렉션 캡처) 위치를 잘 배치하는 것이 좋습니다. 자세한 정보는 리플렉션 문서를 참고하세요.

  • 최적의 퍼포먼스를 위해서는 씬에 스태틱 라이트와 라이트맵만 사용하세요.

태양의 픽셀별 라이팅 포함 풀 HDR 라이팅

이 단계는 UE4 모바일에서 사용가능한 모든 HDR 라이팅 기능을 활용합니다. 이 단계는 '풀 HDR 라이팅' 단계와 같으며, 추천 및 장점 부분도 같지만 훨씬 높은 퀄리티의 단일 디렉셔널 라이트가 렌더링된다는 차이가 있습니다.

장점

  • 풀 HDR 라이팅 단계의 모든 기능 및 장점이 포함됩니다.

  • 단일 디렉셔널 라이트에 대해 픽셀별 디퓨즈 및 스페큘러 라이팅이 가능합니다.

  • 단일 디렉셔널 라이트에 대해 높은 퀄리티의 미리계산된 디스턴스 필드 섀도가 가능합니다.

추천

  • 풀 HDR 라이팅 단계의 모든 추천 내용이 여기에도 적용됩니다.

  • 스테이셔너리로 설정해야 하는 단일 디렉셔널 라이트를 제외하고는 씬에 스태틱 라이트만 사용하세요.

셰이더 복잡도 뷰 모드

PC ES2 프리뷰어에서는 셰이더 복잡도 뷰모드를 사용하여 머티리얼 비용을 알아볼 수 있습니다. 사용하려면, PC ES2 프리뷰어의 콘솔에서 viewmode shadercomplexity 라 입력하면 됩니다. SM5 셰이더 복잡도에서와 마찬가지로, 초록은 퍼포먼스 괜찮음, 밝은 빨강은 매우 비쌈, 하양이나 분홍은 매우 비쌈을 뜻합니다. 모바일 쇼케이스에서의 예제는 이렇습니다:


모바일 콘텐츠 스케일 팩터

Mobile Content Scale Factor 는 프로젝트의 해상도가 이를 표현하는 모바일 디바이스의 화면 해상도에 가장 잘 맞도록 해상도에 스케일을 적용시키는 옵션입니다. 프로젝트의 config 폴더에 DefaultDeviceProfiles.ini 라는 환경설정 파일을 새로 만들면 여러 개의 디바이스 프로파일을 만들어 저장할 수 있습니다. 이 파일 안에서 다음 명령을 입력하면 프로젝트의 해상도를 어떻게 할지 지정할 수 있습니다.

 r.MobileContentScaleFactor = 

다음 그림에서는 위의 명령줄을 통해 Mobile Content Scale Factor 의 실사용 예제를 확인할 수 있습니다.

iOS 용 모바일 콘텐츠 스케일 팩터

iOS 디바이스에 Mobile Content Scale Factor 를 사용할 때 r.MobileContentScaleFactor 뒤에 붙는 수치를 입력해 주면 다음과 같은 결과가 납니다. 참고로 0.0 이외 스케일 팩터에 대한 실제 해상도는 화면 종횡비에 맞게끔 보정되고 원래 해상도에 제한됩니다.

iOS 스케일 팩터는 애플의 스케일 팩터 시스템에 직접 관련되어 있습니다.

명령결과
r.MobileContentScaleFactor0.0디바이스의 원래 해상도를 사용합니다.
r.MobileContentScaleFactor1.0레티나 디바이스에서는 비-레티나 해상도입니다.
r.MobileContentScaleFactor2.0아이폰 5s, 아이패드 에어 등의 원래 전체 해상도입니다.
r.MobileContentScaleFactor3.0아이폰 6+ 용 원래 전체 해상도입니다.

안드로이드용 모바일 콘텐츠 스케일 팩터

안드로이드 디바이스용 Mobile Content Scale Factor 사용시 r.MobileContentScaleFactor 뒤에 입력하는 수치에 따른 결과는 다음과 같습니다. 참고로 0.0 이외의 값을 입력하면 방향에 따라 1280x720 또는 720x1280 표준 해상도에 대한 스케일 인수로 이 값을 사용한다는 점 참고하시기 바랍니다.

명령결과
r.MobileContentScaleFactor0.0디바이스의 원래 해상도를 사용합니다.
r.MobileContentScaleFactor1.0가로는 1280 x 720, 세로는 720 x 1280 해상도를 내도록 시도합니다.
r.MobileContentScaleFactor2.0가로는 2560 x 1440, 세로는 1440 x 2560 해상도를 내도록 시도합니다.

모바일 머티리얼 퀄리티 세팅

고사양은 물론 저사양 모바일 디바이스에서도 실행되는 UE4 프로젝트용 콘텐츠를 제작할 때, 어떤 기능이 특정 디바이스 군에서는 되는데 다른 디바이스 군에서는 되지 않는 문제가 종종 생기곤 합니다. 아트워크의 경우도 한 디바이스에서는 괜찮아 보이는데 다른 디바이스에서는 완전히 달라 보이는 문제가 생기기도 합니다. 이런 문제를 처리하는 데는 여러가지 방법이 있지만, 보통 시간과 노력이 많이 드는 데다 오류에 취약하기도 합니다. 그래서 UE4 에서는 Material Quality Level (머티리얼 퀄리티 레벨)이라는 시스템을 사용합니다. 이 시스템은 하나의 머티리얼을 만들어 여러가지 다양한 디바이스에 사용할 수 있도록 해주는 것으로, 어느 디바이스에서 어느 기능을 사용하는지 완벽하게 제어할 수 있습니다. 여기서는 이 시스템에 대해, UE4 프로젝트에 사용하는 법에 대해 알아보도록 하겠습니다.

머티리얼 퀄리티 레벨 미리보기

머티리얼 퀄리티 레벨 관련 다양한 세팅은 UE4 에디터의 메인 툴바 > 세팅 > 머티리얼 퀄리티 레벨 에서 미리보고자 하는 퀄리티 레벨을 선택하는 것으로 확인할 수 있습니다.

머티리얼 퀄리티 레벨을 Low (낮음), Medium (중간), High (높음)으로 설정했을 때 머티리얼이 어떻게 보이는지는 다음 그림과 같습니다.

슬라이더를 끌면 머티리얼 퀄리티 레벨을 낮음, 중간, 높음으로 바꿀 때 벌어지는 일을 확인할 수 있습니다.


머티리얼 퀄리티 레벨 설정

UE4 에서 머티리얼 퀄리티 레벨을 설정하는 방법은 다음과 같습니다:

콘솔에서: 머티리얼이 사용할 퀄리티 레벨을 설정하는 방법은, 에디터에서 물결표() 키를 눌러 UE4 콘솔을 열고r.MaterialQualityLevel` 뒤에 다음 숫자 중 하나를 입력하면 됩니다.


머티리얼 퀄리티 레벨 숫자세팅
0낮음
1높음
2중간

높음이 1 이고 중간이 2 입니다. 오타가 아닙니다!

디바이스 프로파일에서: 머티리얼 퀄리티는 다음과 같은 방법으로도 조정할 수 있습니다:

  1. 메인 툴바에서  > 개발자 툴 로 이동하여 디바이스 프로파일 을 클릭합니다.

  2. 디바이스 프로파일에서 Android_Low 프로파일을 찾아 첫 번째 렌치 아이콘을 클릭하여 프로파일 옵션을 엽니다.



  3. Rendering (렌더링) 아래 Console Variables (콘솔 변수) 부분에서 더하기 아이콘을 클릭하면 뜨는 입력 창에서 R.MaterialQualityLevel 이라 입력하고 Enter 키를 쳐 목록에 그 명령을 추가합니다.

  4. 새로운 항목을 추가한 후, 기본값을 1 에서 0 으로 바꾸면 저사양 안드로이드 디바이스에서 프로젝트가 가장 빠른 머티리얼 세팅을 사용합니다.


여러가지 퀄리티 레벨 미리보기

프로젝트가 다양한 하드웨어에서 실행했을 때 어떻게 보이는지는 Preview Rendering Level (프리뷰 렌더링 레벨) 세팅을 조정하여 UE4 에디터에서 미리볼 수 있습니다. 이 세팅은 메인 툴바 에서 세팅 > Preview Rendering Level(프리뷰 렌더링 레벨)에서 사용하고자 하는 프리뷰 레벨을 선택하면 됩니다.

머티리얼 퀄리티 레벨 전환

Quality Switch 머티리얼 표현식으로 하나의 머티리얼 안에 다양한 수준의 복잡도를 정의할 수 있습니다. 예를 들어 복잡한 수학 연산이 있거나 고사양 디바이스에서만 작동하는 무거운 텍스처 읽기 작업이 있는 경우, 이 노드를 사용하면 고사양 그래픽 처리가 불가능한 저사양 디바이스에서 표시할 단순화된 버전을 지정할 수 있습니다.

머티리얼에서 Quality Switch 를 사용하려면, 먼저 머티리얼 그래프에 Quality Switch 머티리얼 표현식 노드를 추가한 뒤, 그 출력을 퀄리티 레벨 변경시 바뀌었으면 하는 메인 머티리얼 노드의 입력에 연결해 줘야 합니다. 다음 그림은, 시작용 콘텐츠에서 찾을 수 있는 M_Brick_Clay_Old 머티리얼을, 퀄리티 레벨을 바꿨을 때 머티리얼 복잡도가 감소되도록 구성한 것입니다.

모바일 머티리얼 옵션

아무 머티리얼 이나 열고 메인 머티리얼 노드를 클릭한 뒤 디테일 패널의 Mobile 부분을 보면 다음의 두 프로퍼티를 찾을 수 있습니다.

  • Fully Rough: 최대 러프니스 - 머티리얼의 러프니스를 최대치로 강제시켜 인스트럭션 다수와 텍스처 샘플러 하나를 절약할 수 있습니다.

  • Use Lightmap Directionality: 라이트맵 방향성 사용 - 라이트맵 방향성과 픽셀 단위 노멀을 사용합니다. 끄면 라이트맵은 밋밋해 지지만 비용이 저렴해집니다.

이 두 프로퍼티를 켜면 머티리얼을 저사양 디바이스에서 봤을 때 해당 기능의 렌더링 패쓰를 완전히 없애 렌더링 비용을 낮추는 데 도움이 됩니다. 하지만 이는 모든 디바이스에서 이 머티리얼을 켜느냐 마느냐 밖에 없는 양자택일 옵션입니다.


모바일 머티리얼 렌더링 오버라이드

플랫폼에서 사용할 렌더링 옵션은 ES2 Quality Settings 을 조절하여 덮어쓸 수 있습니다. 안드로이드 및 iOS 용 ES2 Quality Setting 은 프로젝트 세팅 > 플랫폼 에서 Android ES2 Quality / iOS ES2 Quality Settings 를 선택하면 됩니다. 오버라이드를 사용하려면, 먼저 Enable Quality Override 옵션을 클릭한 뒤 덮어쓰고자 하는 옵션을 클릭하여 선택하면 됩니다. 원하는 옵션을 전부 선택했으면, 프리뷰 셰이더 업데이트 버튼을 클릭하여 모든 머티리얼이 지정한 옵션으로 작동하도록 다시 컴파일합니다.

모바일 렌더링 옵션

프로젝트 세팅 메뉴의 Mobile (모바일) 부분 아래에서, 모바일 프로젝트의 라이팅 처리 방식을 제어하는 프로퍼티를 여럿 찾을 수 있습니다. 여기서는 그 세팅에는 어떠한 것들이 있고, 프로젝트에 어떠한 영향을 끼치는지 알아보겠습니다.

프로젝트 세팅 접근

프로젝트 세팅 접근을 위해서는, 먼저 메인 툴바 에서 편집 > 프로젝트 세팅 을 선택합니다.


프로젝트 세팅 메뉴가 열리면, Engine (엔진) 부분을 열고 Rendering 카테고리에서 Mobile 부분을 찾습니다.

모바일 렌더링 옵션

Mobile 섹션 아래에는 여러가지 옵션을 켜고 끌 수 있습니다.
여기서는 각각의 프로퍼티가 모바일 프로젝트에 어떠한 영향을 끼치는지 살펴보도록 하겠습니다.

프로퍼티 이름설명
Mobile HDR모바일 HDR - true 면 모바일에서 풀 HDR 로 렌더링합니다. 라이팅 기능이 필요치 않거나 느린 디바이스에서 더욱 나은 성능을 내고자 하는 게임의 경우 이 세팅을 끄면 됩니다.
Max Dynamic Point Lights최대 다이내믹 포인트 라이트 - 모바일 디바이스에서 지원할 수 있는 다이내믹 포인트 라이트 최대 수입니다. 다이내믹 포인트 라이트가 필요치 않은 게임에서 0 으로 설정하면 생성되는 셰이더 수가 줄어듭니다. 이 세팅을 변경하면 에디터를 재시작해야 합니다.
Use Shared Dynamic Point Light Shaders공유 다이내믹 포인트 라이트 셰이더 사용 - 이 세팅이 켜지면, 표면에 닿는 (위에서 지정한 최대 수까지의) 다이내믹 포인트 라이트에 대해 동일한 셰이더가 사용될 것입니다. 약간 느리지만 생성되는 셰이더의 수가 줄어듭니다. 이 세팅을 변경하면 에디터를 재시작해야 합니다.
Enabled Combined Static and CSM Shadowing스태틱 및 CSM 섀도우 결합 활성화 - 프리미티브가 스테이셔너리 라이트의 CSM 섀도와 스태틱 섀도를 둘 다 받을 수 있도록 합니다. 끄면 모바일 텍스처 샘플러가 






이 글에는 Unreal Match 3 (언리얼 매치 3) 게임에서 지원되는 모바일 디바이스에서 플레이할 때 가능한 한 최상의 퍼포먼스를 내도록 하기 위해 활용된 최적화 기법을 담고 있습니다.

기본 디바이스 프로파일

언리얼 매치 3 가 가급적 많은 모바일 디바이스에서 실행되도록 하기 위해 DefaultDeviceProfiles.ini 를 수정하여 저사양 디바이스에서 플레이시에는 렌더링 세팅을 낮추도록 했습니다. 이를 통해 전체적인 게임의 모양과 느낌을 희생시키지 않고도 더욱 더 많은 모바일 디바이스를 지원하도록 할 수 있습니다. 다음 부분에서는 그 세팅 중 몇 가지에 대해서, 그리고 언리얼 엔진 4 모바일 프로젝트에서 그 세팅을 어떻게 활용할 것인지 알아보도록 하겠습니다.

언리얼 매치 3 의 DefaultDeviceProfiles.ini 파일은 Match3\Config\DefaultDeviceProfiles.ini 에서 찾을 수 있습니다.

DefaultDeviceProfiles.ini 가 열렸으면 iOS 와 Android 용 다음 섹션을 찾습니다:

[IOS DeviceProfile]
+CVars=r.Streaming.PoolSize=160
+CVars=r.Streaming.UseFixedPoolSize=1
+CVars=p.EnableAsyncScene=0
+CVars=r.Scalability.MaxTextureQualityForLowVirtualMemory=3
+CVars=r.MaxAnisotropy=1 
[Android DeviceProfile]
+CVars=r.Streaming.PoolSize=160
+CVars=r.Streaming.UseFixedPoolSize=1
+CVars=p.EnableAsyncScene=0
+CVars=r.Scalability.MaxTextureQualityForLowVirtualMemory=3
+CVars=r.MaxAnisotropy=1 

언리얼 매치 3 의 경우 기본 디바이스 프로파일에 아무것도 추가하지 않았으며, 각 디바이스에 대한 개별 디바이스 프로파일만 변경했습니다.

위의 두 텍스트 블록이 각각의 디바이스 제품군에 대해 기본적으로 어떤 렌더링 옵션을 켜는지에 대한 세팅을 담당합니다. 이 CVars 는 프로젝트가 타겟으로 삼을 모바일 디바이스 하나 하나 정확히 알고 있는 것에 대해서만 넣어야 할 것입니다. 여기에 어떤 모바일 디바이스는 지원하지만 다른 모바일 디바이스에서는 지원하지 않는 CVars 를 추가시키면, 그 모바일 디바이스에서는 프로젝트가 제대로 돌아가지 않을 수 있습니다. 이러한 현상을 피하기 위해서는 Device Profile 섹션 아래에 디바이스 전용 CVars 만 추가해야 할 것입니다. 예를 들어 iPhone 4s 디바이스 프로파일과 iPhone 6 프로파일을 살펴봅시다.

[iPhone4s DeviceProfile]
+CVars=r.MobileContentScaleFactor=1.0
+CVars=r.ParticleLODBias=1
+CVars=sg.EffectsQuality=2
+CVars=fx.MaxCPUParticlesPerEmitter 50
[iPhone6 DeviceProfile]
+CVars=r.MobileContentScaleFactor=2.0
+CVars=r.ParticleLODBias=0
+CVars=sg.EffectsQuality=3
+CVars=fx.MaxCPUParticlesPerEmitter 1000

iPhone 6 가 iPhone 4 보다 강력하기 때문에 6 에서는 다수의 세팅이 높게, 4 에서는 낮게 설정되어 있습니다. iOS 섹션 아래 Android 섹션을 살펴보면 저사양 / 고사양 디바이스 프로파일 사이에도 비슷하게 설정된 것을 볼 수 있습니다.

[Android_Low DeviceProfile]
+CVars=r.MobileContentScaleFactor=1.0
+CVars=r.ParticleLODBias=1
+CVars=sg.EffectsQuality=2
+CVars=fx.MaxCPUParticlesPerEmitter 50
BaseProfileName=Android
[Android_High DeviceProfile]
+CVars=r.MobileContentScaleFactor=1.0
+CVars=r.ParticleLODBias=0
+CVars=sg.EffectsQuality=3
+CVars=fx.MaxCPUParticlesPerEmitter 1000
BaseProfileName=Android

언리얼 매치 3 에 사용된 세팅에 대한 분석입니다.

세팅 이름설명
r.MobileContentScaleFactor모바일 콘텐츠 스케일 팩터 - 콘텐츠가 디바이스에서 표시될 때의 스케일을 조절합니다. 0 이면 디바이스 고유 해상도를 사용합니다. UI 스케일에 DPI 스케일링 커브를 사용하는 경우, 이 옵션을 0 으로 설정해야 합니다.
r.ParticleLODBias파티클 LOD 바이어스 - 어떤 파티클 LOD 를 표시할지를 조절합니다. 0 은 베이스 LOD 를, 1 은 첫 번째 LOD 를, 2 는 두 번째 LOD 식으로 사용합니다. 언리얼 매치 3 에서는 저사양 디바이스에서 스폰되는 파티클의 양을 절반으로 줄이기 위해 첫 번째 LOD 만 사용했습니다.
sg.EffectsQuality이펙트 퀄리티 - 틱당 파티클의 스폰 속도를 조절합니다. 값의 범위는 0 에서 3 까지이며, 기본값은 3 입니다. 이 숫자를 낮추면 틱당 스폰되는 파티클 수가 줄어듭니다. 이 수치를 1 로 설정하면 파티클이 매우 드물게 스폰되므로 초저사양 디바이스에만 추천합니다. 0 으로 설정하면 모든 파티클 스폰이 완전 중단됩니다.
fx.MaxCPUParticlesPerEmitter이미터당 최대 CPU 파티클 - 이미터당 CPU 파티클을 몇 개나 분출시킬지 조절합니다.

다른 방식의 LOD 활용

레벨 오브 디테일(LOD)이란 플레이어의 카메라에서 멀리 떨어져 있는 오브젝트의 렌더링 비용을 줄이는 데 도움이 되는 렌더링 꼼수입니다. LOD 작동방식은, 한 오브젝트의 저해상도 버전을 하나 이상 같은 파일에 저장한 다음, 플레이어 카메라와의 거리에 따라 그 오브젝트를 자동으로 전환해 주는 것입니다. 아래 비디오를 보시면 이러한 LOD 전환 예제를 확인하실 수 있습니다.

언리얼 매치 3 에서는 스태틱 메시에 LOD 를 활용하지는 않았지만, 파티클 이펙트에는 LOD 를 활용하여 저사양 디바이스에서의 렌더링 요구치를 낮추는 데 도움이 되었습니다. 먼저 한 파티클을 시작으로 새로운 LOD 를 만듭니다. 그런 다음 새로 생성된 LOD 에서 스폰되는 파티클 양을 절반으로 줄이거나, 어떤 경우에는 이펙트 전체를 꺼버립니다. 아래 그림은 이러한 VFX LOD 가 실전에서 활용되는 예제입니다.


위 그림은 저사양 디바이스에서 현재 선택된 보석을 표시할 때 P_Selected_Title 파티클 이펙트를 어떻게 최적화시켰는지 보여줍니다. 왼쪽 이미지는 원본 P_Selected_Title 파티클 이펙트로, 고사양 디바이스 용입니다. 이 그림을 자세히 보시면 파티클 이펙트에 작은 흰색 사각형이 몇몇 보일 것입니다. 이제 오른편 이미지를 보시면 P_Selected_Title 라는 이펙트는 같지만 이번에는 작은 흰색 사각형이 없습니다. 언리얼 매치 3 가 저사양 디바이스에서 더욱 잘 실행될 수 있도록 이펙트에서 완전히 제거해 버렸기 때문입니다. 자 이제 절반의 작업이 끝났습니다. 다음에는 어떤 모바일 디바이스에서 원본 파티클 이펙트를 사용하고, 어떤 모바일 디바이스에서는 그 원본을 기반으로 한 여러가지 LOD 를 사용할 것인지 정의해야 합니다. 그러기 위해 먼저 DefaultDeviceProfile.ini 를 텍스트 에디터에서 열고 Android_Low DeviceProfile 항목을 찾아봅니다. 아래 그림과 같습니다.

Android_Low Device Profile 섹션에서 다음 CVars 를 추가하고 1 로 설정하여 파티클 이펙트가 사용되면 강제로 첫 번째 LOD 를 사용하도록 했습니다.

+CVars=r.ParticleLODBias=1

Android Device Profile 섹션의 중저사양 디바이스 항목을 살펴보니, 중저사양 안드로이드 모바일 디바이스 모두 파티클 이펙트에 LOD 를 사용하도록 되어있는 반면, 최고사양 안드로이드 디바이스는 LOD 가 아닌 원본 이펙트를 사용하도록 되어 있습니다. 아래 그림에서 어떻게 이러한 세팅들이 어우러져 중저사양 안드로이드 디바이스에서 각기 다른 LOD 의 파티클 이펙트를 표시하는지 알 수 있습니다.

이 예제에서는 안드로이드가 사용되었지만, iOS 섹션에도 같은 개념과 명령을 사용하면 됩니다.


안드로이드 디바이스에서의 비디오 녹화

특정 안드로이드 디바이스에서는 콘솔 창을 열고 다음 명령을 입력하는 것으로 비디오 녹화가 가능합니다.

adb shell screenrecord /sdcard/(Insert Name Here).mp4 --bit-rate 8000000

그러면 디바이스에서 벌어지는 내용을 180 초까지 녹화할 수 있습니다. 언제든지 ADB 콘솔 창에서 Ctrl + C 를 누르면 비디오 녹화를 중지시킬 수 있습니다.

비디오는 보통 폰의 루트 디렉토리에서 찾을 수 있으며, 디바이스가 개발 PC 에 연결되어 있다면 비디오 이름을 검색해 보면 됩니다.


캐릭터 라이팅

언리얼 매치 3 의 캐릭터에 사용된 머티리얼을 살펴보면, 비용이 더욱 싼 Unlit Shading Model 이 아닌 Default Lit Shading Model 을 사용하는 것을 볼 수 있습니다. 그렇게 한 이유는 밤 테마 구매후 활성화시 횃불의 빛이 캐릭터를 동적으로 비추어 그림자를 드리우도록 할 수 있게 하기 위해서입니다. 머티리얼이 Unlit 모델을 사용하도록 바꿨다면 이러한 상호작용은 불가능했을 것입니다. 다이내믹 라이팅이, 특히나 모바일 디바이스에서 비싸기는 하지만, 언리얼 매치 3 는 애초부터 실행에 필요한 리소스가 별로 없어 다이내믹 포인트 라이트 하나쯤으로는 퍼포먼스가 눈에 띄게 차이가 나지 않았습니다.