유니티 최적화


1. 그래픽 최적화


유니티에서 그래픽 최적화많큼 효과적인 것은 없습니다 , 2D게임의 스프라이트나  UI의 그리픽소스등은 같은 그룹 ( 한 Atlas ) 으로 묶어 Sprite Pakage를 해주시고, 사이즈나 화질등을 게임에 따라 최적의 크기와 화질 압축방식으로 설정해주면 도움이 됩니다 , 하지만 그래픽 리소스 제작에서 부터 최적화를 염두해두고 게임에 최적화된 그래픽 소스를 제작하는것이 가장 효과적입니다, 예를 들어 3D게임이라면 폴리곤수를 줄여야 하고 텍스쳐 사이즈를 줄여야 하며 잘 정돈된 토폴로지를 갖고 있어야 하죠 , 애초에 최적화는 기획단계에서부터 시작되기때문에 게임제작 전반에 걸처 최적화를 염두해둬야 제대로된 최적화를 할수가 있습니다.



2. 프로그래밍 최적화


유니티 프로그래밍 최적화에서 가장 많이 듣는 소리는 Update문을 최대한 적게 쓰라는 것입니다, 필요이상으로 많이 쓰인 Update문은 성능을 당연히 저하시키지요 , Update문의 대체 수단으로 코루틴을 활용하거나, FixedUpdate문을 사용하고 유니티 설정에서 FixedUpdate문의 초당 호출수를 최소한으로 줄이는 방법등이 있습니다 , Start()함수나 Awake()함수또한 사용하지 않는다면 선언된것만으로도 리소스를 사용하기때문에 삭제해줘야합니다, 가장 초보이면서도 치명적인 실수는 구지 초당 프레임횟수많큼의 반복실행이 필요하지 않은 루틴을 Update()문 안에 선언하는것입니다, 이벤트나 메시지로 처리가 가능한것은 따로 함수를 작성하여 딱 필요한 순간에만 실행되도록 해야합니다.


유니티 프로그래머가 알아야할 최적화 코드 작성법 ( "To be programmer" 님의 블로그 글 링크)



3. 병목현상 제거


그럼에도 항상 문제가 되는것은 어느 한두군데에서 집중적으로 발생하기 마련입니다, 병목현상이 발생하는 컴포넌트를 찾아 좀더 효율적인것으로 대체하거나, 제거함으로써 성능이 대폭향상되는 경우가 많습니다



4. 유니티의 고질적인 문제 가비지 컬렉션


프로젝트 후반이 되면 가장 문제가 되는 부분이 가비지 컬렉션입니다, 오브젝트풀 구현의 문제라든가 사용하지 않는 오브젝트가 과도하게 선언되어있다든가 너무나 많은 다양한 원인으로 가비지 컬렉션이 발생하며 증상은 갑작스런 멈춤 , 갑작스런 프레임 하락으로 이어집니다, 가장 많은 원인이 되는경우는 역시 프리팹의 사용중 실수로 인한것인데요, 일단 오브젝트가 만들어지면 그 오브젝트에 연결된 모든 리소스, 프리팹등이 결국 메모리를 사용하며 이는 가비지 컬렉션으로 이어지기 때문에 문제가 발생할 수 있습니다



5. 최적화 감지


유니티 내부에 프로파일러 도구로 병목지점이나 , 최적화로 인한 성능향상 정도를 측정할수 있습니다만 , 가장 직관적인 방법은 우측상단에 Stats에 표시되는 프레임수로 최적화여부를 판단하는것이 더 효과적이고 간단합니다, 또한 프로파일러를 통한 병목지점을 파악하는것보다 과감하게 오브젝트를 하나씩 삭제하고 실행해서 (물론 삭제에 따른 에러가 발생하지 않아야 실행가능합니다) 프레임을 급락시키는 컴포넌트를 찾아내는것이 더 빠르고 간단한 방법입니다.


하드웨어리소스를 적게 소모하는 게임일지라도 최적화는 사용자 경험을 극대화 시켜주기 때문에 어떤게임이든 필수적인 요소라고 할수있습니다, 일단 간단하게(?) 소개해 드리는 것은 최적화는 고려해야할 점이 너무 많고 결국 경험으로 습득할수 밖에 없기 때문입니다, 최소한 1~3의 세가지를 항상 염두해두시고 게임제작의 중간중간 한번씩 상기해보는것을 추천합니다




개발/프로그래밍 주제의 다른글 : 더보기

  1. IT삼국지 #1 : 유니티는 내부적으로 어떻게 컴파일되는가