렌더링 트리의 성능 영향을 줄이려면 어떻게해야합니까?


24

낮은 폴리 양식화 된 게임을 만들고 있습니다. 물이있는 지형이 있고 많은 나무가 필요합니다. 지금은 10,000 그루의 나무가 있습니다. 각 나무는 200 개 이하의 삼각형으로 구성되어 있으므로 너무 과세되지 않습니다.

주요 문제는 호수가 있고 호수가 상당히 크다는 것입니다. 당신은 실제로 호수 반대편에있는 나무를 볼 수 없습니다. 특히 나무를 걷다가 갑자기 나무가 나타나면 정말 나빠 보입니다.

이 문제를 해결하려면 호수 반대편에 알맞은 양의 나무를 볼 수 있도록 나무 거리를 늘려야하지만 성능이 40-50fps로 떨어지고 게임에는 다른 것이 거의 없습니다. 도움이된다면 GTX 1080을 사용하고 있습니다.

더 많은 나무를 사용하여 게임을 더 빨리 실행하려면 어떻게해야합니까?


IIRC의 Silent Hill은 안개를 사용하여 원거리 자르기 평면에서 컷오프를 숨겨서 안개가 잘리는 곳 너머의 물건을 동적으로로드하기 시작했습니다. 게임 분위기가 바뀌면 도움이 될 수 있습니다.
Cody

나무가 창문을 보도록 그리기 때문에 성능이 저하됩니다.
mbomb007

프로파일 러를 실행 해 보셨습니까? 그렇다면 병목 현상은 어디에 있습니까?
Mikael Högström

당신은 어떤 종류의 절두체 컬링을하고 있습니까?
Krythic

절두체 컬링이란?
mr-matt

답변:


43

그리기 성능을 높이기 위해 할 수있는 일이 몇 가지 있습니다.

  1. 당신은 그들이 아주 멀리 있다고 말했다. LOD 를 사용 하여 해당 트리의 정점 수를 줄이고 그리면 그려지는 모든 정점을 통과하는 데 필요한 시간을 줄일 수 있습니다. 비록 이것이 당면한 문제는 아니지만 (GTX1080은 각각 200 tris를 가진 10k 그루의 나무, gpu의 puny 숫자) 여전히 포함되어 있습니다. 빌보드는 LOD 수준을 낮추는 데 효과적인 도구입니다. 기본적으로 평면은 항상 카메라를 향하고 나무의 렌더링 된 이미지를 향하고 있기 때문입니다. 깊이 감을 잃어 버리기 때문에 플레이어는 차이를 거의 느끼지 못하기 때문에 가장 낮은 레벨에 적합합니다.

  2. 일괄 처리 를 활성화 했습니까 ? 메쉬의 정점 수가 상당히 낮은 경우 동적 배치는 일반적으로 자동으로 수행됩니다. 부모 게임 오브젝트의 유니티 에디터에서 체크 박스를 체크하여 트리를 정적으로 만들어 정적 배치를 시도 할 수도 있습니다. 애니메이션 객체에는 적합하지 않습니다. 이 작업을 수행하려면 객체에 공유 재질이 있어야합니다.

  3. 사용자 지정 일괄 처리를 사용하면 단위를 처리하는 대신 청크를 직접 생성하여 렌더링을 제어 할 수 있으며 더 큰 메쉬에 대한 일괄 처리도 가능합니다. 이것은 Mesh.CombineMeshes에 의해 쉽게 수행됩니다 . 또한 애니메이션 객체에서는 제대로 작동하지 않습니다. 이 작업을 수행하려면 객체에 공유 재질이 있어야합니다. 당신은 아마 세상을 어떤 종류의 덩어리로 나누고 그것들로부터 배치를 만들고 싶을 것입니다. 이러한 청크 생성 방법은 실제로 세계에서 카메라가 움직이는 방식에 달려 있습니다.

  4. 셰이더 에서 인스 턴싱 을 활성화 합니다 . 인스 턴싱을 통해 엔진은 한 번의 그리기 호출로 여러 메쉬 (동일한 메쉬로)를 그릴 수 있습니다. 이것이 작동하려면 오브젝트에 공유 메쉬 및 공유 셰이더가 있어야합니다. 재질은 다양 할 수 있지만 셰이더는 다양한 속성을 모두 지원해야합니다.

    엔진이 인스턴스화 된 렌더링 배치를 더 잘 만들려면 장면에서 동일한 메시를 함께 그룹화 할 수 있습니다. 머티리얼 렌더 큐로 플레이하면 하나의 메시에 항상 같은 머티리얼이 있다면 좋은 결과를 얻을 수 있습니다. 현재 개발중인 모바일 게임을 개발하는 동안 테스트 장면에서 드로우 콜을 절반 이상 줄였습니다. 또한 Unity 5.6부터 Enable Instancing머티리얼 의 체크 박스 를 체크해야합니다 .

  5. 드로우 콜 및 SetPass 콜은 일반적으로 유지하십시오. 이것들은 GPU가 물건을 그리는 기본 요구 사항이며 오버 헤드가 큽니다. 일괄 처리 및 인스턴스화가 수행하는 드로우 콜을 줄이면 CPU가 대기 시간을 크게 줄여야 할 수있는 전반적인 성능이 향상됩니다. SetPass 호출은 현재 셰이더에 대한 변경 사항이므로 여러 다른 재질이있는 경우 여러 SetPass 호출이 발생하여 CPU가 약간 대기하게됩니다.

  6. 장면이 거대하고 CPU 시간이 장면의 모든 오브젝트를 통과하는 경우 장면의 오브젝트를 줄이십시오. 나무를 개별적으로 배치하는 대신 그룹화하여 단일 객체로 만듭니다. 또한 Unity가 캐시 된 변환을 버리고 전체 장면 트리를 다시 계산할 수 있도록 트리 나 부모 객체를 이동하지 않아야합니다.

  7. 장면이 거대하고 CPU 시간이 여전히 대부분의 오브젝트를 렌더링하기 위해 목록을 만들기 위해 장면 트리를 걷는 Unity에 들어가는 경우 Unity가 렌더링을 처리하지 못하게 할 수 있습니다. 그리기 가능한 객체를 추적하는 더 좋은 방법이 있다면 CommandBuffer.DrawMeshInstanced 또는 Graphics.DrawMeshInstanced 를 사용하여 손으로 그릴 수 있습니다. 나는 이것에 대해 훨씬 더 발전하고 컬링과 관련되어 있기 때문에 더 자세히 설명하지 않을 것입니다.

