내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 타일 기반 렌더링 최적화

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1만

Windows Phone 8 단말기에서는 타일 기반 렌더링 방법을 이용하는 GPU를 사용합니다. 이 렌더링 방법은 메모리를 많이 사용하는 렌더링 작업에 내부 타일 캐시를 이용하여 그렇지 않은 경우 필요할 수 있는 오프 칩 메모리 트랜잭션을 방지함으로써 GPU 성능을 향상시키고 전원 소비를 줄입니다. 개념적으로 타일 기반 렌더링에서는 렌더 대상을 타일 캐시 크기 조각(타일)으로 분할하고 렌더링 대상에 대해 렌더링 명령을 각 타일당 한 번씩 여러 번 재생합니다. 타일 기반 GPU의 드라이버는 지능적으로 지정된 타일에 렌더링해야 하는 꼭짓점을 결정하고 필요한 경우 "비닝” 프로세스를 사용하여 삼각형 및 선 세그먼트를 클리핑합니다. 그러나 응용프로그램에서 현재 렌더링 대상의 타일이 필요 없는 경우를 드라이버가 분명히 인식하는 것은 아니므로 복수 또는 복합 렌더링 대상이 포함된 응용프로그램 시나리오에 대한 타일식 렌더링을 최적화하는 작업은 드라이버에 있어 더욱 어려운 작업입니다. 기본적으로 새 렌더링 대상 타일을 이동할 경우 드라이버는 타일 콘텐츠를 유지합니다. 즉, 타일을 다시 메모리에 대해 확인한 후 다음 타일을 로드하므로 불필요한 메모리 오버헤드를 초래합니다.

타일 기반 GPU의 타일 캐시 아키텍처는 캐시 내 그래픽 메모리 트랜잭션을 매우 효율적으로 처리하도록 고도로 최적화되어 있습니다. 예를 들어 알파 블렌딩은 계획적으로 타일 기반 GPU에 효과적으로 자유로운 반면 기존 GPU의 경우 외부 그래픽 메모리를 통한 필수 읽기-수정-쓰기 트랜잭션과 관련된 추가적인 오버헤드가 있습니다. 마찬가지로 MSAA(Multi-Sample Anti-Aliasing) 렌더링 대상은 최적화된 타일 캐시 아키텍처 덕분에 기존 GPU에 비해 타일 기반 GPU에 대한 오버헤드를 크게 감소시킵니다.

D3D 11(Direct3D11)에는 GPU 드라이버가 불필요한 타일 관련 메모리 트랜잭션을 피할 수 있도록 응용프로그램이 드라이버에 힌트를 제공할 수 있는 API가 포함됩니다. 다음 섹션에서 기존 및 새로운 D3D 11.1 GPU 힌팅 API는 일반적으로 응용프로그램 시나리오 및 타일 기반 렌더링의 맥락에서 설명됩니다.

일반적으로 여러 렌더링 대상을 사용하는 응용프로그램은 지정된 장면에 대한 단일 렌더링 대상 처리를 완료한 후 다음 대상으로 이동해서 불필요한 타일 확인 및 관련된 성능 저하를 방지해야 합니다. 예를 들어 현재 프레임에 대한 백버퍼를 렌더링할 때 샘플링될 질감을 생성하는 하나 이상의 화면 외부 렌더링 대상을 사용하는 응용프로그램은 각 질감 렌더링을 완료한 후 백버퍼에 렌더링해야 합니다.

여러 질감 계층을 결합하는 응용프로그램 시나리오의 경우 불필요한 성능 저하 외부 메모리 트랜잭션과 불필요한 D3D11 호출이 포함된 "증분 렌더링"을 방지하기 위해 증분 병합을 피해야 합니다. 예를 들어 병합을 연기하지 않고 4개 질감 계층을 증분식으로 병합하는 결과를 고려합니다.

기본 설정 메서드

비효율적 메서드

  1. 렌더링 대상 A 설정, A 지우기, A에 그리기

  2. 렌더링 대상 B 설정, B 지우기, B에 그리기

  3. 렌더링 대상 C 설정, C 지우기, C에 그리기

  4. 렌더링 대상 D 설정, D 지우기, A, B 및 C를 사용하여 D에 그리기

