그리기 성능을 높이기 위해 할 수있는 일이 몇 가지 있습니다.
당신은 그들이 아주 멀리 있다고 말했다. LOD 를 사용 하여 해당 트리의 정점 수를 줄이고 그리면 그려지는 모든 정점을 통과하는 데 필요한 시간을 줄일 수 있습니다. 비록 이것이 당면한 문제는 아니지만 (GTX1080은 각각 200 tris를 가진 10k 그루의 나무, gpu의 puny 숫자) 여전히 포함되어 있습니다. 빌보드는 LOD 수준을 낮추는 데 효과적인 도구입니다. 기본적으로 평면은 항상 카메라를 향하고 나무의 렌더링 된 이미지를 향하고 있기 때문입니다. 깊이 감을 잃어 버리기 때문에 플레이어는 차이를 거의 느끼지 못하기 때문에 가장 낮은 레벨에 적합합니다.
일괄 처리 를 활성화 했습니까 ? 메쉬의 정점 수가 상당히 낮은 경우 동적 배치는 일반적으로 자동으로 수행됩니다. 부모 게임 오브젝트의 유니티 에디터에서 체크 박스를 체크하여 트리를 정적으로 만들어 정적 배치를 시도 할 수도 있습니다. 애니메이션 객체에는 적합하지 않습니다. 이 작업을 수행하려면 객체에 공유 재질이 있어야합니다.
사용자 지정 일괄 처리를 사용하면 단위를 처리하는 대신 청크를 직접 생성하여 렌더링을 제어 할 수 있으며 더 큰 메쉬에 대한 일괄 처리도 가능합니다. 이것은 Mesh.CombineMeshes에 의해 쉽게 수행됩니다 . 또한 애니메이션 객체에서는 제대로 작동하지 않습니다. 이 작업을 수행하려면 객체에 공유 재질이 있어야합니다. 당신은 아마 세상을 어떤 종류의 덩어리로 나누고 그것들로부터 배치를 만들고 싶을 것입니다. 이러한 청크 생성 방법은 실제로 세계에서 카메라가 움직이는 방식에 달려 있습니다.
셰이더 에서 인스 턴싱 을 활성화 합니다 . 인스 턴싱을 통해 엔진은 한 번의 그리기 호출로 여러 메쉬 (동일한 메쉬로)를 그릴 수 있습니다. 이것이 작동하려면 오브젝트에 공유 메쉬 및 공유 셰이더가 있어야합니다. 재질은 다양 할 수 있지만 셰이더는 다양한 속성을 모두 지원해야합니다.
엔진이 인스턴스화 된 렌더링 배치를 더 잘 만들려면 장면에서 동일한 메시를 함께 그룹화 할 수 있습니다. 머티리얼 렌더 큐로 플레이하면 하나의 메시에 항상 같은 머티리얼이 있다면 좋은 결과를 얻을 수 있습니다. 현재 개발중인 모바일 게임을 개발하는 동안 테스트 장면에서 드로우 콜을 절반 이상 줄였습니다. 또한 Unity 5.6부터 Enable Instancing
머티리얼 의 체크 박스 를 체크해야합니다 .
드로우 콜 및 SetPass 콜은 일반적으로 유지하십시오. 이것들은 GPU가 물건을 그리는 기본 요구 사항이며 오버 헤드가 큽니다. 일괄 처리 및 인스턴스화가 수행하는 드로우 콜을 줄이면 CPU가 대기 시간을 크게 줄여야 할 수있는 전반적인 성능이 향상됩니다. SetPass 호출은 현재 셰이더에 대한 변경 사항이므로 여러 다른 재질이있는 경우 여러 SetPass 호출이 발생하여 CPU가 약간 대기하게됩니다.
장면이 거대하고 CPU 시간이 장면의 모든 오브젝트를 통과하는 경우 장면의 오브젝트를 줄이십시오. 나무를 개별적으로 배치하는 대신 그룹화하여 단일 객체로 만듭니다. 또한 Unity가 캐시 된 변환을 버리고 전체 장면 트리를 다시 계산할 수 있도록 트리 나 부모 객체를 이동하지 않아야합니다.
장면이 거대하고 CPU 시간이 여전히 대부분의 오브젝트를 렌더링하기 위해 목록을 만들기 위해 장면 트리를 걷는 Unity에 들어가는 경우 Unity가 렌더링을 처리하지 못하게 할 수 있습니다. 그리기 가능한 객체를 추적하는 더 좋은 방법이 있다면 CommandBuffer.DrawMeshInstanced 또는 Graphics.DrawMeshInstanced 를 사용하여 손으로 그릴 수 있습니다. 나는 이것에 대해 훨씬 더 발전하고 컬링과 관련되어 있기 때문에 더 자세히 설명하지 않을 것입니다.
정적 또는 동적 일괄 처리가 제대로 작동하지 않는 경우 (프레임 디버거를 확인하여 볼 수 있음) 실제로 공유 재료를 사용하고 있고을 호출하여 실수로 재료를 복사하지 않는지 확인해야합니다 meshRenderer.material
. 를 호출하면 .material
자재가 복사되고 배치가 중단됩니다. .sharedMaterial
대신 사용하십시오 .
Unity 5.6부터 프레임 디버거를 사용하여 특정 드로우 콜이 이전 드로우 콜과 일괄 처리되지 않은 이유를 확인할 수 있습니다. 게임의 드로우 콜을 줄이려고 할 때 도움이됩니다.
인스 턴싱은 정적 / 동적 / 커스텀 배치에 비해 다음과 같은 장점이 있습니다.
- 메시를 메모리에 복제 할 필요가 없으므로 적은 메모리 사용
- 여러 재질을 사용할 수 있으며 공유 셰이더 만 필요합니다
- 객체 애니메이션 가능
또한 단점은 Unity의 새로운 기능이며 약간 불안정 할 수 있습니다. 또한 구형 또는 모바일 장치 GPU가 인스 턴싱을 반드시 지원하지는 않습니다.