정적 또는 동적 일괄 처리가 제대로 작동하지 않는 경우 (프레임 디버거를 확인하여 볼 ​​수 있음) 실제로 공유 재료를 사용하고 있고을 호출하여 실수로 재료를 복사하지 않는지 확인해야합니다 meshRenderer.material. 를 호출하면 .material자재가 복사되고 배치가 중단됩니다. .sharedMaterial대신 사용하십시오 .

Unity 5.6부터 프레임 디버거를 사용하여 특정 드로우 콜이 이전 드로우 콜과 일괄 처리되지 않은 이유를 확인할 수 있습니다. 게임의 드로우 콜을 줄이려고 할 때 도움이됩니다.

인스 턴싱은 정적 / 동적 / 커스텀 배치에 비해 다음과 같은 장점이 있습니다.

  • 메시를 메모리에 복제 할 필요가 없으므로 적은 메모리 사용
  • 여러 재질을 사용할 수 있으며 공유 셰이더 만 필요합니다
  • 객체 애니메이션 가능

또한 단점은 Unity의 새로운 기능이며 약간 불안정 할 수 있습니다. 또한 구형 또는 모바일 장치 GPU가 인스 턴싱을 반드시 지원하지는 않습니다.


1. 그렇습니다. LOD를 사용해 보았는데 놀랍게도 실제로 LOD를 악화 시켰습니다. 정점 수가 약간 작은 나무의 3 가지 변형이 있었고 그 위에 나무의 렌더링 된 이미지가있는 평면이 하나 있습니다.
mr-matt

2. 내 모든 나무는 정적으로 표시되어 있습니다. 내가 아는 한 일괄 처리가 가능합니까? 그 맞습니까? 그리고 당신이 공유 자료를 말할 때, 당신은 단순히 나무가 같은 자료를 가지고 있다는 것을 의미합니까?
mr-matt

3. 실제로 어떤 종류의 성능 개선이 이루어 집니까? 시도해 볼 가치가 있습니까?
mr-matt

1
2/3 : 내 경험에 따르면 Unity는 동적 배치에서 잘 작동하지 않으며 정적 배치는 빌드 크기를 늘려서 배치를 직접 구현하고 메쉬를로드 시간으로 결합했습니다. 이 기술을 사용하여 2500 개의 드로우 콜을 만들어 약 300 개의 드로우 콜로 압축 할 수 있었는데, 이는 드로우 콜이 중요한 모바일 게임에 중요했습니다. 계산할 불필요한 정점을 조금 만들었습니다 (화면 밖).
Lasse

2
나무 성능 저하에 대한 질문을 읽고 게시판에 관한 한 마디도 잃어 버릴 때 tfw
Num Lock

13

좋아, 문제는 단순히 사전 계산 된 실시간 GI를 사용하지 않았다는 것입니다. 조금 전에 확인했지만 즉각적인 효과는 없었으므로 잊어 버렸고 조명 처리 시간도 너무 길었습니다. 그러나 방금 처리를 마쳤으며 fps가 3 배나 증가했습니다. 따라서 지금은 그대로두고 앞으로는 항상 프리 컴퓨터 실시간 GI를 사용하고 있는지 확인하십시오!

실적을 더욱 향상시키기 위해 할 수있는 일이 여전히 있다면, 가장 감사하겠습니다.


2
장면이 큰 경우에도 오 클루 전 컬링을 사용하십시오. 예를 들어 많은 지형과 같이 청크로 분할하여로드 및 언로드하십시오.
솔직한 달 _Max_

문제를 해결 한 것으로 보이면이 답변을 수락해야합니다.
Gnemlock
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.