응용프로그램/유니티(Unity)

Unity 그래픽 최적화 방법 참고

zelkova 2017. 1. 13. 11:43

<목차로 돌아가기>

 

랜더링이란?

간단하게 컴퓨터가 그림을 그리는 행위.

 

랜더링 파이프라인

3D 이미지를 2D 래스터 이미지로 표현하기 위한 단계적인 방법'을 의미합니다. 

최적화를 위해서는 어느정도의 기반지식을 이해하고 문제가 되는점을 캐치하는 능력이 필요하다고 함.

CPU -> 랜더링 명령 가공 -> GPU Memory에 전달 -> GPU 연산시작 -> 연산결과 GPU 버퍼에 전달.

 

위와 같은 랜더링을 제어하는 컴퓨터 언어를 그래픽스 API라고 하는데 여러 기업들이 자신들만이 API를 제공하고 있다.

Microsoft(DirectX)

크로노스 그룹(OpenGL, Vulkan[멀티 쓰레딩 차세대 언어])

애플(Metal[멀티 쓰레딩 차세대 언어])

AMD(Mentle)

 

유니티에서는 기본적으로 크로스 플렛폼을 지원하므로 지정된 문법으로 크로스 플렛폼을 지정할 수 있지만 어느정도의 스펙을 넘어가면 한계를 느낄 수 있다.

 

이런 경우에 Graphics APIs를 통하여 그래픽스를 직접 제어한다.

 

 

분석방법 - Statistics

 

FPS

하나의 게임 프레임을 처리 및 렌더링하는 데 걸린 시간(프레임/초).

 

보통 1Frame에 아래와 같은 연산을 처리한다.

리소스 생성되는 초기화 -> 연산되는 데이터 업데이트 -> 화면에 그리기(랜더링) -> 종료하기 위한 리소스 해제

 

1초에 몇번의 Frame이 보여지는가를 나타내는 것으로 FPS(Frame per second) 흔히들 초당 몇번 그릴 수 있는지 FPS(Frames per seconds)를 통하여 성능을 체크한다.

 

영화는 30FPS, 게임은 50~60FPS, 액션게임은 80~90FPS 정도가 무난하다.

 

이 숫자는 프레임 업데이트 및 게임 뷰의 렌더링에 걸린 시간만 포함된다.

에디터가 씬 뷰 인스펙터의 그리기 및 에디터 전용 작업을 수행하는 데 걸린 시간은 포함되지 않는다.

 

CPU - Main

한 프레임을 처리하는 데 걸린 총 시간입니다. 이 수치에는 Unity가 애플리케이션의 프레임 업데이트를 처리하는 데 걸린 시간과 Unity가 에디터에서 씬 뷰, 다른 에디터 창 또는 에디터 전용 작업을 업데이트하는 데 걸린 시간이 포함됩니다.

 

CPU - Render

한 프레임을 렌더링하는 데 걸린 시간입니다. 이 숫자에는 Unity가 게임 뷰를 렌더링하는 데 걸린 시간이 포함됩니다. Unity가 에디터에서 Scene 뷰를 렌더링하거나 Inspector를 그리는 데 걸린 시간은 포함되지 않습니다.

 

Betches

프레임 동안 Unity가 처리하는 총 배치 수입니다. 이 수에는 정적, 동적 및 인스턴스 배치가 포함됩니다.

"Batching"은 리소스 스위칭으로 인한 CPU 오버헤드를 줄이기 위해 엔진이 여러 개체의 렌더링을 메모리 청크로 결합하려고 시도하는 것입니다.

 

Saved by batching

Unity가 결합한 배치 수입니다. 배치 작업을 잘 수행하려면 가능한 한 자주 서로 다른 개체 간에 재료를 공유해야 합니다. 렌더링 상태를 변경하면 배치가 동일한 상태의 그룹으로 분할됩니다.

 

tris, Verts

그려진 삼각형(tris)과 정점의 수(Verts) 입니다.

