유니티 프레임레이트에 대한 고찰

아이시 모델링으로 넘어가기 전에 잠깐 짚고 넘어가고 싶은 주제가 있어서 짚고 넘어가 보자.

배틀퀸 디스코드 서버에서 프레임레이트에 관한 이야기가 있었다. 배틀퀸 targetFrame을 60프레임제한을 걸어둔 상태지만, 어쩐지 이 코드가 뚫리는 컴퓨터가 있다. 때문에 프레임이 폭주해 300프레임 가량이 나오면서 GPU사용량을 5배나 증가시키는 것으로 보인다. 그래서 몇가지 테스트를 해보았다.

비어있는 씬을 실행하기 전의 상태이다. 이제 ctrl+p로 게임을 실행시키면

기본적으로 40%의 자원을 먹는다…?!

작업관리자의 GPU도 같은 비명을 지른다.

배틀퀸은 최적화에 꽤 신경을 썼다. 뒷배경은 대체로 2D로 이루어져 있고, 일단 쓰기만 해도 무거운 Transparent도 거의 사용하지 않았다. 그럼에도 불구하고, GPU사용량은 높다. 왜일까.

다른 게임을 켜보자.

지금은 가지고 있는 게임이 이것밖에 없다(…) Out of Space. 이 게임도 37%. 이것 역시 유니티로 만들어졌다.

URP가 문제일 수 있다. 레거시로 재생해본다면 어떨까.

흐음.. 레거시 템플릿도 마찬가지다.

가장 부하가 적을 것 같은 템플릿을 켜보자.

지자쓰! 소폭 줄어들긴 했지만 큰 차이는 안난다.

뭐, 디버그 모드는 원래 자원을 많이 먹을 수 있다. 빌드해보자.

아무 것도 없는 ‘모바일 2D씬’조차 GPU를 24%나 먹는다.

배틀퀸에 사용한 셰이더는 무겁지 않다. 전부 Unlit이다. 렌더 스케일이 2배라서 그게 좀 무겁긴 한데, 그래도 잘 버틴다. 중요한 건 뭔 짓을 해도 GPU사용량은 줄어들지 않는다는 것이다. 고급옵션들을 몇 개 켜봤는데 딱히 사용량이 늘지도 않는다.

현재는 유니티 6를 사용 중이다. 0.45빌드도 유니티 6를 사용했다.

그냥 유니티 엔진 자체에서 GPU를 일정량 확보하는 것으로 보인다. Out of Space가 저런 걸 보면 최신 버전이 문제는 아닐 것이다.

결론. 할 수 있는 게 없다. 그냥 하던대로 하자.

4.17

결론이 변하지는 않았으나, 몇가지 알아낸 사실들에 대해 기록해두자.

먼저 프레임레이트는 모니터의 주사율에 따라 달라진다. 주사율이란 화면이 1초에 얼마나 갱신되느냐를 나타내는 단위인데, 흔히 사용하는 60MHz의 모니터는 60번 갱신되는 것이다. 모니터에서 화면갱신이 일어나지 않는다면, GPU에서 화면을 새로그려도 의미가 없기 때문에 유니티에서는 프레임레이트를 주사율에 맞추는 처리를 기본으로 한다. 이것이 VSync이다.

그리고 이를 CPU가 제어하는 방법이 targetFrameRate지정이다. 코드는 다음과 같다.

Application.targetFrameRate = 60;

그런데 이렇게 코드로 제어하는 CPU의 제어방식이 하드웨어 제어인 VSync보다 우선순위가 떨어진다.

Every V Blank는 매프레임, Second V Blank는 2프레임당 한 번씩 갱신한다. 내가 사용하고 있는 모니터의 주사율이 60MHz니까, 60프레임에 정확히 들어맞는다. 문제는 게이밍 모니터의 경우 더 높은 주사율을 보이는데, 이 때 화면갱신은 초당 60을 뛰어넘을 수 있다. 화면갱신횟수가 늘면, 자연히 GPU사용량도 늘어난다.

안정적인 프레임을 유지하는 것은 VSync가 맞다. 하지만 모니터에 따라 게임스펙이 달라지는 것 또한 곤란하다. 때문에 이는 Don’t Sync로 맞추고 CPU를 기준으로 계산해야 한다. 그런데.. 그렇다고 GPU사용률이 크게 달라지는 않았다. 좀 더 들쭉날쭉할 뿐, GPU는 여전히 40%정도를 사용한다.

왜 이렇게 연산을 많이 소모할까? 내가 조사했던 수많은 최적화 관련된 항목 중 가장 큰 영향을 끼치는 것은 렌더링 스케일이었다. 배틀퀸은 무려 HD의 2배 크기로 렌더하고 있었다.(어쩐지 깔끔하더라!) 물리적인 연산이 많으니 GPU를 4배 많이 사용한다. 그런데 그것치곤 늘어나는 폭은 15%정도이다. 남는 장사.

그리고 두번째가 안티앨리어싱이다. 사양 고려않고 그냥 High프리셋을 썼더니 MSAA 4x를 사용하고 있었다. 4번 더 그리는 것이니 실질적으로 2배크기로 렌더한 것과 비슷한 효과…일까?

여튼 그렇다고 해도 GPU사용률이 아주 높지는 않기 때문에 현 세팅을 바꿀 생각은 없다. 하지만 프레임레이트는 고정될 필요가 있겠다. 1초에 60번을 갱신하는 것도 이미 굉장한데..!

유니티 프레임레이트에 대한 고찰”의 2개의 생각

댓글 남기기