天儿真好,
我正在尝试通过调用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。
答案 0 :(得分:1)
看起来我遇到了同样的问题。
我想到的唯一解决方案是使用android ndk创建glBufferSubData的替代实现,它将指针(从mPositionBuffer派生的那个)添加到指针之前将其传递给实际的opengl函数。
这听起来太糟糕了,我希望有更好的解决方案。
答案 1 :(得分:1)
嗯,我想可以使用静态缓冲区作为参考,并为io操作提供切片器。然后就不会把垃圾收集器称为长期以来班级生活的低谷。