이것은 optimizing for low-end hardware에서 중요합니다.

 

Screen

사용하는 메모리양과 화면의 해상도

 

SetPassCall

렌더링 패스의 수. 각 패스에 대해서 유니티 런타임은 CPU 오버헤드를 가져올 수 있는 새로운 쉐이더를 바인딩한다.

Unity가 전환하는 횟수 셰이더프레임 동안 게임 오브젝트를 렌더링하는 데 사용합니다.

셰이더에는 여러 셰이더 패스가 포함될 수 있으며 각 패스는장면다르게. 각 패스에는 Unity가 CPU 오버 헤드를 유발할 수있는 새로운 셰이더를 바인딩해야합니다.

 

Shadow casters

프레임에 그림자를 사용하는 오브젝트의 수

 

Visible Skinned meshes

Skinned의 수 메시 랜더러 프레임에더 랜더링 된것.

 

Animation Component Playing

프레임 동안 재생되는 애니메이션 수

 

Animator Component Playing

프레임동안 동작하는 에니메이터의 수

 

분석방법 - Frame Debugger

statistics는 통계를 보여주지만 상세하지 않습니다. 더 자세하게 알아보려면 Frame Deberger를 사용하는 것이 좋습니다.

게임 창의 마지막 프레임에 대해 GPU로 전송된 모든 그리기 명령 목록이 프로파일링 샘플 아래에 그룹화되어 표시됩니다.

 

 

 

분석방법 - Profiler Modules

CPU측에서 무슨 일이 일어나고 잇는지 확인하고자 한다면 Window -> Analysis->Profiler를 통해 분석할 수 있습니다.

 

프로파일러는 크게 두 섹션으로 나뉩니다. 상단부분에는 다양한 성능 그래프를 보여주고 하단 부분에는 그래프에서 선택할 수 있는 프레임의 자세한 분석이 표시됩니다.

 

 

 

 

그래픽을 저하시키는 요소

프레임 연산이 이루어지는 요소

- 게임 내 오브젝트들이 상호작용을 위한 물리 연산

- 입력장치의 입력신호

- NPC의 AI 처리

- 게임 로직 연산처리

- 캐릭터 애니메이션 모션

- 네트워크 사용시 네트워크 처리

- 오디오

 

- 드로우콜 : CPU에서 GPU가 이해하도록 명령어를 만들어 전해주는 과정.

참조 : metamon9.tistory.com/6

 

 

최적화 방법

최적화 방법 정리중..

 

VSync

게임을 연산하면 FPS가 일정하지 않고 오르락 내리락하는 경우가 있다.

사용자 입장에서는 일정하지 않은 FPS가 일정한 FPS에 비하여 부자연스러워 보인다.

따라서 Vsync를 사용하여 일정한 간격으로 보이도록 조정할 수 있습니다.

 

Vsync는 모니터의 주사율(Hz)에 맞춰서 Frame을 제한하는 방법입니다.

60Hz라면 100FPS가 나오더라도 60FPS만 출력해서 나타낼 수 있습니다.

 

60Hz의 주사율을 가진 모니터에 Vsync를 걸었을 때 아래와 같이 동작합니다.

프로그램에서 60~100Frame -> 60Frame

프로그램에서 30~59Frame -> 30Frame

프로그램에서 15~29Frame -> 15Frame

 

여기에서 문제는 일정 수치에 미치지 못하면 절반으로 확 떨어진다는 점입니다.

30Frame이 나오더라도 일정하게 유지되면 괞찮지만 프로그램이 59에서 60프레임을 넘나들면 프레임 차이가 극명하게 갈리게 될 것입니다.

 

잘~ 사용해야 할 것 같습니다.

 

이 밖에 아래와 같은 기능들이 있고 시간날 때마다 천천히 수정할 예정

SRP batcher

 

Dynamic Bacher

 

GUIInstancing

 

 

 

참조

Prosto(FPS 보고 제어)

스위트건(VSync)

김정민님글

 

 

 

 

 

 

 

 

 

반응형