Java GLBUFFERSUBSDATA将偏移量放入缓冲区,而不会造成垃圾

Java GLBUFFERSUBSDATA将偏移量放入缓冲区,而不会造成垃圾,java,android,opengl-es,Java,Android,Opengl Es,G'day 我试图通过调用glBufferSubData()来更新VBO的一部分。当我从现有阴影缓冲区的开始(0)进行更新时,没有问题,因为缓冲区从0开始读取。以下内容将从缓冲区中读取0到y,并将其放置在VBO中的0到y位置: gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, 0, y, mPositionBuffer); 然而,如果我想更新VBO的一部分(不是从0),我会遇到一个问题;以下操作不起作用,因为它会将缓冲区起点(0到y)的值写入VBO的x到x+y位

G'day

我试图通过调用glBufferSubData()来更新VBO的一部分。当我从现有阴影缓冲区的开始(0)进行更新时,没有问题,因为缓冲区从0开始读取。以下内容将从缓冲区中读取0到y,并将其放置在VBO中的0到y位置:

gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, 0, y, mPositionBuffer);
然而,如果我想更新VBO的一部分(不是从0),我会遇到一个问题;以下操作不起作用,因为它会将缓冲区起点(0到y)的值写入VBO的x到x+y位置:

gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, x, y, mPositionBuffer);
使用缓冲区更改位置。位置(x)不会产生任何影响:

gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, x, y, mPositionBuffer.position(x));
一种解决方案是对缓冲区进行切片(),这非常有效:

mPositionBuffer.position(x);
gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, x, y, mPositionBuffer.slice());
但这会导致垃圾,因为新的缓冲区是使用slice生成的,即使它使用相同的数据存储

问题是:有没有一种方法可以在不产生垃圾的情况下获得所需的结果(使用缓冲区中的偏移量替换VBO的偏移量部分)?正如您可能猜到的,这是针对android游戏的,游戏中的垃圾收集是不允许的


谢谢!Aert.

看起来我也有同样的问题

我想到的唯一解决方案是使用android ndk创建glBufferSubData的替代实现,它在将指针传递给实际的opengl函数之前,向指针(从mPositionBuffer派生的指针)添加偏移量


这听起来太糟糕了,我希望有更好的解决方案。

好吧,我想可以使用静态缓冲区作为参考,并为io操作提供切片器。它不会把垃圾回收器称为类生命周期最长的垃圾回收器