[Unity] Occlusion Culling, Overdraw, Sprite Atlas, Blend Tree, Set Pass Call, Batch, OBJ/FBX, NURBS/Polygon, Scriptable Object, 유니티 멀티쓰레드 오류, Euler 회전 문제점 정리

2024. 3. 26. 09:44Unity

728x90
반응형

Occlusion Culling과 Culling Mask

Occlusion Culling

-객체가 다른 객체에 의해 완벽하게 가려지는 경우 렌더링 계산을 하지 않는다.

-매 프레임마다 카메라는 씬에 있는 Renderer를 카메라로 부터 사다리꼴 방사 모양의 시야인 *[frustum culling]으로 조사한다. 여기서 불필요하게 소모되는 CPU와 GPU를 줄이기 위해 사용 되는 기능.

(*frustum culling은 카메라 시야에 없는 객체를 culling 하는 것. culling plane을 가까운 것과 먼 것으로 하나씩 설정할 수 있다.)

 

Occlusion Culling을 사용해야하는 경우

-유니티에 빌트인 되어있는 Occulsion Culling은 CPU에서 런타임으로 계산된다. Overdraw로 인해 GPU와 바인딩 된 프로젝트에서 가장 높은 퍼포먼스를 보여준다.

-유니티는 Occlusion Culling을 런타임으로 메모리에 로드한다. 충분한 메모리가 있는지 확인해야 한다.

-Dynamic GameObjects는 Occlusion Culling 될 수 있지만 다른 오브젝트를 가릴 수는 없다.

 

Occlusion Culling 계산

-Occlusion Culling 데이터를 bake하면, 유니티는 씬을 셀로 나누고 셀 간의 가시성을 설명하는 데이터를 생성한다.

-이후 생성된 데이터 사이즈를 줄이기 위해 셀을 병합한다.

-런타임 시 bake된 데이터를 메모리에 로드하여 Occlusion Culling이 활성화 된 카메라에 적용된다.

 

Occluder와 Occludee

-Occluder: 다른 오브젝트를 가릴 수 있는 static 오브젝트

-Occludee: 가려질 수 있는 static 오브젝트

 

*모델링 시 고려할 점

-모델링 사이즈가 크다면 오브젝트의 일부만 쳐다보고 있을 때도 전체가 렌더되기 때문에 큰 메쉬는 작은 부분들로 모델을 잘라야 한다.

 


 

Android GPU 렌더링과 Overdraw

https://developer.android.com/topic/performance/rendering/inspect-gpu-rendering

 

GPU 렌더링 속도 및 오버드로 검사  |  App quality  |  Android Developers

앱에서 문제가 발생할 수 있는 위치를 시각화하는 데 도움이 되는 온디바이스 개발자 옵션을 알아보세요.

developer.android.com

렌더링 중에 필요 이상의 렌더링 시간 또는 long thread와 GPU 작업 등 이슈가 될 만한 상황들이 발생할 수 있다.

 

안드로이드 개발자 도구에서 GPU Profiler를 켤 수 있다.

 

Overdraw

-앱이 동일한 프레임 내에서 동일한 픽셀을 두 번 이상 그릴 때 발생한다. 여기서 필요 없는 픽셀을 렌더링 하기 위해서 GPU 성능에 문제가 될 수 있다.

-Painter's Algorithm에 따라서 뒤에서부터 앞으로 렌더링이 되는데, 예를 들면 겹쳐있는 카드의 렌더링에서 불필요하게 뒤에 있는 부분도 매 프레임마다 렌더링 될 수 있다.

 

Android Performance Patterns: Understanding Overdraw


Overdraw 수정

-불필요한 Background 제거

-Hierarchy 평준화

-transparency 줄이기: 일반적인 불투명 객체로 인한 overdraw와는 달리, 투명한 객체로 인한 overdraw는 기존 픽셀을 먼저 그리고 blending equation을 수행하게 된다. 반투명 Text + 검은색 Text로 회색을 표현하는 것 보다 회색 Text 하나로 표현하는 것이 효과적이다.

-frustum culling

 

 


 

 

Sprite Atlas

-Unity는 씬에서 각 텍스쳐에 대해서 드로우콜을 발생시키기 때문에 텍스쳐가 많은 프로젝트의 경우 리소스가 많이 소비될 수 있다.

-Sprite Altas는 많은 텍스쳐를 단일 텍스쳐로 결합하여 드로우콜을 하나로 줄일 수 있다.

 

 


 

 

Blend Tree

-여러 애니메이션을 Blend하고, 각 애니메이션의 일부가 다른 비중으로 합쳐져 매끄럽게 만든다.

 

 


 

 

Set Pass Call

- Set Pass Call은 렌더러가 물체를 그릴 때 셰이더를 변경하는 작업을 말한다. 예를 들어, 동일한 셰이더로 여러 물체를 그리고 있다가 새로운 셰이더로 전환하는 경우에 Set Pass Call이 발생한다. 셰이더 변경은 GPU에 상당한 오버헤드를 유발할 수 있으므로 이를 최소화하는 것이 중요하다.

- Set Pass Call 수 줄이기: 메테리얼 적게 사용하기, sorting layer를 통해 메테리얼을 하나로 묶어서 그리기, static batching을 활용하기

 

Batch

