首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FloatBuffer上使用Put困难

在FloatBuffer上使用Put困难
EN

Stack Overflow用户
提问于 2014-06-28 14:50:44
回答 1查看 417关注 0票数 0

我正在从Android应用程序中删除一些本地C代码,该应用程序使用memcpy将浮点数数组复制到FloatBuffer中(因为我以前的设备在这方面非常慢)。

我的当前代码如下:

代码语言:javascript
复制
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的增量是明智的,底层缓冲区的内容似乎是合理的。但是,屏幕上没有呈现任何内容(通过稍后的进程)。

我在我的应用程序中重写了上面的内容--没有改变任何其他东西--如下所示:

代码语言:javascript
复制
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的设置如下:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-28 15:25:00

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

您使用的第一种形式的put() (同时传入整个数组)增加了写入的浮点数。根据put(int index, float f)的说法,第二个带有put(int index, float f)签名的表单不会更新位置。

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

代码语言:javascript
复制
buffer.position(0);
buffer.rewind();
buffer.flip();

大多数人似乎都使用flip(),但其他选项在您的用例中也同样有效。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24467986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档