OSRS-Environment-Exporter
OSRS-Environment-Exporter copied to clipboard
[BUG] "out of space vertexBuffer size 0"
Steps to reproduce:
- Select "World" --> "Change Region"
- Input:
- "Region ID":
6201 - "Radius":
5
- "Region ID":
- Click "Load Region(s)"
- Observe below error
19:07:14.301 [DefaultDispatcher-worker-2-AWTAnimator#00] ERROR c.worldRenderer.helpers.GpuIntBuffer - Could not append to GPU buffer
java.nio.BufferOverflowException: null
at java.base/java.nio.IntBuffer.put(IntBuffer.java:1007)
at controllers.worldRenderer.helpers.GpuIntBuffer.ensureCapacity(GpuIntBuffer.kt:40)
at controllers.worldRenderer.SceneUploader.uploadModel(SceneUploader.kt:299)
at controllers.worldRenderer.SceneUploader.upload(SceneUploader.kt:167)
at controllers.worldRenderer.SceneUploader.upload(SceneUploader.kt:75)
at controllers.worldRenderer.Renderer.uploadScene(Renderer.kt:660)
at controllers.worldRenderer.Renderer.display(Renderer.kt:291)
at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:692)
at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:674)
at jogamp.opengl.GLAutoDrawableBase$2.run(GLAutoDrawableBase.java:443)
at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1293)
at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:1147)
at com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:782)
at com.jogamp.opengl.util.AWTAnimatorImpl.display(AWTAnimatorImpl.java:81)
at com.jogamp.opengl.util.AnimatorBase.display(AnimatorBase.java:453)
at com.jogamp.opengl.util.Animator$MainLoop.run(Animator.java:204)
at java.base/java.lang.Thread.run(Thread.java:833)
java.nio.BufferOverflowException
at java.base/java.nio.Buffer.nextPutIndex(Buffer.java:722)
at java.base/java.nio.DirectIntBufferU.put(DirectIntBufferU.java:349)
at controllers.worldRenderer.helpers.GpuIntBuffer.put(GpuIntBuffer.kt:19)
at controllers.worldRenderer.SceneUploader.pushFace(SceneUploader.kt:364)
at controllers.worldRenderer.SceneUploader.uploadModel(SceneUploader.kt:304)
at controllers.worldRenderer.SceneUploader.upload(SceneUploader.kt:167)
at controllers.worldRenderer.SceneUploader.upload(SceneUploader.kt:75)
at controllers.worldRenderer.Renderer.uploadScene(Renderer.kt:660)
at controllers.worldRenderer.Renderer.display(Renderer.kt:291)
at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:692)
at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:674)
at jogamp.opengl.GLAutoDrawableBase$2.run(GLAutoDrawableBase.java:443)
at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1293)
at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:1147)
at com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:782)
at com.jogamp.opengl.util.AWTAnimatorImpl.display(AWTAnimatorImpl.java:81)
at com.jogamp.opengl.util.AnimatorBase.display(AnimatorBase.java:453)
at com.jogamp.opengl.util.Animator$MainLoop.run(Animator.java:204)
at java.base/java.lang.Thread.run(Thread.java:833)
19:07:14.302 [DefaultDispatcher-worker-2-AWTAnimator#00] WARN controllers.worldRenderer.Renderer - out of space vertexBuffer size 0
Found another scenario for the same error...
- Select "World" --> "Change Region"
- Input:
- "Region ID":
14132 - "Radius":
8
- "Region ID":
- Click "Load Region(s)"
- Observe below error
20:19:18.288 [DefaultDispatcher-worker-1-AWTAnimator#00] ERROR c.worldRenderer.helpers.GpuIntBuffer - Could not append to GPU buffer
java.nio.BufferOverflowException: null
at java.base/java.nio.IntBuffer.put(IntBuffer.java:1007)
at controllers.worldRenderer.helpers.GpuIntBuffer.ensureCapacity(GpuIntBuffer.kt:40)
at controllers.worldRenderer.SceneUploader.uploadModel(SceneUploader.kt:299)
at controllers.worldRenderer.SceneUploader.upload(SceneUploader.kt:174)
at controllers.worldRenderer.SceneUploader.upload(SceneUploader.kt:75)
at controllers.worldRenderer.Renderer.uploadScene(Renderer.kt:667)
at controllers.worldRenderer.Renderer.display(Renderer.kt:298)
at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:692)
at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:674)
at jogamp.opengl.GLAutoDrawableBase$2.run(GLAutoDrawableBase.java:443)
at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1293)
at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:1147)
at com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:782)
at com.jogamp.opengl.util.AWTAnimatorImpl.display(AWTAnimatorImpl.java:81)
at com.jogamp.opengl.util.AnimatorBase.display(AnimatorBase.java:453)
at com.jogamp.opengl.util.Animator$MainLoop.run(Animator.java:204)
at java.base/java.lang.Thread.run(Thread.java:833)
java.nio.BufferOverflowException
at java.base/java.nio.Buffer.nextPutIndex(Buffer.java:722)
at java.base/java.nio.DirectIntBufferU.put(DirectIntBufferU.java:349)
at controllers.worldRenderer.helpers.GpuIntBuffer.put(GpuIntBuffer.kt:19)
at controllers.worldRenderer.SceneUploader.pushFace(SceneUploader.kt:364)
at controllers.worldRenderer.SceneUploader.uploadModel(SceneUploader.kt:304)
at controllers.worldRenderer.SceneUploader.upload(SceneUploader.kt:174)
at controllers.worldRenderer.SceneUploader.upload(SceneUploader.kt:75)
at controllers.worldRenderer.Renderer.uploadScene(Renderer.kt:667)
at controllers.worldRenderer.Renderer.display(Renderer.kt:298)
at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:692)
at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:674)
at jogamp.opengl.GLAutoDrawableBase$2.run(GLAutoDrawableBase.java:443)
at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1293)
at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:1147)
at com.jogamp.newt.opengl.GLWindow.display(GLWindow.java:782)
at com.jogamp.opengl.util.AWTAnimatorImpl.display(AWTAnimatorImpl.java:81)
at com.jogamp.opengl.util.AnimatorBase.display(AnimatorBase.java:453)
at com.jogamp.opengl.util.Animator$MainLoop.run(Animator.java:204)
at java.base/java.lang.Thread.run(Thread.java:833)
20:19:18.289 [DefaultDispatcher-worker-1-AWTAnimator#00] WARN controllers.worldRenderer.Renderer - out of space vertexBuffer size 0
Seems to be a limitation of Java's ByteBuffer. It uses 32-bit indexing we round allocations up to the next power of 2. Once we request a 1GB buffer, it just gives up.
We could potentially get around this by--
- figuring out how to render from multiple different arrays with a maximum length not known at build time
- using sun.misc.unsafe to reimplement our own 64-bit direct ByteBuffer lmao
Note that neither of these solutions will work on 32-bit java, for obvious reasons
BTW, what would the success case for this look like? If we break this specific ceiling, there's always more vertices to load, and then the next limit we would run into is either RAM or VRAM. Is erroring out there instead of here acceptable (raising the limit above 2GB)? Or would we need to manage how far the client allows itself to render in order to avoid GPU space limitations?
BTW, what would the success case for this look like? If we break this specific ceiling, there's always more vertices to load, and then the next limit we would run into is either RAM or VRAM.
This is a really good question...
Is erroring out there instead of here acceptable (raising the limit above 2GB)? Or would we need to manage how far the client allows itself to render in order to avoid GPU space limitations?
I'm leaning towards the former. This would still be a big improvement over the current behavior that some users are experiencing. As long as most people are able to load a reasonable number of regions at a time without issue, I'll be happy.
The scenarios described above are no longer causing this issue on my system.
ID: 6201, Radius: 5

ID: 14132, Radius: 8

We think this is due to some recent changes to the lighting which might be lowering the memory cost.