2012-06-13 4 views
1

성능상의 이유로 즉시 모드 대신 VBO를 사용하려고합니다. 스프라이트로 가득 찬 2D 정사영 장면을 만들고 있습니다. 나는 스크린 밖의 스프라이트를 그리기를 원하지 않는다. 나는 카메라의 스크린 크기와 위치에 대한 그들의 위치를 ​​점검함으로써 이것을한다.VBO를 사용하여 OpenGL에서 단순 2D 컬링

즉석 모드에서 이것은 간단합니다. 각 스프라이트에는 draw 메소드가 있습니다. VBO를 사용하면 이것은 사소한 것처럼 보입니다. 한 번에 VBO의 전체 섹션을 렌더링합니다. 스크린이 아닌 스프라이트 렌더링을 선택하는 방법은 없을 것입니다.

+3

sprite가 CPU에서 움직이는 것을 가정합니까? 또한, 우리는 어떤 숫자로 이야기하고 있습니까? 예 : 몇 백개의 스프라이트가 있다면, 도려내는 것은 생각할 가치가 거의 없습니다. 그래픽 카드는 그것을 잊어 버릴 것입니다. 잊어 버리십시오. – Damon

답변

5

질문에 비추어 볼 때 유일하게 의미가 있기 때문에 실제로는 CPU에서 스프라이트를 움직이는 것으로 가정합니다 (그렇지 않은 경우 처음에는 직접 모드에서 어떻게 그리겠습니까? 당신은 그림 그리기를 건너 뜁니다.)

AGP/PCIe는 성능 관점에서 하드 디스크처럼 작동합니다. 대역폭은 크지 만 액세스 시간은 상당히 두드러집니다. 다른 말로하면, 전송을하는 것은 고통스럽지 만 일단 그렇게하면 몇 킬로바이트가 실제로 차이를 만들지 않습니다. 500 개의 스프라이트를 업로드하고 1,000 개의 스프라이트를 업로드하는 것은 똑같습니다. 당신이 CPU에 스프라이트 애니메이션 때문에

, 당신은 이미 는 다른 방법이 없다, 하나의 전송 (glBufferSubData 또는 glMapBuffer/glUnmapBuffer) 모든 프레임을 수행해야합니다.

"신선한"버퍼를 사용해야합니다. glBufferData(null) idiom을 적용하여 이렇게하면 OpenGL이 다른 버퍼를 제공하면서 동시에 버퍼를 사용 (드로잉) 할 수있게하여 파이프 라인 스톨을 피할 수 있습니다. 나중에 드로잉이 끝나면 버퍼를 은밀하게 뒤집어 버리고 오래된 것을 버립니다. 그런 식으로 좋은 병렬 처리를 달성 할 수 있습니다 (이는 성능의 핵심이며 수천 개의 버텍스를 제거하는 것보다 훨씬 중요합니다).

또한 그래픽 카드는 도형을 제거하는 데 상당히 적합합니다 (조각이 생성되기 전에 화면에 표시되지 않는 전체 삼각형을 버리는 것을 포함). 수백명? 수천? 수십만? 문제 없습니다. 그래픽 카드로 보자.

한 번에 절반 만 볼 수 있고 나머지 절반은 볼 수없는 경우가 아니면 전체 버퍼 을 연속적으로 쓰고 분기가없는을 쓰는 것만 큼 빠른 것은 아니지만 캐시 및 파이프 라인 효과로 인해 더욱 빨라졌습니다.

+0

문서를 기반으로 GL_STREAM_DRAW_ARB 사용 플래그를 사용합니다. 이것은 VBO가이 정확한 상황에 맞게 최적화되어야 함을 나타냅니다. 이 올바른지? –

+0

예. "스트림"은 "한 번 정의, 한 번 또는 몇 번 사용"과 같은 의미입니다. 그렇다고해서 다른 일을 할 수는 없지만 운전자에게주는 힌트입니다 (차이점이 있는지 여부는 존중하지 않을 수도 있습니다. 이는 드라이버, 하드웨어 및 사용자가하는 일에 달려 있습니다). 예를 들어 리드 백을 할 때 올바른 플래그와 잘못된 플래그를 사용하는 것 사이의 차이는 대략 1 : 100입니다. 나머지 절반 ("그리기") 힌트는 앱에서 제공하는 데이터에서 가져올 것입니다. 나중의 버전 (3.2 이상이 올바르게 기억된다면)에서,이 "힌트"는 어려운 요구 사항입니다. – Damon