Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 难以在浮动缓冲区上使用Put_Java_Android_Opengl Es - Fatal编程技术网

Java 难以在浮动缓冲区上使用Put

Java 难以在浮动缓冲区上使用Put,java,android,opengl-es,Java,Android,Opengl Es,我正在从一个Android应用程序中删除一些本机C代码,该应用程序使用memcpy将一个浮点数组复制到一个浮点缓冲区中(因为我使用的一个旧设备在这方面非常慢) 我当前的代码如下所示: mfVertexBuffer.position(0); mfColourBuffer.position(0); mfSizeBuffer.position(0); mfVertexBuffer.put(fvertices, 0, nCount*2); mfColourBuffer.put(fcolours, 0,

我正在从一个Android应用程序中删除一些本机C代码,该应用程序使用memcpy将一个浮点数组复制到一个浮点缓冲区中(因为我使用的一个旧设备在这方面非常慢)

我当前的代码如下所示:

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 = 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;
}
我已经查看了mfVertexBuffer的状态,它看起来正在运行。位置会有意义地增加,并且底层缓冲区的内容似乎是有意义的。但是,屏幕上没有呈现任何内容(通过稍后的过程)

我将上面的内容改写为以下内容(我的应用程序中没有任何其他更改):

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++]);
}
fvertices等是浮点数的简单数组,其值不变

count是绘制此轮的粒子数

NUMBER\u OF_PARTICLES是可创建的最大粒子数的编译时间限制,并且始终大于或等于count,因此第一个(非工作)代码正在做更多的工作,但如果我将NUMBER\u OF_PARTICLES设置为与count相同的值,则其行为相同


我正在运行4.2.2(Cyanogenmod 10.1.3)的Galaxy S3上使用OpenGL 1.1和Android API 17。

当您将缓冲区传递给OpenGL函数时,它将在当前位置开始读取

您正在使用的
put()
的第一种形式是一次传递整个数组,它通过写入的浮点数增加位置。根据,第二个带有
put(int-index,float f)
签名的表单不会更新位置

使用第一个变量时,需要在填充缓冲区后将位置重置为起始位置。您可以从以下几个电话中进行选择:

buffer.position(0);
buffer.rewind();
buffer.flip();

flip()
似乎是大多数人使用的选项,但其他选项在您的用例中也会起作用。

这不是我已经在做的事情吗(即在我的代码的第一行)?嗯,是的,您正在设置位置。但是它会被
put()
调用更新。在执行
put()
调用后,您需要将位置重置为0。您是对的。我只想着我写进缓冲区的内容;我不喜欢OpenGL在渲染时读取位置时使用它。非常感谢!