디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[📚정보] 최적화 노하우 공유

ㅇㅇ(175.197) 2023.04.19 12:47:25
조회 2957 추천 27 댓글 11
														

개인적으로 개발관련해서 메모용으로 사용하는 티스토리 블로그에 작성했다가,

꽤 많은 분들에게 도움이 될 것 같아 내용만 똑같이 복붙하여 왔습니다.

다들 고생하세요.

-----


게임 출시를 앞두고, Android플랫폼의 심각한 발열과 낮은 프레임에 대한 최적화를 수행했다.

여러개의 프로젝트를 런칭하면서 쌓인 노하우 및 새로 공부한 지식으로 유의미한 최적화 성과를 거두었기에 최적화 방법을 공유한다.


먼저, 최적화 방법 공유에 앞서 최적화 대상 프로젝트의 스펙은 다음과 같다

-Unity 2021.3.8f로 개발

-URP 프로젝트

-NGUI사용


최적화 성과 (갤럭시 s8기준)

FPS :  20~30 -> 50~60

용량 : 400mb -> 300mb

발열 : S22에서 심각한 발열로 인해 30~40fps가 나옴 -> S22와 같은 심각한 발열 기기에서 거의 발열 없이 수십분 이상 구동 가능. 안정적인 60fps유지.


이와같은 성능을 유지하기 위해선 여러가지 복합적인 이유들이 있겠지만,

untiy editor의 stats기준으로 batch는 많아도 100~200수준을 잡아주는 것이 좋다

(스크립트 병목과 높은 vertex로 인한 성능 하락은 고려하지 않는다)


먼저 최적화에 앞서 본인 프로젝트에 대한 프로파일링을 우선 진행하길 바란다.

필자는 최적화에 Unity Profiler와 Memory Profiler(실험적) 을 사용했다


profiler를 통해 스크립트 병목의 원인을 추적하고, 메모리 스냅샷을 사용해 메모리 사용량을 최적화하라


그리고 최적화의 대상이 CPU처리인지 GPU처리인지도 파악해야 한다.




NGUI관련 최적화

1. UI Atlas의 depth최적화, panel을 최적화한다. 

ngui에서 가장 기본적인 것으로 동일한 panel을 사용하는 widget들의 depth를 정리하여 최적화 해주어야 한다.

무분별한 panel의 사용으로 동일한 atlas를 사용하는 widget이 쪼개져 중복적인 draw call을 야기하지 않도록 해야한다.


ngui에서 A와 B아틀라스 2개를 통해 UI를 구성한다면 흔이 2의 draw call을 예상할 것 이다.

하지만 만약 depth가 A A B A BB이런 식으로 ui를 배치한다면 draw call은 4가 된다

2의 draw call을 얻기 위해선 A A A B B B B와 같이 atlas에 따른 ui depth를 정리해주어야 한다.


하나의 atlas로 draw되다가 다른 atals를 만나면 중간에 batching이 끊기게 된다.


2. 동일한 atlas를 사용하는 widget은 단일 panel에서 최대한 순서를 정렬하여 처리해준다.

필자의 경우 ui atlas를 back / icon / overay / font 이렇게 4가지로 나누어, 정리했으며 

ui가 아무리 많아도 batch는 최대 4만 유지하도록 해주었다.

draw call의 병합 규칙은 두가지가 있는데, 하나는 material, texture, shader가 모두 같다는 것이고 다른 하나는 widget의 레이어가 같거나 인접해야 한다는 것이다.


3. NGUI에서 Transform의 변화, 생성, 삭제가 일어나는 객체를 조심해라

NGUI에서는 Panel에 속한 widget의 Transform이 변화(생성/삭제 포함) 하면 해당 panel에 있는 모든 widget을 다시 rendering한다. 

즉, Panel에 연출을 위한 widget이 tween position, scale등을 한다면 매 lateUpdate에 Panel은 drawcallfill을 다시 호출하는 것이다.

NGUI Widget의 Transform이 정적이지 않거나, 생성/삭제가 자주 일어나는 객체라면 완전히 다른 panel의 하위 객체로 두어 격리해두어야 한다.

즉, NGUI에서는 한 panel에 속한 widget의 상태에 변화가 생기면 해당 panel의 모든 atlas를 다시 렌더링해주게끔 되어있다.


3-1. 특히 NGUI의 UI Label을 조심해라

UI Label로 데미지 등을 처리할 경우 데미지 연출을 위해 UI Label이 매프레임 tweening하거나 animation을 재생할 수 있다. 이 경우 UI Label은 엄청난 성능 병목을 일으킨다.

매 프레임 움직이는 UILabel이 속한 panel의 draw fill/fill shadow/draw call fill을 야기시킨다.

특히 UI Label에 쉐도우나, 아웃라인 등이 들어가있다면 매프레임 Transform의 변화에 따라 Label을 다시 렌더링 해주게 된다.

