랜더링이란?
간단하게 컴퓨터가 그림을 그리는 행위.
랜더링 파이프라인 |
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가 이해하도록 명령어를 만들어 전해주는 과정.
최적화 방법 |
최적화 방법 정리중..
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
참조
'응용프로그램 > 유니티(Unity)' 카테고리의 다른 글
Unity - RogueLike(7/14) - 장애물과 벽 (0) | 2017.02.04 |
---|---|
Unity - 에러모음집 (0) | 2017.01.13 |
Unity와 SQLite연동하기 (2) | 2017.01.13 |
유니티(Unity) - SQLite3 설치 및 세팅 (0) | 2017.01.10 |
Unity - 자습서 - 필수개념 - 인스펙터 사용자정의 빌딩 (0) | 2016.12.16 |