질문에 비추어 볼 때 유일하게 의미가 있기 때문에 실제로는 CPU에서 스프라이트를 움직이는 것으로 가정합니다 (그렇지 않은 경우 처음에는 직접 모드에서 어떻게 그리겠습니까? 당신은 그림 그리기를 건너 뜁니다.)
AGP/PCIe는 성능 관점에서 하드 디스크처럼 작동합니다. 대역폭은 크지 만 액세스 시간은 상당히 두드러집니다. 다른 말로하면, 전송을하는 것은 고통스럽지 만 일단 그렇게하면 몇 킬로바이트가 실제로 차이를 만들지 않습니다. 500 개의 스프라이트를 업로드하고 1,000 개의 스프라이트를 업로드하는 것은 똑같습니다. 당신이 CPU에 스프라이트 애니메이션 때문에
, 당신은 이미 는는 다른 방법이 없다, 하나의 전송 (glBufferSubData
또는 glMapBuffer/glUnmapBuffer
) 모든 프레임을 수행해야합니다.
"신선한"버퍼를 사용해야합니다. glBufferData(null)
idiom을 적용하여 이렇게하면 OpenGL이 다른 버퍼를 제공하면서 동시에 버퍼를 사용 (드로잉) 할 수있게하여 파이프 라인 스톨을 피할 수 있습니다. 나중에 드로잉이 끝나면 버퍼를 은밀하게 뒤집어 버리고 오래된 것을 버립니다. 그런 식으로 좋은 병렬 처리를 달성 할 수 있습니다 (이는 성능의 핵심이며 수천 개의 버텍스를 제거하는 것보다 훨씬 중요합니다).
또한 그래픽 카드는 도형을 제거하는 데 상당히 적합합니다 (조각이 생성되기 전에 화면에 표시되지 않는 전체 삼각형을 버리는 것을 포함). 수백명? 수천? 수십만? 문제 없습니다. 그래픽 카드로 보자.
한 번에 절반 만 볼 수 있고 나머지 절반은 볼 수없는 경우가 아니면 전체 버퍼 을 연속적으로 쓰고 분기가없는을 쓰는 것만 큼 빠른 것은 아니지만 캐시 및 파이프 라인 효과로 인해 더욱 빨라졌습니다.
sprite가 CPU에서 움직이는 것을 가정합니까? 또한, 우리는 어떤 숫자로 이야기하고 있습니까? 예 : 몇 백개의 스프라이트가 있다면, 도려내는 것은 생각할 가치가 거의 없습니다. 그래픽 카드는 그것을 잊어 버릴 것입니다. 잊어 버리십시오. – Damon