我正在从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;
}顶点等是浮点数的简单数组,其值不变。
计数是绘制这一轮的粒子数。
NUMBER_OF_PARTICLES是对可以创建的最大粒子数的编译时间限制,并且总是大于或等于计数,因此第一个(不工作的)代码做更多的工作,但是如果我将NUMBER_OF_PARTICLES设置为与count相同的值,则其行为是相同的。
我在运行4.2.2 (CyanogenMod10.1.3)的Galaxy上使用OpenGL 1.1,Android 17。
发布于 2014-06-28 15:25:00
当您将缓冲区传递给OpenGL函数时,它将在当前位置开始读取。
您使用的第一种形式的put() (同时传入整个数组)增加了写入的浮点数。根据put(int index, float f)的说法,第二个带有put(int index, float f)签名的表单不会更新位置。
使用第一个变体时,需要在填充缓冲区后将位置重置为开始。您可以从以下几个电话中选择这样做:
buffer.position(0);
buffer.rewind();
buffer.flip();大多数人似乎都使用flip(),但其他选项在您的用例中也同样有效。
https://stackoverflow.com/questions/24467986
复制相似问题