동적 버퍼 그리기 순서 처리 최적화

2658 단어 Unity

대상의 묘사 처리는 고부하이다


객체를 화면에 그릴 때 그래픽 API(OpenGL 또는 Direct3D 등)를 드로잉 호출합니다.
그래픽 API 내에서 여러 작업을 수행하기 때문에 CPU가 많이 소비됩니다.
Unity에서는 부하를 억제하기 위한 두 가지 기교가 있다.

  • 동적 일괄 처리: 상당히 작은 격자에 대해 그 정점을 CPU로 변환하고 여러 개의 비슷한 정점을 그룹으로 삼아 집중적으로 그립니다

  • 정적 일괄 처리: 정적 (즉, 움직이지 않음) 게임 대상을 큰 격자와 결합시켜 빠르게 렌더링합니다
  • 일괄 처리의 전제 조건 설정


    가능한 한 같은 재료 공유


    같은 소재를 공유하는 게임 대상만 대량 처리할 수 있습니다.
    예를 들어, 텍스쳐가 다른 객체만 다른 재료로 만든 경우에는 일괄 처리되지 않습니다.

    동적 일괄 처리를 효과적으로 사용하는 요점


    동적 일괄 처리에는 CPU가 많이 사용됩니다.
    동적 배치 객체가 그려질 때
    個別に描画するコスト > 動的バッチ処理のコスト + バッチ化されたドローコールの処理コスト
    
    유효하다.
    즉, 동적 일괄 처리가 유효한 것은 그래픽 API의 처리 비용이 높은 경우입니다.
    처리 부하가 비교적 낮은 그래픽 API(예를 들어 최신 API(예를 들어 Apple의 Metal)를 사용하면 장점이 없을 수 있습니다.

    동적 일괄 처리 활성화 방법


    정점 속성 900 이하, 정점 수 300 이하


    정점수를 줄이다.
    동적 게임 대상을 일괄 처리할 때, 각 정점마다 일정한 비용이 있을 것이다.따라서 일괄 처리는 정점 속성 900 이하, 정점 수 300 이하의 격자에만 적용됩니다.

    변환에 미러가 포함된 경우 객체에 일괄 처리가 적용되지 않습니다.


    변환: 대상의 변환 조작.
    https://docs.unity3d.com/ScriptReference/Transform.html
    x축의 scale이 -1이면 대칭복사(대칭복사)가 됩니다.
    https://answers.unity.com/questions/326905/how-to-mirror-an-object-reverse-its-sides.html

    정적 배치


    정적 일괄 처리는 CPU에서 정점 변환을 하지 않기 때문에 CPU는 동적 일괄 처리보다 부하가 낮지만 비교적 많은 메모리를 소모한다.
    정적 일괄 처리가 많은 메모리를 차지하는 것은 합성된 기하학을 저장하기 위해 추가 메모리를 소모하기 때문이다.
    정적 일괄 처리를 이용하기 위해서는 이 대상이 정적이며 게임 내에서 이동, 회전, 축소를 하지 않도록 명확하게 설정해야 한다.
    이렇게 하려면 검사자의 Static 확인란을 선택해야 합니다.

    정적 일괄 처리를 사용하지 않는 것이 가장 좋다


    밀집된 삼림에서 나무를 정태적으로 일괄 처리하는 등 상황에서 메모리 사용량은 거대해지고 때로는 허용 범위를 초과할 수도 있다.
    이 경우 렌더링 성능이 저하되고 정적 일괄 처리를 취소할 수 있습니다.

    스왑 드로잉 순서를 통해 최적화


    각 객체의 렌더 대기열 조정


    렌더 대기열은 기본적으로 2000으로 설정됩니다.
    동일한 재료의 경우 동적 배치 객체가 되지만 배치 순서는 연속적으로 표시됩니다.
    A, B 재료가 있고 A, B 기반 객체 A1, A2, B1, B2가 있는 경우
    예 1: 비연속, 일괄 처리
    A1→B1→A2→B2
    예 1: 연속 배치
    A1→A2→B1→B2
    이 순서대로 그리기
  • A의 렌더링 Queue는 2001입니다
  • B의 렌더링 Queue는 2002입니다
  • 에서 기술한 장면은 다음과 같은 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 부피를 분석하도록 한다.

    참고 자료


    일괄 처리 추출 호출


    참고서


    Unity 게임 프로그래밍 성경

    좋은 웹페이지 즐겨찾기