OSRS-Environment-Exporter icon indicating copy to clipboard operation
OSRS-Environment-Exporter copied to clipboard

[BUG] "out of space vertexBuffer size 0"

Open ConnorDY opened this issue 3 years ago • 5 comments
trafficstars

Steps to reproduce:

  1. Select "World" --> "Change Region"
  2. Input:
    • "Region ID": 6201
    • "Radius": 5
  3. Click "Load Region(s)"
  4. 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

ConnorDY avatar Jul 20 '22 23:07 ConnorDY

Found another scenario for the same error...

  1. Select "World" --> "Change Region"
  2. Input:
    • "Region ID": 14132
    • "Radius": 8
  3. Click "Load Region(s)"
  4. 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

ConnorDY avatar Jul 21 '22 00:07 ConnorDY

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--

  1. figuring out how to render from multiple different arrays with a maximum length not known at build time
  2. 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

ScoreUnder avatar Jul 21 '22 01:07 ScoreUnder

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?

ScoreUnder avatar Aug 15 '22 03:08 ScoreUnder

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.

ConnorDY avatar Aug 15 '22 04:08 ConnorDY

The scenarios described above are no longer causing this issue on my system.

ID: 6201, Radius: 5 image

ID: 14132, Radius: 8 image

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

ConnorDY avatar Aug 17 '22 21:08 ConnorDY