이 메서드는 렌더링 대상을 설정하기 위해 4개 호출을 생성합니다.

  1. 렌더링 대상 A 설정, A 지우기, A에 그리기

  2. 렌더링 대상 D 설정, D 지우기, A를 D에 그리기

  3. 렌더링 대상 B 설정, B 지우기, B에 그리기

  4. 렌더링 대상 D 설정, B를 D에 그리기

  5. 렌더링 대상 C 설정, C 지우기, C에 그리기

  6. 렌더링 대상 D 설정, C를 D에 그리기

이 메서드는 렌더링 대상을 설정하기 위해 6개 호출을 생성합니다.

위와 같은 기본 설정 메서드에서는 각 렌더링 대상으로 전환된 직후 지우기가 호출됩니다. 이 호출은 지정된 렌더링 대상에 대한 "증분 렌더링"이 필요하지 않다는 정보를 GPU 드라이버에 신호로 보냅니다. 즉, 렌더링하기 전에 각 렌더링 대상 타일을 읽을 필요가 없습니다. 다음 섹션에서 지우기에 대한 대안도 참조하세요. 비효율적 예제에서는 OMSetRenderTarget에 대한 추가 호출 이외에도 렌더링 대상 D에 대한 타일을 다시 메모리에 대해 여러 번 읽어야 합니다.

응용프로그램이 미리 기존 렌더링 대상 리소스의 모든 픽셀이 바뀔 것이므로 후속 렌더링 작업이 필요하지 않음을 인식하는 시나리오의 경우 새로운 “삭제” 메서드가 D3D 11.1에 추가되므로 이 정보를 GPU 드라이버에 신호로 보낼 수 있습니다. 이전에 응용프로그램에는 이 시나리오에 대한 두 가지 대안이 있었습니다.

  1. 지우지 않고 장면을 그리는 방법은 GPU가 그리기 전에 각 타일을 타일 캐시로 읽어서 각 타일을 복원해야 하므로 타일 기반 GPU에 부담이 큽니다. 분명히 응용프로그램이 이전 콘텐츠를 사용하지 않는 경우 이러한 복원은 상당히 불필요한 오버헤드를 나타냅니다.

  2. 그리기 전에 지우는 방법을 사용하면 드라이버가 타일을 복원하지 않지만 지우기 명령을 실행하려면 렌더링 대상 쓰기 작업이 필요합니다. 또한 이전 콘텐츠가 응용프로그램에서 사용되지 않을 경우 이 작업은 불필요합니다.

새로운 D3D 11.1 삭제 메서드는 다음 표와 같이 응용프로그램에 보다 효율적인 제3의 옵션을 제공합니다.

ID3D11DeviceContext1::DiscardResource

리소스의 현재 콘텐츠와 모든 보기가 더 이상 정의되지 않으므로 후속 렌더링 단계에서 유지될 필요가 없다는 정보를 GPU 드라이버에 신호로 보냅니다.

ID3D11DeviceContext1::DiscardView

기본적으로 DiscardResource와 동일한 작업이지만 범위가 특정 렌더링 대상 보기로 지정됩니다.

응용프로그램이 렌더링 대상 리소스 또는 보기에서 삭제를 호출하면 이어서 그리기가 호출되고 모든 픽셀이 업데이트됩니다. 삭제 후에 렌더링 대상 콘텐츠가 정의되지 않으므로 응용프로그램이 콘텐츠에 대해 알파 블렌딩하거나 부분적으로 가려진 모양을 그릴 수 없습니다.

ID3D11DeviceContext::Flush에 대한 장면 중간 호출은 성급한 타일 확인을 유발하므로 불필요한 타일 읽기가 발생합니다. 자세한 내용은 ID3D11DeviceContext::Flush 참조 항목에서 설명 섹션을 참조하세요.

지정된 장면에 대해 렌더링 대상의 범위 지정된 부분만 업데이트된다는 것을 미리 인식하는 앱에서는 ID3D11DeviceContext::RSSetScissorRects 메서드를 사용해야 하므로 GPU 드라이버가 미리 처리하지 않을 타일을 결정할 수 있습니다.

표시:
© 2014 Microsoft