반응형
개요
FPS
- Frame per Second
- 초당 몇 프레임을 렌더링 할 것인가?
- 초당 프레임이 많을수록 더 부드러운 움직임을 보여줄 수 있음
- 대부분은 60FPS로 제한된 성능에서 높은 FPS로 렌더링 해야하기 때문에 최적화가 필요하다.
( 게임은 보통 40 ~ 60 FPS를 목표치로 삼는다. )
쓰로틀링
- 기기의 발열이 심해져서 온도가 일정 이상 높아지면 자동으로 기기 성능을 낮추는 기능
- 모바일 기기가 쓰로틀링 상태에 진입하지 않도록 최적화 작업이 필요하다. ( 발열 문제 해결이 어렵다 )
Graphics API
- Rendering은 GPU에서 처리하는데 기기마다 GPU는 제각각이다.
이로인해서 Graphics API가 존재하는 것이다. - 다양한 GPU 드라이버를 이용하는 라이브러리를 만들고 API로 제공해서 OS나 GPU 상관없이 렌더링
- 예시
- DirectX ( MS )
- OpenGL ( MS, 매킨토시, 리눅스 )
- OpenGL ES ( Android, web browser )
- Metal ( iOS 차세대 API )
- Vulkan ( Android 차세대 API )
Unity Graphics API 설정
- Menu > Edit > Project Settings > Player 진입
- Build Target :: Android > Other Settings > Auto Graphics API
렌더링 파이프라인
렌더링 파이프라인은 화면에 그려지는 과정 즉, Graphics API 워크플로우를 의미
GPU의 의미
- 그래픽 처리를 위한 시스템은 GPU를 중심으로 구성된 칩셋에서 수행
- CPU ----> Rendering 명령 ----> GPU 수행
- GPU Memory, VRAM (Video Random Access Memory)
- GPU도 메모리를 가지고 있으며 이것이 VRAM
- Texture, Mesh 데이터 등 렌더링에 필요한 데이터들과 렌더링 결과를 저장하는 버퍼들이 포함
- Rendering 시 이곳에 저장된 데이터를 참고해서 그래픽 처리
Game Loop
- 분류
- Initialization : 리소스 생성 및 초기화
- Update : 물리, 입력, 로직, Animation 처리
- Render
- Decommissioning
- 라이프 사이클 플로우 차트 참고
https://docs.unity3d.com/kr/2019.1/Manual/ExecutionOrder.html
Rendering Loop
- Object들의 Update가 완료된 후에야 Rendering이 이루어진다.
- 모든 Object들을 렌더링한 후에야 비로소 화면에 출
렌더링 파이프라인
- Object 하나를 렌더링 하기 위한 데이터와 처리 흐름 -> Object를 2D로 그리는 과정
- Rendering 하기 위해서는 Mesh, Texture, Shader, Transform 등의 많은 정보가 필요하다.
- 분류
- Application
- Application 상에서 처리되는 단계로 렌더링 이전에 데이터를 처리하는 단계
- CPU에서 대부분의 연산을 수행하기 때문에 크게 보면 렌더링 파이프라인에 포함된다.
- Geometry
- Vertex와 Polygon을 처리
- Vertex Transform
- GPU는 GPU 메모리에서 Vertex 정보를 가져옴 ( local space )
- 3D 공간으로 배치하기 위해 Transform 정보를 World로 변환 ( world space )
- 카메라 공간으로 변환 ( view space )
- 3D가 아닌 2D에 렌더링을 하기위해 매칭이 필요하다 ( projection, 투영 )
- ex : 원근 투영, 직교 투영
- Vertex Shader
- Transform의 변환은 Vertex Shader에서 이루어진다.
- world - view - projection transform은 vertex shader에서 행렬 연산을 통해 수행
- mesh의 vertext에 이 행렬을 곱해줘서 vertex를 알맞은 위치에 배치시켜주는 일을 vertex shader가 수행하는 것
- Normal, vertex color도 vertex shader에서 결정
- Vertex Shader를 거치고 나면 Geometry가 자동으로 생성
- vertex들이 서로 연결되어 형태를 이루고 있다. 이 Mesh의 형태를 Geometry라고 함
- Vertex 수가 많아지면 Geometry 단계에서 병목이 발생할 수 있음
- 보여지지 않는 Object들은 최대한 Culling해서 렌더링 파이프라인을 거치지 않도록 해줘야 한다.
- Rasterizer
- Mesh가 화면에 매칭되는 Pixel을 결정하고 최종적으로 색을 입히는 과정.
- Mesh의 Polygon에 속한 영역을 픽셀로 매칭 시키는 과정을 Rasterization이라고 함
- Z Buffer ( = Depth Buffer )
- Pixel은 크게 두가지의 버퍼에 정보를 저장
- Color Buffer
- Pixel의 최종 색상 정보 저장
- Z Buffer
- 카메라로부터의 거리인 깊이 값이 저장된
- Color Buffer
- Pixel은 크게 두가지의 버퍼에 정보를 저장
- Z test
- Pixel을 렌더링 할 때 Z Buffer를 활용하여 깊이 판정을 수행
- Z Buffer에 저장되어 있는 Pixel의 깊이 값보다 출력하고자 하는 Pixel 값이 더 앞에 (깊이가 더 작으면) 있다면 출력하고, 뒤에 있다면 출력하지 않는 것
- 뒤에있으면 가려져서 보이지 않기 때문에 굳이 렌더링할 필요가 없다.
- 최근 그래픽 칩셋들은 Fragment Shader 이전에 Z Test를 수행해서 미리 가려지는 Pixel들을 걸러내어 비용을 절약한다.
- Fragment Shader ( = Pixel Shader )
- Pixel들의 최종 색을 계산
- Texture로 부터 색상을 읽고 그림자를 적용
- Blending
- 투명도가 있는 Object에 대해 Alpha Blending을 거친다.
- Alpha 값을 활용해 최종 색상을 결정한다.
- Mesh가 화면에 매칭되는 Pixel을 결정하고 최종적으로 색을 입히는 과정.
- Application
정리
- 모든 Object들은 위의 과정들을 거쳐 Buffer에 차곡차곡 쌓여 그려진다.
- Double Buffering
- Buffer를 두개 교차 사용하여 다음 프레임을 렌더링할 시간을 버는 것
- 현재 출력되고 있는 Buffer를 Front Buffer, 뒤에서 렌더링 중인 Buffer가 Back Buffer
cpdm
choppadontbiteme.tistory.com
반응형
'Dev > Unity' 카테고리의 다른 글
[Unity] 병목 - 유니티 그래픽스 최적화 스타트업 정리 (0) | 2025.02.10 |
---|---|
[Unity] Project 구성 - 모바일 게임 성능 최적화 팁 (4) (0) | 2024.07.19 |
[Unity] Programming & Code Architecture - 모바일 게임 성능 최적화 팁 (3) (0) | 2024.07.19 |
[Unity] Memory - 모바일 게임 성능 최적화 팁 (2) (1) | 2024.07.19 |
[Unity] Profiling 프로파일링 - 모바일 게임 성능 최적화 팁 (1) (1) | 2024.07.19 |