3D RENDERING
OPTIMIZING #5
        - 박 민 근 (민군)
 Devrookie(café.naver.com/devrookie)

                                       DevRookie 박민근(민군)   1
렌더링 옵티마이징
최적화
렌더링 파이프라인이란?
렌더링 파이프라인 구조
DirectX Pipeline
보틀넥이 발생하는 이유?
          • 렌더링에 영향을 주는 요소
            - 가속 하드웨어와의 병렬성
            - 하드웨어의 대역폭 한계

          • 렌더링 병목 요소
            - 프레임 버퍼 대역폭
            - 텍스처 대역폭
            - 셰이더
            - 버텍스, 폴리곤의 수
            - 시스템 메모리 전송 대역폭
(Nvidia GDC 03)




Batch의 크기는
Batch의 개수는
Batch 란 무엇인가?



• 모든 DrawIndexedPrimitive()함수 콜을 말한다.
  – N개의 삼각형을 GPU로 보낸다.
  – Batch 안의 모든 폴리곤은 같은
    RenderState의 영향을 받는다.
  – SetState 함수 호출도 batch의 일부이다.

• Batch의 최적화를 다른 말로 표현한다면 HAL 함
수를 최대한 적게 부르는 것이라 할 수 있다
배치 크기에 대한 그래프
This Year: Son Of A Batch
(Nvidia GDC 04)




                  • What makes an app ‘batchy’?
                    – Too many state changes

                  • What kinds of state changes?

                  • Techniques to reduce batches
API Call
                                      Average number of Cycles
        SetVertexShader                                                      12100
    SetVertexDeclaration                                                 11250
                SetFVF                                                   11200
             LightEnable                                         9000
 SetPixelShaderConstant                                          9000
         SetPixelShader                                  7000
        SetRenderTarget                               6250
       SetStreamSource                              5800
              SetIndices                           5600
                SetLight                         5100
              ZENABLE                     3900
           SetTransform                  3750
             SetMaterial                3700
             SetTexture               3100
SetVertexShaderConstant             2700
                WRAP0               2700
             MINFILTER             2500
            MAGFILTER             2400
             COLOROP             2100

                           0   2000    4000      6000     8000   10000   12000   14000
Texture의 대역폭을 줄입시다




           • Render State Sorting
           • Texture Sorting
           • Texture의 크기를 줄임.
           • Texture 압축 (DDS)
           • Mipmapping의 사용
Frame Buffer의 대역폭을 줄입시다


• 가시거리 순으로 그림.
• 알파 블렌딩을 최소화
• 가능하다면 depth write를 끔(light map)
• 가능하다면 16비트 깊이 버퍼를 사용
– 스텐실 버퍼를 사용 하지 않을 때.
• 가능하다면 16비트 컬러 사용
– Render To Texture 때.
- clear가 필요 없다면 clear 하지 않는다
비디오 메모리 접근을 줄입시다




- lock/unlock을 최소로 줄이며, 아예 안 한다
- lock 을 할 때에도 read는 하지 않는다
- lock 을 할 경우
D3DLOCK_NOOVERWRITE 등의 옵션으로
최대한 병렬성을 살린다
- 셰이더를 활용한다
Instancing



             DirectX 9 Instancing API
             What do you need?
             – DirectX 9.0c
             – VS 3.0/PS 3.0 support
10. 참고 자료
1.   Optimization for DirectX9 Graphics – Nvidia
2.   [KGC] 렌더링 파이프라인 최적화 – 현호진
3.   [KASA] 렌더링 퍼포먼스 옵티마이징 – 김성익
4.   [KGC] 소프트웨어 렌더러개발 - 김성완




                                      DevRookie 박민근(민군)   23
Q&A

[박민근] 3 d렌더링 옵티마이징_5 최적화 전략

  • 1.
    3D RENDERING OPTIMIZING #5 - 박 민 근 (민군) Devrookie(café.naver.com/devrookie) DevRookie 박민근(민군) 1
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
    보틀넥이 발생하는 이유? • 렌더링에 영향을 주는 요소 - 가속 하드웨어와의 병렬성 - 하드웨어의 대역폭 한계 • 렌더링 병목 요소 - 프레임 버퍼 대역폭 - 텍스처 대역폭 - 셰이더 - 버텍스, 폴리곤의 수 - 시스템 메모리 전송 대역폭
  • 8.
    (Nvidia GDC 03) Batch의크기는 Batch의 개수는
  • 9.
    Batch 란 무엇인가? •모든 DrawIndexedPrimitive()함수 콜을 말한다. – N개의 삼각형을 GPU로 보낸다. – Batch 안의 모든 폴리곤은 같은 RenderState의 영향을 받는다. – SetState 함수 호출도 batch의 일부이다. • Batch의 최적화를 다른 말로 표현한다면 HAL 함 수를 최대한 적게 부르는 것이라 할 수 있다
  • 10.
  • 11.
    This Year: SonOf A Batch (Nvidia GDC 04) • What makes an app ‘batchy’? – Too many state changes • What kinds of state changes? • Techniques to reduce batches
  • 12.
    API Call Average number of Cycles SetVertexShader 12100 SetVertexDeclaration 11250 SetFVF 11200 LightEnable 9000 SetPixelShaderConstant 9000 SetPixelShader 7000 SetRenderTarget 6250 SetStreamSource 5800 SetIndices 5600 SetLight 5100 ZENABLE 3900 SetTransform 3750 SetMaterial 3700 SetTexture 3100 SetVertexShaderConstant 2700 WRAP0 2700 MINFILTER 2500 MAGFILTER 2400 COLOROP 2100 0 2000 4000 6000 8000 10000 12000 14000
  • 15.
    Texture의 대역폭을 줄입시다 • Render State Sorting • Texture Sorting • Texture의 크기를 줄임. • Texture 압축 (DDS) • Mipmapping의 사용
  • 19.
    Frame Buffer의 대역폭을줄입시다 • 가시거리 순으로 그림. • 알파 블렌딩을 최소화 • 가능하다면 depth write를 끔(light map) • 가능하다면 16비트 깊이 버퍼를 사용 – 스텐실 버퍼를 사용 하지 않을 때. • 가능하다면 16비트 컬러 사용 – Render To Texture 때. - clear가 필요 없다면 clear 하지 않는다
  • 20.
    비디오 메모리 접근을줄입시다 - lock/unlock을 최소로 줄이며, 아예 안 한다 - lock 을 할 때에도 read는 하지 않는다 - lock 을 할 경우 D3DLOCK_NOOVERWRITE 등의 옵션으로 최대한 병렬성을 살린다 - 셰이더를 활용한다
  • 21.
    Instancing DirectX 9 Instancing API What do you need? – DirectX 9.0c – VS 3.0/PS 3.0 support
  • 23.
    10. 참고 자료 1. Optimization for DirectX9 Graphics – Nvidia 2. [KGC] 렌더링 파이프라인 최적화 – 현호진 3. [KASA] 렌더링 퍼포먼스 옵티마이징 – 김성익 4. [KGC] 소프트웨어 렌더러개발 - 김성완 DevRookie 박민근(민군) 23
  • 24.