2017-10-15 12 views
2

Metal Best Practices Guide에는 최상의 성능을 위해 "동적 버퍼 데이터를 업데이트하기 위해 트리플 버퍼링 모델을 구현"하고 "동적 버퍼 데이터는 버퍼에 저장된 자주 업데이트되는 데이터를 참조해야합니다"라고 명시되어 있습니다.금속 모범 사례 : 트리플 버퍼링 - 텍스처도?

모든 프레임을 업데이트해야하는 경우 MTLTexture은 "버퍼에 저장된 자주 업데이트되는 데이터"로 간주됩니까? 위 가이드의 모든 예는 MTLBuffer에 초점을 둡니다.

메틀 키트에서 애플의 구현은 nextDrawable이라는 개념을 가지고 있습니다. 그래서 여기에 무슨 일이 일어 났을까요?

답변

3

명령이 비행 중에있을 수 있고 CPU에서 동일한 텍스처를 수정하는 동안 텍스처를 액세스 (읽기/샘플링/쓰기) 할 수있는 경우 (예 : -replaceRegion:... 메서드 중 하나를 사용하거나 백업 IOSurface), 멀티 버퍼링 기법이 필요합니다.

GPU의 텍스처 만 수정하는 경우 (렌더링, 셰이더 함수에서 작성 또는 blit 명령 인코더 메서드를 사용하여 복사), 다중 버퍼링이 필요하지 않습니다. . 셰이더 함수 내에서 텍스쳐 펜스를 사용해야 할 수도 있고 정확히 무엇을하고 있느냐에 따라 드로 콜 사이에서 렌더 명령 인코더에 -textureBarrier을 호출해야 할 수도 있습니다.

예, nextDrawable은 다중 버퍼링 형식을 제공합니다. 이 경우 CPU 사용으로 인한 것이 아닙니다. 이전에 렌더링 된 텍스처가 여전히 화면에 표시되는 동안 한 텍스처로 렌더링 할 것입니다. 새로운 렌더링이 화면에 표시되기 직전에 텍스처를 오버 드로하여 결과가 손상 될 수 있기 때문에 둘 다 동일한 텍스처를 사용하고 싶지는 않습니다.

+0

흥미 롭습니다. 감사합니다. 따라서 다중 패스 렌더링의 경우 - 한 패스는 배경을 텍스처로 렌더링하고, 다음 패스는 다른 텍스처로 오버레이를 렌더링하고, 이전 두 텍스처를 함께 합성하는 최종 패스는 동일한 위험을 감수합니다 마지막 패스가 아니라 첫 번째 두 패스의 대상 텍스처를 멀티 버퍼링하지 않고 손상을 방지 할 수 있습니까? – Tricky

+1

설명하는 시나리오를 이해한다면 멀티플 버퍼링이 필요하지 않습니다. 한 프레임에 대한 두 텍스처의 합성은 다음 프레임을 위해 덮어 쓰기 전에 완료됩니다 (* 잘못된 순서로 명령을 대기열에 넣지 않는 한). –