일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- c++
- loop
- Unreal Engine 5
- guide
- w3school
- dynamic
- 오류
- 백준
- 기초
- python
- 재귀
- Class
- Programming
- W3Schools
- Unity
- String
- Basic
- UE5
- C#
- DP
- Material
- 프로그래밍
- github
- parameter
- Tutorial
- 파이썬
- 시작해요 언리얼 2022
- 문제풀이
- dfs
- Algorithm
- Today
- Total
행복한 개구리
Ocean Cleaner 21.08.17. 개발일지 - 최적화 본문
현재 기기에서 앱을 실행할 때 발열이 RPG급으로 심하게 나는 이슈가 있다. 따라서 최적화를 진행해보도록 하겠다.
하지만 최적화는 처음이니 개념부터 공부해보자 :D
https://docs.unity3d.com/kr/2019.4/Manual/MobileOptimizationPracticalScriptingOptimizations.html
스크립트 최적화 - Unity 매뉴얼
이 섹션에서는 게임에서 사용하는 실제 스크립트와 메서드를 최적화하려 할 때 어떻게 착수하면 될지 설명합니다. 또한 최적화가 가능한 이유 및 특정 상황에서 이러한 최적화를 적용했을 때
docs.unity3d.com
일단 내가 이해하고 구현할 수 있는 내용으로 정리를 해보자면
- 변수에 메모리 할당되는것을 최대한 줄인다.
- ex. 많은 양의 문자열을 다룰 때는 "" 대신 System.String.Empty를 사용하자
- => "가나다라"를 System.String.Format("가나다라")에도 해당되는 내용인지는 모르겠다. 맞다고 추측중.
- ex. 많은 양의 문자열을 다룰 때는 "" 대신 System.String.Empty를 사용하자
- 단기적으로 사용하는 클래스의 메서드는 구조체로 사용하는 것을 권장한다.
- => Heap에 쌓이지 않으며 가비지컬렉션의 대상이 되지도 않는다.
- ex. 따라서 Vector3는 구조체로 구현되어있다.
- => Heap에 쌓이지 않으며 가비지컬렉션의 대상이 되지도 않는다.
- 오브젝트 풀링(Object Pooling)을 한다
- 미리 생성해두고 SetActive를 사용할 수 있는 오브젝트들은 Instantiate대신 SetActive를 사용한다.
- => Instantiate를 사용하는 것은 가비지 컬렉터가 작동해야 할 일이 생긴다는 것이다. 따라서 GC를 쉬게함으로써 메모리를 절약해준다.
- 다만 상당시간동안 지속되는 주문 효과를 포함한 게임, 많은 수의 오브젝트가 나타나지만 진행에 따라 서서히 사라지는 게임 등은 풀링을 사용하면 더 느려지는 역효과를 볼 수 있다.
- 미리 생성해두고 SetActive를 사용할 수 있는 오브젝트들은 Instantiate대신 SetActive를 사용한다.
- 효과는 파티클시스템을 사용하여 구현한다.
- 효과를 구현함에 있어 효과의 객체들이 각각의 독립된 객체라면 당연하게도 할당되는 메모리가 급증할 것이다. 따라서 폭죽이 터지는 효과라던지, 동전들이 마구 튀어나오는 효과 등은 파티클시스템을 이용하자.
- 내부 루프에서 콜스택 오버헤드 최소화한다
- 업데이트나 반복문에서 Mathf.Abs(x)와 같은 함수를 호출하는 것보다는 직접 식을 세워서 x = (x>0 ? x : -x);와 같은 식으로 사용하는게 좋다.
- 물리 성능을 최적화한다.
- Time창의 Fixed Timestep을 조정하여 물리 업데이트(ex. FixedUpdate)에 드는 시간을 줄일 수 있다.
- 타임스텝을 늘리면 물리 정확도가 떨어지는 대신 CPU 오버헤드가 줄어든다
출처 : Wiki백과 - 정확도를 어느정도 포기하고 속도향상을 시켜줄 수 있는 상황이라면 시도해보자.
- Time창의 Fixed Timestep을 조정하여 물리 업데이트(ex. FixedUpdate)에 드는 시간을 줄일 수 있다.
- 메시콜라이더(Mesh Collider) 사용을 지양한다.
- 메시콜라이더는는 기본 콜라이더들에 비해 퍼포먼스 오버헤드가 훨씬 크다.
- 기본 콜라이더를 가진 자식오브젝트들을 사용하여 대략적으로 메시콜라이더 비슷하게 만들 수 있다.
- 이 경우에 부모 리지드바디(Rigidbody)가 자식 콜라이더를 단일 복합 콜라이더로 한꺼번에 제어한다.
- 휠 콜라이더는 솔리드 오브젝트라는 점에서 엄밀히 콜라이더는 아니지만 높은 CPU 오버헤드를 유발한다.
▲ Wheel Collider
- 메시콜라이더는는 기본 콜라이더들에 비해 퍼포먼스 오버헤드가 훨씬 크다.
위 정리들은 Unity 매뉴얼에 나와있는 글들 중 내가 당장 읽으면서 이해하고 구현할 수 있는 점만 정리했으며 실제로는 더욱 많은 최적화 방법이 존재한다.
무엇보다도 최적화를 하기위해서는 CPU와 GPU등 하드웨어에 대한 지식을 익히고 드로우 콜, 쓰로틀링 등을 학습하고 오는것이 적절하다고 생각된다. (생각보다 큰일인데..?)
https://www.youtube.com/watch?v=4kVffWfmJ60
https://ajh322.tistory.com/257
유니티 데브윅스 요약 - 성능 프로파일링과 최적화
https://www.youtube.com/watch?v=4kVffWfmJ60 오늘은 네임드 개발자 오즈라엘님이 "성능 프로파일링과 최적화"라는 귀한 주제로 발표를 해주셨다. 두 시간짜리 영상을 열심히 보고 요약글을 올리는 나한테
ajh322.tistory.com
위 블로그에서 유니티 데브윅스 영상을 보고 정리한 글이다.
최적화내용들이 상당히 잘 정리되어있다. 영상을 꼭 봐보도록 하자
'Unity > Project : Ocean Cleaner' 카테고리의 다른 글
OceanCleaner 21.08.19. 개발일지 - 어셋찾기 (0) | 2021.08.20 |
---|---|
Ocean Cleaner 21.08.18. 개발일지 - 최적화 (0) | 2021.08.18 |
OceanCleaner 21.08.16. 개발일지 - 미리보기 이미지 키우기 (0) | 2021.08.17 |
OceanCleaner 21.08.08~21.08.09 개발일지 (0) | 2021.08.10 |
OceanCleaner 21.08.07 개발일지 (0) | 2021.08.07 |