- GPU에 동시에 그려지는 물체의 그룹. 동일한 메테리얼을 사용하는 물체는 하나의 Batch로 그룹화되어 효율적으로 처리된다. 즉, 동일한 셰이더와 텍스처를 사용하는 물체들이 하나의 Batch로 그룹화되면 GPU에서 더 효율적으로 처리된다.

 

Draw Call

- CPU가 GPU에게 그리라고 명령을 내리는 작업.

 

 


 

OBJ

- OBJ는 텍스트 파일 형식으로, 간단한 기하학적 데이터를 포함할 수 있다. 주로 3D 모델의 기하학적 형상을 저장하는 데 사용된다. OBJ 파일은 텍스처 매핑 및 애니메이션과 같은 고급 기능을 지원하지 않는다.

 

FBX

- FBX는 이진 파일 형식으로, 다양한 3D 모델링 및 애니메이션 소프트웨어 간에 데이터를 교환하는 데 사용된다. FBX 파일은 3D 모델의 기하학적 데이터뿐만 아니라 텍스처, 애니메이션, 뼈대 및 스킨 등의 고급 기능을 포함할 수 있다.

 

 




NURBS(Non-Uniform Rational B-Splines)

- NURBS는 곡면을 정의하는 데 사용되는 수학적 모델.

- 각 세그먼트는 B-Splines로 정의되며, 각 점에 대해 가중치를 적용하여 보다 자연스러운 곡선을 생성한다.

- NURBS는 곡면의 부드러운 곡률과 곡면을 효과적으로 제어할 수 있는 장점이 있다.

- 고해상도 표면 및 곡면을 모델링하고자 할 때 주로 사용된다.

 

Polygon

- 폴리곤은 다각형 형태로 표현되며, 이러한 다각형들이 서로 연결되어 객체를 형성한다.

- 각 폴리곤은 정점(Vertex)으로 구성되며, 이 정점들은 선으로 연결되어 면을 형성한다.

 

 


 

 

Scriptable Object

- Scriptable Object는 유니티에서 데이터를 저장하고 관리하기 위한 특별한 유형의 클래스.

- 게임 오브젝트에 부착되지 않으며 게임 내의 데이터를 보관하고 처리하는 데 사용된다.

- 게임의 다양한 데이터 요소를 관리하는 데 사용된다. 이는 게임 상태, 아이템, 캐릭터, 퀘스트 등을 포함할 수 있다.

- 독립적인 리소스 파일로서 프로젝트의 다양한 부분에서 재사용할 수 있다. 이는 코드의 재사용성을 높이고 유지 보수를 용이하게 한다.

- 유니티의 직렬화 시스템을 활용하여 데이터를 저장하고 로드할 수 있다. 이는 게임의 상태를 파일로 저장하거나 네트워크를 통해 전송하는 데 유용하다.

- 유니티 에디터에서 쉽게 만들고 수정할 수 있다. 이를 통해 개발자는 사용자 정의 에디터 기능을 구현하여 데이터를 시각적으로 편집할 수 있다.

- 런타임에 빠르게 로드되고 사용될 수 있다. 이는 게임의 성능을 향상시키고 메모리 사용량을 최적화하는 데 도움이 된다.

 

 


 


유니티 멀티스레드에서 오류가 나는 상황

- Main Thread에서 UI 업데이트: 유니티의 UI는 주로 메인 스레드에서 업데이트되어야 한다. 다른 스레드에서 UI를 직접 조작하려고 하면 오류가 발생할 수 있다. 이를 해결하기 위해서는 Unity의 Main Thread에서만 UI를 조작하도록 조치를 취해야 한다.

- Race Conditions(경합 조건): 여러 스레드가 동시에 같은 데이터나 자원에 접근하려고 할 때 발생할 수 있는 문제이다. 예를 들어, 두 스레드가 동시에 같은 변수를 수정하려고 할 때 값이 예상치 못하게 변할 수 있다. 이를 방지하기 위해서는 동기화 메커니즘을 사용하여 데이터 접근을 제어해야 한다.

- Deadlocks(교착상태): 두 개 이상의 스레드가 서로의 작업을 기다리며 진행하지 못하는 상태를 말한다. 예를 들어, 스레드 A가 자원 X를 보유하고 스레드 B가 자원 Y를 보유한 경우, 스레드 A는 자원 Y를 기다리고 스레드 B는 자원 X를 기다리게 되어 상호적으로 기다리는 상황이 발생한다. 이를 해결하기 위해서는 데드락을 방지할 수 있는 설계를 사용해야 한다.

- 메모리 관리 문제: 여러 스레드에서 동시에 메모리를 읽거나 쓰는 경우 메모리 무결성이 깨질 수 있다. 이를 해결하기 위해서는 스레드 간의 메모리 접근을 동기화하고, 메모리 누수 및 경쟁 조건을 방지하기 위해 적절한 메모리 관리를 수행해야 한다.

 

 


 


Euler 회전 시 문제점들

- 짐벌락(Gimbla Lock): 세 개의 회전 축(롤, 피치, 요)을 사용하면 회전에 제약이 생길 수 있다. 특정 방향으로 회전할 때 원하는 방향으로 회전하지 않는 문제가 발생할 수 있다.

- 회전 순서: Euler 회전은 회전 순서에 따라 결과가 달라질 수 있다. 축의 순서를 변경하면 객체의 회전 결과도 변경된다. 이로 인해 예기치 않은 회전 현상이 발생할 수 있다.

728x90
반응형