상세 컨텐츠

본문 제목

[Unity] 속도 최적화 기법

Unity

by 메타샤워 2023. 7. 19. 15:39

본문

어느 어플리케이션이나 웹 서비스에서 로딩에 너무 많은 시간이 소모되거나 실행 중에 렉이 걸리는 현상은 그렇게 좋지 못한 사용자 경험일것이다. 게임도 마찬가지로 초기 로딩이 너무 길거나 자주 렉이 발생한다면 아무리 재미있는 게임이라도 "발적화 게임"이라며 놀림당하기 십상이다.

 

지금부터 게임 제작 프로젝트에서 활용한 유니티 게임 최적화 기법들을 몇가지 소개 한다.

 

○ foreach 대신 for를 사용하자

 
일밤 배열을 사용하신다면 foreach 보다는 for를 사용하는것이 더 빠르기 때문에 웬만하면 for를 사용하는것이 좋다.
C#을 이용하여 프로그래밍을 하셨던 분들은 아시겠지만 foreach는 for보다 2~5배 가량 느리다고 한다.또한 foreach는 루프 한 번에 24바이트의 쓰레기 메모리를 만들어 내기 때문이 이 쓰레기 메모리가 쌓이다 보면 Garbage Collector의 청소를 당하게 되럯이고 사양이 좋지 않은 기기에서는 렉이 걸릴수 있는 요지가 되기 때문에 for를 추천한다.
 

○ FindObject 계열 함수는 캐싱을 이용하자

 

 
FindObject 계열의 함수들은 ( GetComponent<>() 함수도 역시 ) 동작하는 방식 때문에 매우 느리게 작동하는데 스크립에서 FindObject 계열의 함수들을 계속 호출하게 되면 자연스레 스크립트가 느려질 수 밖에 없다. 만약 스크립트에서 FindObject 계열의 함수들로 개개체에 접근을 자주 하게 되는 경우 캐싱을 이용하면 속도 저하를 막을수 있다.
 

○ 나눗셈 보다는 곱셈을 사용하자

 

 
자료구조나 알고리즘 수업을 들으셧다면 컴퓨터가 싫어하는 연산과 좋아하는 연산에 대해 들어 보셨을 것이다. 당연하게도 좋아하는 연산은 빠르고 싫어하는 연산은 느리게 동작한다. 컴퓨터가 좋아하는 연산은 비트연산이고 싫어하는 연산은 나눗셈이다. 결론은 나눗셈보다는 곱셈이 몇 십배 빠르므로 2.0f로 나누지 말고 0.5f를 곱해서 연산하자
 

○ 문자열 병합은 '+' 보다는 stringBuilder를 사용하자

 
유니티는 함수를 문자열로 호출하는 경우가 많기 떄문에 특히나 문자열을 가져오거나 병합하는 작업을 하게되는 순간이 오게된다.
위에서 언급했듯이 쓰레기 메모리가 쌓여 Garbage Collector가 작동하면 렉이 걸릴 수 있으니 임시객체를 만드는 작업은 피해야 하는데 문자열 (string)의 '+' 연산은 임시 문자열을 만들어 사용하기 때문에 많이 사용하게 되면 Garbage Collector의 동작을 초래할 수 있다. 따라서 임시 문자열을 생성하지 않는 StringBuilder.Append() 메소드를 사용하는 편이 좋다.
같은 개념으로 임새 객체를 생성하는 API 들은 조심해서 사용할 필요가 있다. ( ex. GetComponent<T>();등 ) 꼭 사용해야 하면서 자주 접근하게 될 경우 역시 캐싱을 이용하자
 

○ 비어있는 콜백함수는 지우자

 
스크립트를 만ㄷ르게 되면 void Start() , void Update() 같은 콜백함수들이 자동으로 적혀 있게 된다. 자주 사용하는 콜백 함수이지만 항상 사용하는 함수는 아니기 때문에 이런 콜백함수들의 내부가 비어져있고 사용하지 않더라도 성능에 영향을 미치게 된다. 
사용하지 않는 비어있는 콜백함수는 다 지워버리도록 하자

관련글 더보기