GL_STATIC_DRAW vs GL_DYNAMIC_DRAW vs GL_STREAM_DRAW : 중요합니까?


11

OpenGL에서 버퍼 객체 함수 ( glBufferData,, glBufferSubData아마도 몇 가지 다른 것)에는 매개 변수가 있으며 usage, 설명서에서 의도 된 사용법에 대한 힌트로 설명되어 있으며, 구현이 더 나은 성능을 낼 수 있도록 도와줍니다.

용법

데이터 저장소의 예상 사용 패턴을 지정합니다. 상징적 상수는해야한다 GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, 또는 GL_DYNAMIC_COPY.
[...]
사용법은 버퍼 객체의 데이터 저장소에 액세스하는 방법에 대한 GL 구현의 힌트입니다. 이를 통해 GL 구현은 버퍼 개체 성능에 큰 영향을 줄 수있는보다 지능적인 결정을 내릴 수 있습니다. 그러나 데이터 저장소의 실제 사용량을 제한하지는 않습니다.

위키 도 비슷합니다.

이것들은 결국 힌트 일뿐입니다. STATIC 버퍼가 작성된 후 수정하거나 STREAM 버퍼를 수정하지 않는 것은 완전히 합법적 인 OpenGL 코드입니다.
[...]
주의 깊은 프로파일 링으로 만 답변 할 수있는 질문입니다. 그럼에도 불구하고 대답은 특정 하드웨어 공급 업체의 특정 드라이버 버전에 대해서만 정확합니다.

이 매개 변수는 어느 정도 관련이 있습니까? 운전자는 실제로이를 고려하고 있으며, 실제로 경험에 따라 실제로 성능에 어느 정도 영향을 미칩니 까? 공유 할 데이터가 있습니까?

기존 API 중 하나로 구현하기 위해 얇은 그래픽 API 추상화 계층을 작성 했으며이 매개 변수를 모두 무시하고 노출 된 추상화에서 숨기려고합니다.

답변:


7

이것은 구현마다 다를 수 있지만, 내가 일한 드라이버는 주로 메모리 레이아웃을 결정하기 위해 이것을 사용했습니다. 이 힌트에 의해 활성화 된 최적화는 원하는 힌트에 상관없이 사용할 있는 제한 때문에 주로 원하는 것보다 훨씬 작습니다 . 예를 들어, 읽기 액세스 전용 힌트 버퍼 만 쓸 수없는 경우 캐시 무효화가 훨씬 저렴 해지지 만이 최적화는 불가능합니다.

GPU 간의 벤치 마크 비교에 널리 사용되는 일부 주목할만한 게임은 이러한 힌트를 올바르게 사용하지 않으므로 GPU 공급 업체는 힌트와 일치하지 않더라도 모든 용도를 빠르게 사용할 인센티브가 있습니다.


4

기능적으로는 동일합니다.

드라이버는이를 사용하여 장면 뒤의 버퍼를 처리하는 방법을 차별화 할 수 있습니다. 예를 들어 static_draw는 가능한 빨리 vram에 복사되어 남아 있지만 stream_read는 항상 RAM에 날짜 사본이 있습니다.

이 모호함은 glBufferStorage 가 된 이유입니다 . 이렇게하면 버퍼로 수행 할 수있는 작업을 지정할 수 있습니다 (맵을 통해 읽거나 쓸지 여부, 맵의 일관성 여부, 매핑이 여러 용도에 걸쳐 지속될 수 있는지 여부에 관계없이 BufferSubData를 통해 업데이트할지 여부) 그 경계를 벗어나는 것은 오류입니다.

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