이를 방지하기 위해 데미지 폰트 등은 이미지 폰트를 사용하는 것을 추천한다.


4. panel의 static상태 활성화

panel로 구성한 ui에 있는 모든 객체가 정적인 것이 보장된다면, panel의 static옵션을 활성화해주면 좋다.

ngui객체도 기본적으로 mono객체이며, static객체가 아니면 모든 ui객체에서 update/lateUpdate가 호출되기에 성능 병목이 발생한다.

정적인 객체의 경우 3번 방법을 참고하여 동적인 객체만 관리하는 panel등으로 격리해주자



그 외 Unity공통 최적화

1. GC를 줄이자

BinaryFormatter의 Serialize는 엄청난 양의 GC를 야기하며, 디바이스를 freeze시킨다. 이러한 동작은 매프레임 해주지 말고, 스케쥴러를 만들어 처리해주자


BigInteger.Parse(string)과 같은 value copy를 야기하는 처리를 피해주자


특정 타이밍에 GC.Collect를 수동으로 호출해주자


2. URP Setting의 Post Processing의 fast sRGB/Linear Conversions로 gamma공간을 사용하고 있다면 gpu의 부담을 덜어주자


3.  SustainedPerformanceMode를 활성화해 지속가능한 성능 옵션을 켜주어, 발열을 방지하자 (이로 인해 기본적인 fps의 하락이 있을 수 있음)


4. GPU의 병목/부하가 생기는 Project Setting의 옵션은 비활성화 하자 (Compute Skinning, Graphics Jobs...등)


5. Static Batching과 Dynamic batcing을 적극 활용하자


6. Texture compression format : ASTC, normal map encoding : DXT5nm-style


7. Screen.SetResoultion을 통해 화면 해상도를 지정해주자 (HD~FHD). 이를 해주지 않을 경우 기기의 해상도에 따라 렌더링되기 때문에 발열과 배터리소모의 원인이된다.


8. Target Framerate를 설정해주자 (60fps). 만약 프레임상한이 없다면 상위 기기에선 비정상적으로 높은 fps가 발생할 수 있으며 이는 발열/배터리소모의 원인이 될 수 있다.


9. realtime shadow는 최대한 피하고, 눈속임을 통해 그림자를 표시할 수 있는 방법을 찾자

quad를 통해 그림자를 표현하고, 이 quad를 dynamic batcing하는 등이 방법이다.


10. 가능한 많은 object pooling을 해주자. 

또한 NGUI객체의 경우 객체를 pool에서 회수/반환할 때 gameObject.SetActive보단 화면에 rendering되지 않는 먼 영역으로 좌표를 이동시켜 주는것이 좋은 선택지일 수 있다.

NGUI객체는 오브젝트가 enable/disable될 때 많은 병목을 일으키는 처리를 수행한다


11. 거리에 따른 최적화 방법을 숙지하라

Generate mipmap은 기본적을 texture의 용량을 1.3배 정도 부풀린다.

단 한 화면에 render되는 객체가 많을 경우 이는 한 화면의 메모리 부하를 줄여주므로 적극 활용해야한다.


또한 오브젝트에 LOD level을 세팅하면 거리에 따라 3D오브젝트의 렌더링 부하를 줄일 수 있지만 용량이 추가적으로 들어가는 것을 유의해야 한다.


Aniso Level을 주의해라. Aniso Level은 오브젝트를 그릴 때 단일 텍스쳐라도 멀어지면 흐리게 해주는 효과이다.

Aniso Level이 높을수록 선명해지겠지만 ,처리비용이 많이 든다.

프로젝트 세팅에서 확인하라 (기본값은 Forced On이다)


12. Asset의 Read/Write옵션을 주의하라

이 옵션은 기본적으로 비활성화지만 활성화 시 GPU메모리 뿐만 아니라 메인 메모리에도 복사되므로 소비량이 2배로 증가한다.

꼭 필요한 오브젝트의 경우만 식별하여 사용할 것


13. 파티클의 shader/material에 따라 render order를 조정해주어라.

NGUI와 같은 개념으로, 파티클에서 사용되는 shader/material도 render order를 조정해주어 batching되도록 해주자


14. Resources.Load를 매니징하자

디바이스로 부터 불러온 자원의 경우 사용 빈도에 따라 GC가 발생하지 않도록 상시 메모리에서 들고있는 등의 방법으로 최적화 해줄 수 있다.


15. Debug.Log를 주의해라

런타임 빌드 시 프로젝트 세팅에서 로깅 옵션을 완전히 비활성화 하거나, 스크립트에서 define으로 처리를 격리해주어라.


Unity Crash관련 팁

이 항목은 필자가 서비스중인 게임의 크래시 문제를 해결한 경험으로 작성되었기에, 지극히 주관적입니다.


