我正在从Android应用程序中删除一些本机C代码,该应用程序使用memcpy将浮动数组复制到FloatBuffer中(因为我使用的旧设备非常慢)。
我目前的代码如下:
mfVertexBuffer.position(0);
mfColourBuffer.position(0);
mfSizeBuffer.position(0);
mfVertexBuffer.put(fvertices, 0, nCount*2);
mfColourBuffer.put(fcolours, 0, nCount*4);
mfSizeBuffer.put(fsizes, 0, nCount);
我已经看过了mfVertexBuffer的状态,它看起来像是在表现; .position合理增加,底层缓冲区的内容似乎合理。但是,屏幕上没有任何内容呈现(通过后续过程)。
我重写了以上内容 - 在我的应用程序中没有更改任何其他内容 - 以下内容:
int vs=0;
int vd=0;
int cs=0;
int cd=0;
int ss=0;
int sd=0;
for (int i = 0; i < nCount; i++) {
mfVertexBuffer.put(vd++, fvertices[vs++]);
mfVertexBuffer.put(vd++, fvertices[vs++]);
mfColourBuffer.put(cd++, fcolours[cs++]);
mfColourBuffer.put(cd++, fcolours[cs++]);
mfColourBuffer.put(cd++, fcolours[cs++]);
mfColourBuffer.put(cd++, fcolours[cs++]);
mfSizeBuffer.put(sd++, fsizes[ss++]);
}
它完美无缺。我根本不明白这一点。这两段代码有何不同?
FloatBuffers的设置如下:
mfVertexBuffer = miscHelpers.getFloatBuffer(4 * NUMBER_OF_PARTICLES * 2);
mfColourBuffer = miscHelpers.getFloatBuffer(4 * NUMBER_OF_PARTICLES * 4);
mfSizeBuffer = miscHelpers.getFloatBuffer(4 * NUMBER_OF_PARTICLES);
public static FloatBuffer getFloatBuffer(int size) {
FloatBuffer fbRet;
ByteBuffer myBB = ByteBuffer.allocateDirect(size);
myBB.order(ByteOrder.nativeOrder());
fbRet = myBB.asFloatBuffer();
return fbRet;
}
fvertices等是简单的浮点数组,其值不会改变。
count是本轮绘制的粒子数。
NUMBER_OF_PARTICLES是可以创建的最大粒子数的编译时间限制,并且始终大于或等于count,因此第一个(非工作)代码执行的工作更多,但如果我的行为相同将NUMBER_OF_PARTICLES设置为与count相同的值。
我在运行4.2.2(Cyanogenmod 10.1.3)的Galaxy S3上使用OpenGL 1.1,Android API 17。
答案 0 :(得分:2)
当您将缓冲区传递给OpenGL函数时,它将开始在当前位置读取。
您正在使用的put()
的第一种形式,即您一次传入整个数组,通过写入的浮点数增加位置。根据{{3}},带有put(int index, float f)
签名的第二个表单不会更新位置。
使用第一个变体时,需要在填充缓冲区后将位置重置为开头。您可以选择几个电话来执行此操作:
buffer.position(0);
buffer.rewind();
buffer.flip();
flip()
是大多数人似乎都使用的,但其他选项也适用于您的用例。