2012-11-12 4 views
2

시뮬레이션 된 세계의 객체가 생성되고 파괴되는 일반적인 게임을 상상해보십시오. 이러한 오브젝트가 생성되면, 정점 데이터는 VBO에 저장됩니다. 이 VBO는 프레임 당 한 번 렌더링됩니다.OpenGL VBO에서 죽은 객체 다루기

죽은 개체를 다루는 가장 좋은 방법이 있습니까? 나는. 객체가 파괴되어 더 이상 렌더 할 필요가 없을 때, 해당 VBO 데이터는 어떻게되어야할까요?

다른 개체가 나중에 사용할 수 있도록 메모리를 "비우는"것이 좋습니다. 그렇지 않으면 결국 VBO가 거의 완전히 죽은 데이터로 채워집니다.

VBO 메모리 맵에는 개별 바이트가 사용 가능 또는 사용 중으로 표시되어 있습니다. (이 맵은 GPU가 아닌 정상적인 배열로 CPU에 저장됩니다.) 객체가 생성되면 맵에 의해 결정된대로 빈 영역에 데이터를 버퍼링합니다. 해당 지역을지도에서 사용 된 것으로 표시합니다. 그런 다음 객체가 파괴되면 같은 영역을 자유롭게 표시합니다. 나는 당신이 게으른 경우 불리언 배열로지도를 저장할 것이라고 생각하고, 그렇지 않으면 VBO 바이트 하나의 맵 비트로 포장하십시오.

지금까지이 방법이 가장 좋은 방법이라고 생각하십니까? 내가 보지 않는보다 일반적인 접근법이 있습니까?

나는 렌더링하는 장면의 특성에 달려있는 이러한 많은 질문을 알고 있으므로 여기에 컨텍스트가 있습니다. 내 장면은 수백 개의 개체로 구성됩니다. 각 오브젝트에는 약 8 개의 꼭지점이 있습니다. 각 꼭지점에는 위치와 텍스처 좌표가 수레로 저장되어 있습니다. 따라서 우리는 대략 다음을보고 있습니다 :

4 bytes per float * 6 floats per vert * 8 verts per object * 500 objects 
= 96,000 bytes of vertex data 
+0

문제가 분열 되었습니까? 아니면 단순히 vbo를 삭제하지 않았습니까? –

+0

@Viktor : VBO 생성이 꽤 비쌉니다. 임시 개체가 너무 많으면 (총알이 플레이어에 의해 실행 된 경우) 항상 "총알 목록"인 하나의 수명이 긴 VBO가 있고 프레임간에 좌표를 업데이트하는 것이 효율적인 방법입니다. 개체 수를 계산하더라도 다를 수 있습니다. –

+0

@Viktor : Fragmentation, sort of. 보다 정확하게는 문제는 누적 된 객체의 버텍스 데이터입니다. VBO가 하나뿐이므로 삭제할 수 없습니다. 성능을 위해 모든 개체를 하나의 VBO에 저장하는 것이 좋습니다. 각 192 바이트 객체에 대해 별도의 VBO를 사용하면 차선책이됩니다. – rlkw1024

답변

3

풀 할당자를 사용하려고하는 것처럼 들립니다. VBO 내부의 할당에도 상당히 잘 적용되어야하는 많은 기존 작업이 있습니다.

모든 요소가 동일한 크기이면 매우 간단합니다. 그렇지 않으면 조각화를 염려해야하지만 힙 관리자는 꽤 잘 알려져 있습니다.

내가 제공 할 수있는 가장 간단한 개선 사항은 항상 처음부터 채워진 마지막 슬롯에서 빈 슬롯을 검색하는 것입니다.

무료 위치 목록을 저장하기 위해 deque 스타일의 데이터 구조를 사용하여 공간을 교환 할 수 있으므로 여유 공간을 검색 할 필요가 없습니다.

VBO에 저장된 데이터의 크기는 실제로 관리자에게 아무런 영향을 미치지 않습니다. 부당하게 재사용 될 수있는 슬롯 수.

+0

예! 조각화에 대한 좋은 지적. 운좋게도 내 물건은 거의 같은 크기입니다. – rlkw1024