1. Android환경에서 Vulkan API는 아직 불안정하다. Vulkan내부에서 native crash를 야기할 수 있다. (필자는 opengles 3을 권장)


2. Multithread rendering과 compute skinning도 native crash를 야기할 수 있다. 


3. 빈번한 Scene Load는 잦은 크래시를 야기할 수 있다.

맵의 전환 등으로 Scene이 load될 때 전 scene의 unload와 새로운 scene의 load중 스크립트가 unload된 scene의 객체 혹은 아직 preload상태의 scene에 접근할 경우 크래시가 발생한다.


추가적으로, unity의 scene 로드 구조는 순간적으로 폭발적인 메모리 사용량을 불러올 수 있다.

A장면에서 B장면으로 넘어갈 때 A장면과 B장면이 동시에 메모리에 올라가있는 순간이 존재하며 이 때 메모리 부족으로 크래시가 발생할 수 있다.


A장면에서 B장면으로 넘길 때 빈 장면(C)을 넣어 A장면의 메모리가 모두 해제되고, GC가 Collect되게 한 후 B장면을 로드해주는 방식은 아주 유용하다


4. Strip Engine Code옵션은 무조건 끄자

압축된 스크립트 dll을 참조하는 순간 native crash가 발생한다





자동등록방지

추천 비추천

27

고정닉 5

