[펌] Graphics Optimization
Unity3D/Tips / 2018. 12. 13. 16:32
컬링(Culling)
- 최종 화면에 영향을 미치지 않는 물체를 파악하고 이를 렌더링 대상에서 제외시켜 필요한 물체만 그리는 기법
- 프러스텀 컬림(Frustum Culling)
- 가장 기본적이면서도 효과가 좋은 방법
- 카메라 영역내의 공간 정보만 살려두고 영역 외부에 설정된 정보는 모두 버림
- 카메라에 프로젝트에 설정된 레이어별로 차단 거리(Per-Layer Cull Distances)를 지정하면 이 값을 사용해 레이어에 속한 게임 오브젝트들을 컬링함
- 오클루젼 컬링(Occlusion Culling)
- 기존의 절두체를 이용한 컬링 기법의 한계를 보완하고 효율적으로 공간 정보를 관리해 빠르게 렌더링을 수행할 수 있게 도와주는 기법
- Unity의 Windows => Occlusion Culling 메뉴를 통해 설정
- 오클루젼 컬링 제작방법
- 오클루젼 영역 설정
- 오클루젼 컬링 데이터 제작
- 최종 결과 시뮬레이션
- 오클루젼 포털(Occlusion Portal)
- 오클루젼 영역을 스크립트로 조절하는 기능
드로우 콜 배칭(Draw Call Batching)
- 텍스쳐 아틀라스(Texture Atlas)를 사용하여 콜수를 줄임
- 성질이 동일한 물체들을 하나의 메시와 재질을 사용하게 통합
- 여러 게임 오브젝트의 메시를 하나의 메시로 통합해주는 CombineChildren 컴포넌트를 제공
- 최상위 게임 오브젝트에 이 컴포넌트를 사용하면 자식 오브젝트들이 갖는 메시들을 분석한 후 재질별로 메시를 통합해 재가공함
- 컴바인 메시(Combined Mesh)를 통한 작업시 주의할 점
- 게임 오브젝트들을 통합하면 게임 오브젝트별로 움직일 수 없게 됨
- 관련된 빛의 계산이 통합된 모든 메시를 대상으로 수행됨
- 메터리얼(Materials)
- 다른 텍스쳐에 있는 두개의 독립적인 메터리얼을 하나의 큰 텍스쳐로 결합 할 수 있음(텍스처 아틀라스)
- 일단 텍스처를 동일한 아틀라스로 묶으면 단일 메터리얼로 사용할 수 있게 됨
- 배칭(Batching)
현재 씬의 상황을 판단해 자동으로 드로우 콜을 줄이게 최적화하는 기능
정적 배칭 Static Batching (Pro required)
- Static 옵션이 설정된 게임 오브젝트에서 동일한 재질을 사용하는 물체가 있는 경우 유니티는 이들을 자동으로 하나의 메시로 통합 관리함
- 움직이지 않는 물체에 대해 지정만 하면 자동으로 수행
동적 배칭 Dynamic Batching
- 움직이는 물체를 대상으로 동일한 재질을 사용하는 경우 이를 판단해 자동으로 메시를 통합해 드로우 콜을 줄여주는 기능
- 총 정점의 데이터 수가 900개 미만인 메시를 지닌 게임 오브젝트만을 대상으로 수행됨
- 메시 데이터가 위치 외에도 노멀, UV, 라이트맵 UV 등 총 3개의 속성을 갖고 있는 경우 정점의 수가 225개를 넘으면 동적 배칭이 적용되지 않음
최적의 퍼포먼스를 위한 캐릭터 모델링(Modeling Characters for Optimal Performance)
싱글 스킨 메쉬 렌더러 사용
- 각 캐릭터에 스킨 메쉬 렌더러(class-SkinnedMeshRenderer)는 하나여야 합니다.
- Unity는 시야 컬링 및 경계 볼륨의 업데이트를 사용하여 애니메이션을 최적화하고, 이러한 최적화는 하나의 애니메이션 컴포넌트 및 하나의 스킨 메쉬 렌더러를 사용하는 경우에만 활성화됩니다.
- 모델의 렌더링 시간은 두개의 스킨 메쉬를 사용할때 하나의 스킨 메쉬를 사용 할 때보다 대략 2배 정도 이며, 여러개의 메쉬를 사용하여 실질적인 메리트가 있는 일은 드뭅니다.
가능한 메터리얼을 적게 사용
- 각 메쉬의 메테리얼의 수를 최대한 적게 해야 합니다.
- 여러 메테리얼을 캐릭터에서 사용하는 이유는, 다른 부분에서 다른 쉐이더가 필요한 경우 뿐 입니다(예를 들면 눈 부분은 특수 쉐이더).
- 그러나 캐릭터에서 두 개 또는 세 개의 메테리얼로 거의 모든 케이스에 충분 합니다.
가능한 한 본(Bones)를 적게 사용
- 전형적인 데스크톱 게임의 본 계층은 15개에서 60개 사이의 본을 사용합니다.
- 본의 수가 적을수록 퍼포먼스가 좋아집니다.
- 30개 정도의 본으로 데스크톱 플랫폼에서는 아주 좋은 품질을 얻을 수 있고, 모바일 플랫폼에서도 비교적 좋은 품질을 얻을 수 있습니다.
- 이상적으로는 모바일 장치에서는 30개보다 적게 하고, 데스크톱 게임에서도 30개를 크게 초과하지 않도록 합니다.
폴리곤 갯수를 적게 사용
- 폴리곤 수는 필요한 품질 및 대상 플랫폼에 의존합니다.
- 모바일 장치는 메쉬 당 300에서 1500 폴리곤으로 좋은 결과를 얻을 수 있으며, 데스크톱 플랫폼에서의 이상적인 범위는 1500에서 4000 정도입니다.
- 반면, 게임에 많은 캐릭터가 있을 때 메쉬 당 폴리곤의 수를 줄일 필요가 있을 것 입니다.
- 예를 들어, Half Life 2는 캐릭터에 2500 - 5000 삼각형 수였습니다.
- 현재 PS3와 XBox 360의 최고 랭크 게임은 보통 캐릭터에 5000에서 7000 삼각형 수입니다.
포워드 및 역운동학을 분리
- 애니메이션이 임포트 될 때, 모델의 역운동학(IK) 노드는 포워드 운동학(FK)에 베이크(baked)된 결과로 Unity는 IK 노드가 전혀 필요 없습니다.
- 그러나 모델에 남아있으면 애니메이션에 영향을 미치지 않음에도 불구하고 CPU 오버 헤드가 발생합니다.
- 선호에 따라 Unity 또는 모델링 도구, 어느 것이든 중복 IK 노드를 제거할 수 있습니다.
- 이상적으로는 IK 및 FK 계층을 모델링 시에 별도로 보관하여 필요할 때 IK 노드를 쉽게 제거할 수 있도록 해야 합니다.
렌더링 통계 창(Rendering Statistics Window) 확인
- Time per frame and FPS
- 하나의 게임 프레임을 처리 및 렌더링하는데 걸린 시간(프레임/초)
- 이 숫자는 프레임 업데이트 및 게임 뷰의 렌더링에 걸린 시간만 포함되는 것에 유의
- 에디터가 씬 뷰 인스펙터의 그리기 및 에디터 전용 작업을 수행하는데 걸린 시간은 포함되지 않음
- Batches
- “Batching” is where the engine attempts to combine the rendering of multiple objects into a chunk of memory in order to reduce CPU overhead due to resources switching.
- Saved by batching
- Number of batches that was combined. To ensure good batching, you should share materials between different objects as often as possible.
- Changing rendering states will break up batches into groups with the same states.
- Tris and Verts 그려진 삼각형과 정점의 수. 이것은 optimizing for low-end hardware에서 중요합니다.
- Screen 화면 크기, 안티 앨리어싱 레벨 및 메모리 사용량.
- SetPass 렌더링 패스의 수. 각 패스에 대해서 유니티 런타임은 CPU 오버헤드를 가져올 수 있는 새로운 쉐이더를 바인딩한다.
- Visible Skinned Meshes 렌더링된 스킨 메쉬 수
- Animations 재생 에니메이션 수
프레임 디버거(Frame Debugger)
- 메뉴: Window > Frame Debugger
- 매 프레임마다 그리는 오브젝트 정보를 보여줌
쉐이더 로딩타임 최적화(Optimizing Shader Load Time)
- http://docs.unity3d.com/kr/current/Manual/OptimizingShaderLoadTime.html
- 빌드타임에 쉐이더 분리(Shader build time stripping)
- Project Settings > Graphics > Shader stripping
항상 포함하는 쉐이더와 미리 로딩해야 하는 쉐이더 집합을 설정하여 쉐이더 로딩시간을 효율적으로 관리해 줌
항상 포함하는 쉐이더(Always Included Shaders)
- Project Settings > Graphics > Always Included Shaders
미리 로딩하는 여러가지 쉐이더 집합(Preloaded Shader Variant Collection)
쉐이더 집합 생성
Assets > Create > Shader Variant Collection
쉐이더 집합 미리 로딩 목록에 추가
Project Settings > Graphics > Preloaded Shaders
텍스처 캐시(Texture Cache)
- 모바일의 경우 GPU 제조사에서 권장하는 텍스처 포멧을 사용하면 캐시 적중률이 높아져 속도의 향상을 얻게 되며, 특히 GPU의 성능이 약한 스마트폰 기기에서는 이러한 부분의차이가 큼
- 플랫폼별 권장 텍스처 포멧
- 안드로이드 텍스처 압축 지원
- http://stackoverflow.com/questions/9148795/android-opengl-texture-compression/9514396#9514396
- ETC1 (Ericsson texture compression)
- This format is supported by all? Android phones.
- But, It doesn't support an alpha channel, so can only be used for opaque textures.
- PVRTC (PowerVR texture compression)
- Supported by devices with PowerVR GPUs (Nexus S, Kindle fire ...)
- ATITC (ATI texture compression)
- Used in devices with Adreno GPU from Qaulcomm (Nexus One ...)
- S3TC (S3 texture compression)
- This texture compression is used in the NVIDIA chipset integrated devices (Motorola Xoom ...)
- 안드로이드 Developer에 정의된 내용
- https://developer.android.com/guide/topics/graphics/opengl.html#textures
- ATITC (ATC) - ATI texture compression
- GL_AMD_compressed_ATC_texture
- GL_ATI_texture_compression_atitc
- PVRTC - PowerVR texture compression
- GL_IMG_texture_compression_pvrtc
- S3TC (DXTn/DXTC) - S3 texture compression
- GL_OES_texture_compression_S3TC
- GL_EXT_texture_compression_s3tc
- GL_EXT_texture_compression_dxt1
- GL_EXT_texture_compression_dxt3
- GL_EXT_texture_compression_dxt5
- 3DC - 3DC texture compression
- GL_AMD_compressed_3DC_texture
// Texture compression supported on Android
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Strings = gl.glGetString(GL10.GL_EXTENSIONS);
if (s.contains("GL_IMG_texture_compression_pvrtc")) {
// Use PVRTC compressed textures
} else if (s.contains("GL_AMD_compressed_ATC_texture") ||
s.contains("GL_ATI_texture_compression_atitc")) {
// Use ATITC compressed textures
} else if (s.contains("GL_OES_texture_compression_S3TC") ||
s.contains("GL_EXT_texture_compression_s3tc")) {
// Use DTX Textures
} else {
// Handle no texture compression founded
}
}
텍스처 설정
- Texture
- Normal map
- Editor GUI and Legacy GUI
- Sprite (2D and UI)
- Cursor
- Reflection
- Cookie
- Lightmap
- Advanced
텍스처 포멧지원 확인
- Android 장비에서 지원하는 텍스처 포멧을 확인해서 적합한 Asset들을 다운받는 형태는 어떨까?
- http://docs.unity3d.com/ScriptReference/SystemInfo.SupportsRenderTextureFormat.html
- UnityEngine.SystemInfo 클래스에서 확인할 수 있음
텍스처 생성팁
- 하이퀄리티 PVRTC 텍스처 생성방법
- ETC 포멧에 alpha 정보를 추가하는 방법
- ETC 포멧에는 기본적으로 alpha 정보가 포함되어 있지 않음
- http://malideveloper.arm.com/develop-for-mali/sample-code/etcv1-texture-compression-and-alpha-channels/
오버드로우(Overdraw)
- 물체가 겹쳐서 뒤에 있는 물체를 그린후에 앞에 있는 물체를 다시 그리면 겹치는 부분만큼 픽셀을 계산해서 그려야 함
- 이렇게 특정 영역의 픽셀을 다시 그리는 것을 오버드로우라고 함
- 불투명한 물체의 오버드로우를 줄이는 좋은 방법은 가장 큰 영역을 차지하는 물체를 먼저 그리게 설정하는 것
유용한 에셋
- Pro draw call optimizer light
- 현재 씬에서 사용중인 mesh texture를 Atlas로 쉽게 묶어주는 기능
- https://www.assetstore.unity3d.com/en/#!/content/16888
- Simplygon
- 모델의 폴리곤수를 %단위로 줄여줌
- https://www.assetstore.unity3d.com/en/#!/content/10144
[출처] https://github.com/zzragida/UnityDocs/wiki/Graphics-Optimization
반응형
'Unity3D > Tips' 카테고리의 다른 글
유니티 5.6에 OpenJDK 간단(꼼수) 설치 방법 (0) | 2019.01.04 |
---|---|
[링크] Unity에서 iPhone X를 대응하는 간편한 방법 (0) | 2018.12.18 |
[펌] App 안에 메일 보내는 기능을 넣고 싶을 때 (1) | 2018.09.18 |
[펌] iOS 리모트 프로파일링(Remote profiling) (0) | 2018.06.29 |
[펌] How to 100% check internet availability (0) | 2018.06.28 |