유니티 최적화 팁

Animator와 Shader에서는 String 대신(String최적화)

string대신 Animator.stringToHash, Shader.PropertyID를 사용하는 것이 좋습니다.
 

Unity - Scripting API: Animator.StringToHash

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 
Animator.stringToHash를 사용하면 string대신에 Hash값으로 변환해서 사용하기 때문에 최적화 측면에서 좋습니다. 비슷한 내용으로 Shader.PropertyID도 마찬가지입니다.
 


Auto Graphic 끄기(Build최적화)

Auto Graphic을 키게 되는 경우 빌드할 때 어떤 그래픽스 API를 사용하는지 모르기 때문에 모든 API관련 리소스들이 함께 빌드된다고 합니다. 그런 문제를 방지하기 위해 프로젝트에 맞는 API만을 남겨두시고 Auto Graphic을 끄는 것을 추천드립니다.

Auto Graphic 체크 해제

 
그래픽 API를 확인하는 방법은 아래 글을 참고해주세요.

유니티 런타임에 사용되는 Graphics API를 확인하는 방법

런타임에 사용되는 Graphics API를 확인하는 방법 void Start() { GraphicsDeviceType activeAPI = SystemInfo.graphicsDeviceType; Debug.Log("Active Graphics API: " + activeAPI); } 코드를 작성하고 빈오브젝트를 생성 후 거기에 부

wlsdn629.tistory.com

 


Auto Sync Transform(최근에는 사용하지 않은 최적화)

Auto Sync Transform 옵션을 비활성화 / Default

 
물리 요소가 많지 않은 프로젝트라면 Auto Sync Transform 옵션을 비활성화 하는 것이 좋습니다.
예를 들면, 퍼즐게임이 있습니다.
 
간단하게 Auto Sync Transform 옵션에 대해 설명을 하자면, 유니티는 C# 을 관리하는 Management 영역과, C++을 관리하는 영역, Physics를 관리하는 영역 총 3가지로 나뉩니다.
 
Auto Sync Transform 옵션 Transform 컴포넌트가 변할 때마다 변경 변경 상황을 물리 시스템과 자동으로 동기화 해야 하는, (  Physics -> C# -> C++ ) 총 3번의 과정을 처리해야합니다. 
 
Unity 2017.2 이상에서 만든 프로젝트의 경우 이 옵션을 끄는 것을 권장하며 기본적으로 false가 Default입니다.
 


target FrameRate(프레임 최적화)

유동적으로 target FrameRate을 설정하는 것을 권장합니다.
 
예를 들어, 메인 메뉴나 로비와 같이 UI 인터렉션이 주를 이루는 곳에서는 굳이 FPS가 60이상 나올 필요가 없습니다.
 
이런 공간에서는 CPU가 쉴 수 있게 FPS를 낮춰주는 것이 좋습니다.
 
target FrameRate을 사용할 때는 vSync는 비활성화 해야합니다. 둘이 같이 사용할 수 없습니다.
 
vSync라는 것은 View SyncTransform의 줄임말로, CPU 작업과 GPU 작업 시간을 동기화해서 그래픽 카드와 모니터 사이의 동기화를 조정하여 프레임 속도를 제어하는 기술이라고 합니다. 이 기능을 키면 티어링 현상을 방지할 수 있고 부드럽고 일관된 그래픽 표면을 제공받을 수 있다고 합니다.


Avoid Large Hierachies(계층구조 최적화)

하이러키창의 계층구조를 Deep 하게 설계하지 말라는 뜻입니다. 왜냐하면 root 오브젝트의 Transform 변화하면 그 자식 오브젝트들의 Transform도 모두 함께 변해야 하기 때문에 Cost가 소모됩니다.
 


부모 리타켓팅은 비싸다(연산 최적화)

transform.setparent와 같은 함수는 cost가 매우 비쌉니다. GetComponent급이라고 합니다.
 
게임 오브젝트의 트랜스폼 구조를 변경하면서 발생하는 계산 비용과 관련이 있기 때문입니다. 트랜스폼 구조가 변경되면, 새로운 부모-자식 관계를 반영하기 위해 내부적으로 트리 구조를 재구성하기 때문에 cost가 많이 듭니다.
 
transform.parent = null 이런것도 비싸다는 뜻입니다.


 

위치 설정은 한 번에(연산 최적화)

게임오브젝트의 transform과 rotation이 변경될 때는 transform.SetPositionAndRotation을 이용해서 한 번에 처리하는 것이 퍼포먼스에 더 좋다고 합니다.
 
비슷한 개념으로 Instantiate할 때도 position과 rotation을 미리 설정하는 것이 좋다고 합니다.
Instantiate(go, position, rotation) 이런식으로 말이죠.