1

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기
자동등록방지

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
2864 설문 비난 여론에도 뻔뻔하게 잘 살 것 같은 스타는? 운영자 24/06/03 - -
2865 AD 호요버스 신작 <젠레스 존 제로> 7월 4일 오픈! 운영자 24/06/05 - -
2866 AD 세상의 패권을 거머쥘 자, 로드나인 사전등록 중 운영자 24/06/05 - -
161634 공지 취.업관련 이야기 금지 [9] 파베르Dev갤로그로 이동합니다. 24.06.05 286 4
159490 공지 인디 게임 개발 갤러리 규칙 - 질문 전 필독!! [25] 에뚜갤로그로 이동합니다. 24.05.10 868 3
52873 공지 게임제작 초심자를 위한 글 모음 [9] Goranic갤로그로 이동합니다. 20.07.02 64386 52
123789 공지 뉴비 개임개발 하려는데 뭐부터 해야하나요 복사본 [14] 흉황갤로그로 이동합니다. 23.04.11 12302 21
161757 🐣질문 씬 뷰에 아무것도 안 보임.. ㅇㅇ(180.71) 20:22 26 0
161756 💬 그냥 하고싶은 말이 있는데 [1] ㅇㅇ(121.186) 20:21 40 0
161755 🐣질문 유니티에서 폰트를 이펙트화 하려면 어케 해야 함? [2] ㅇㅇ(211.185) 20:05 47 0
161754 💬 포켓로그 수익 없이 왜 만든걸까? [7] ㅇㅇ(175.213) 19:46 143 0
161752 🐣질문 유니티 2d 캐릭터 rigidbody 점프가 안되고있음.. [2] 침팬치갤로그로 이동합니다. 18:57 98 0
161751 💬 게임쪽도 경험이 중요하겠지? [6] ㅇㅇ(116.39) 18:43 172 0
161750 💬 인디 게임 개발의 가장 큰 적은 [4] ㅇㅇ(119.193) 18:22 232 1
161749 💬 GPT 3.5는 맨날 구라치고 그래서 신뢰가 안갔는데 [1] 강화인간갤로그로 이동합니다. 18:19 144 0
161748 💬 한국 인디 게임 중엔 창의적인 게임이 별로 없는듯 [11] ㅇㅇ(220.93) 18:15 284 0
161747 💬 안녕하세요. 영상 음악 작곡하고 있는 사람입니다. ㅇㅇ(121.128) 18:02 89 1
161746 💬 돈없는 인디게임 개발자의 모션캡처 (유튜브) [4] 인터넷친구갤로그로 이동합니다. 17:54 174 0
161745 💬 빌드박스 구독할 사람 참고하샘 [1] ㅇㅇ(58.232) 17:51 69 0
161744 💬 매직애로우 라는 게임 만들고있는 놈인데 [27] ㅇㅇ(121.186) 17:43 295 0
161743 🐣질문 여기사람들 전부 굵직한 코드식은 다 외우고있음?? [5] ㅇㅇ(14.47) 17:23 162 1
161741 🐣질문 투자 안받으면 너넨 다 인디로침?? [10] ㅇㅇ갤로그로 이동합니다. 17:10 196 0
161740 💬 Aesprite 할인 자주함? [2] ㅇㅇ(210.100) 17:00 138 0
161739 💬 성공하고십따 [10] ㅇㅇ(180.231) 16:43 321 9
161738 💬 서양권에서 터진 게임은 얼추 3개월안에 한국에 상륙하네 [5] ㅆㅇㅆ(124.216) 16:38 273 6
161737 🐣질문 게임 엔진 추천부탁드립니다! [13] ㅇㅇ(112.152) 16:34 136 0
161736 💬 너티독, E3, 도쿄게임쇼에 관한 이야기 ㅇㅇ(112.159) 16:28 61 0
161735 💬 솔직히 슬더스가 언더테일보다 더 성공하지 않았냐 [7] 우라백사도갤로그로 이동합니다. 16:26 201 0
161734 💬 포켓로그 2달전에 해외에서 이야기나왔는데 경향 타임즈에서 오늘 언급됐네 [5] ㅆㅇㅆ(124.216) 16:23 158 0
161733 💬 근데 덱빌딩이라고 하면 [4] 쇼핑카트갤로그로 이동합니다. 16:20 106 0
161732 💬 포케로그 팬게임인데 트래픽 어떻게 감당하는거지 [5] 이백만갤로그로 이동합니다. 16:15 144 0
161731 🐣질문 유니티 뉴비 질문좀 [1] ㅇㅇ갤로그로 이동합니다. 16:02 58 0
161730 🐣질문 캐릭터 일러스트는 보통 얼마나 줘? [1] ㅇㅇ갤로그로 이동합니다. 15:59 129 0
161729 📜일지 6월 1주 일지 [29] 봄네코갤로그로 이동합니다. 15:43 421 13
161728 💬 근데 노가다건 직장이건 퇴근해서 뭐 한다는거 힘들지않냐 [10] ㅆㅇㅆ(124.216) 15:13 223 2
161727 💬 아트 작업자인데 겜 만들고싶어서 [11] ㅇㅇ(14.36) 15:04 217 0
161726 💬 프로토타입 작업이 끝나가니까 머리가 아프네 ㅇㅇ(221.241) 14:56 121 0
161725 🐣질문 제작 엔진 다른게 쓰는 언어가 다른거임? [2] ㅇㅇ(14.47) 14:15 148 0
161724 🐣질문 1대1로 하는 게임이랑 5대5로 하는 게임을 부르는 용어가 뭐임? [5] ㅇㅇ(220.86) 14:09 175 0
161722 🐣질문 스토리나 대사 관련해서 따로 정리해놓는 프로그램이나 사이트 없음? [6] ㅇㅇ(14.47) 14:01 108 0
161720 💬 어설프게 할줄아는게 아예 못하는거만 못하네요 [11] ㅇㅇ(125.132) 13:51 306 0
161719 💬 인디 개발자들이랑 소통하기 괜찮은 사이트나 커뮤니티 어디임? [5] ㅇㅇ(59.6) 13:38 214 0
161718 💬 인터넷에 개발일지라도 올리면서 하면 속도가 좀 빨라질까 [3] ㅇㅇ(218.145) 13:12 157 0
161717 🐣질문 해외 대상 광고는 어케해야함??? [2] ㅇㅇ(202.14) 11:36 131 0
161716 💬 난 저작권 관련 엄청 사리는데 [17] ㅇㅇ(121.128) 11:25 433 3
161715 💬 게임을 기획하다보면 튜토리얼을 어떻게 짤지 고민입니다. [1] 검은고양0I갤로그로 이동합니다. 11:24 99 0
161714 📜일지 작업 근황 [23] 얀테이갤로그로 이동합니다. 11:13 625 13
161713 🐣질문 유니티 playerprefs 질문 [2] 7월갤로그로 이동합니다. 10:01 109 0
161712 💬 6시간알바하는데도 힘들다 [4] ㅇㅇ(118.221) 09:29 163 0
161711 💬 기획이 게임시스템 - gui 사이의 구현만 해주면 좋아죽을듯 [2] ㅇㅇ(211.210) 09:08 167 0
161710 💬 요즘 군대에서 하고있는거 [4] 딕걸갤로그로 이동합니다. 08:25 274 3
161708 💬 직장인 개발자잇음? [13] ㅇㅇ갤로그로 이동합니다. 07:50 480 1
161707 💬 1.5년 만에 재산 10배 불리는법 [1] ㅇㅇ(175.193) 07:06 290 0
161706 💬 Art of game design 이거 사려면 개정판으로 사는게 낫나요? ㅇㅇ(211.212) 06:29 72 0
161705 💬 전공으로 c++로 게임 만드는 강의듣고 있는데 ㅇㅇ(203.212) 04:55 120 0
161703 💬 인디는 기획플밍 겸직이 나은거같아 [9] ㅇㅇ(219.255) 04:20 326 0
161702 💬 기획 공부하는데 도움이 될만한 서적들 추천 좀 해주실 수 있나요 [2] 냐코갤로그로 이동합니다. 04:15 126 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2