glbuffersubdata与缓冲区的偏移量,不会导致垃圾

时间:2010-08-01 02:22:14

标签: java android opengl-es

天儿真好,

我正在尝试通过调用glBufferSubData()来更新VBO的一部分。当我从现有的影子缓冲区的开始(0)更新时,没有问题,因为缓冲区从0开始读取。以下内容将从缓冲区读取0到y并将其置于VBO中的0到y: / p>

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

使用buffer.position(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());

但是这会导致垃圾,因为使用切片生成了一个新的缓冲区,即使它使用相同的数据存储。

问题:是否有办法获得所需的结果(使用偏移量将VBO的偏移部分替换为缓冲区)而不产生垃圾?正如你可能猜到的那样,这是一个安卓游戏和游戏中的垃圾收集是一个禁忌。

谢谢! AERT。

2 个答案:

答案 0 :(得分:1)

看起来我遇到了同样的问题。

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

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

答案 1 :(得分:1)

嗯,我想可以使用静态缓冲区作为参考,并为io操作提供切片器。然后就不会把垃圾收集器称为长期以来班级生活的低谷。