VBO를 사용하여 16x16x16 큐브를 100 개 렌더링하는 실험용 응용 프로그램을 작성했습니다. VBO 측정 이외에도 12 명이 넘는 사람들이 칭찬 해 왔고, 실제 Minecraft 스타일 게임에서 사용하고있는 청크 당 표시 목록보다 훨씬 성능이 좋다고 나에게 말했습니다.VBO를 사용할 때 필요한 메모리 향상
하나의 큐브/삼각형에 초점을 맞춘 잘 못된 많은 자습서를 내가 필요한 그림 그리기 양을 처리 할 수있는 무언가로 바꾸는 것은 힘든 과정이었습니다. 나는 아직도 VBO가 내 게임보다 디스플레이 목록보다 낫다는 것을 확신하지 못한다.
대부분 인터리브 된 VBO 데이터가 한 번만 (청크가로드 될 때) 빌드 된 다음 각 render
호출에서 버퍼 ID가 바인딩되고 glDrawArrays
이 호출되도록 코드를 수정했습니다.
성능을 처리하는 방법을보기 위해이 실험용 앱에서 블록/청크의 양을 천천히 늘려 가고 있습니다. 실제 게임에서는 모든 청크에서 16x16x128 블록을 처리해야하며 최대 20x20 청크가로드됩니다. 그 중 약 60 %가 렌더링 된 견고한 블록이 될 것이므로 800 만 블록이 될 것입니다. 그것은 내가 시작한 디스플레이리스트 메소드를 사용하여 별다른 문제없이 렌더링합니다. 내 버퍼가 꽤 확신
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:658)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:306)
at org.lwjgl.BufferUtils.createByteBuffer(BufferUtils.java:60)
at org.lwjgl.BufferUtils.createFloatBuffer(BufferUtils.java:110)
at com.helion3.opengl.rendering.TextureQuadRenderer.<init>(TextureQuadRenderer.java:25)
at com.helion3.opengl.shapes.Chunk.<init>(Chunk.java:13)
at com.helion3.opengl.shapes.World.<init>(World.java:18)
at com.helion3.opengl.Game.start(Game.java:90)
at com.helion3.opengl.Launcher.main(Launcher.java:19)
:
그러나, 나는 VBO 지금 허용 수준 내에서 렌더링 성능에도 불구하고, 나는 메모리 제한을 타격하지 않고 10 덩어리의 반경을 생성 할 수 없습니다 적절한 수의 설치가 필요합니다. I는 호출
4096
곱한 큐브 당
192
플로트 (3 개 정점, 3 색, 여섯 개면과면 당 4 개 개의 꼭지점을 곱하여 2 텍스처 좌표)를 사용
BufferUtils.createFloatBuffer(
- 청크 테스트 블록 수.
실제 게임에서는 공기에 노출되지 않은 블록면을 렌더링하지 않습니다.하지만이 테스트 응용 프로그램에서 블록을 렌더링하더라도 16x16x16 블록 만 렌더링합니다.
어떻게하면 VBO 메모리를 더 잘 관리 할 수 있습니까? 내 VBO 테스트 app rendering code, chunk code
언제 VBO가 모든 사람들을 어떻게 팔아 버렸는가? 롤
P. 나는 이제 인스턴스화에 뛰어 들고 어떻게 도움이되는지 알아 보겠습니다.
VBO를 메모리 효율적인 방식으로 사용하려면 부동 소수점 값으로 색상 저장을 중단하십시오. 'GLubyte'는 저장 공간의 1/4을 사용합니다. 또한 왜 당신이 자바 메모리가 부족한 지 잘 모르겠습니다. VBO는 디스플레이 드라이버 ... VRAM이 관리하는 주소 공간에 모든 용도와 목적으로 메모리를 할당합니다. VBO를 올바로 사용한다면 애플리케이션 자체에서 관리해야하는 Java 메모리를 크게 늘리지 않아야합니다. 즉, GL에 데이터를 보낸 후에 원래의 ByteBuffer를 해제해야합니다. –
데이터를 바인딩 한 후 원본 ByteBuffer를 해제하고 모든 예제가 어떻게 나타나는지에 따라 다음과 같은 색상이 제공됩니다. 모든 것이 인터리브되어 하나의 플로트 버퍼 (청크 당)에 있습니다. – helion3
흠 원래 ByteBuffer를 'clear'- 'null'로 설정하면 메모리 prob를 해결하는 것으로 보이지만 20x20 청크로 성능이 저하됩니다. 지금은 스케일에 있지만, 실제로 큐브 전체가 렌더링되지 않도록 설정해야합니다.곧 내가 원래 게임을 할거야 ... LOL – helion3