gpt4 book ai didi

java - 使用 Put on FloatBuffer 时遇到困难

转载 作者:行者123 更新时间:2023-12-02 05:41:34 24 4
gpt4 key购买 nike

我正在从 Android 应用程序中删除一些 native C 代码,该应用程序使用 memcpy 将 float 组复制到 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 等是简单的 float 数组,其值不会改变。

count 是本轮绘制的粒子数。

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

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

最佳答案

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

您使用的 put() 的第一种形式是一次性传入整个数组,通过写入的 float 增加位置。根据the documentation,带有 put(int index, float f) 签名的第二种形式不会更新位置。 .

当使用第一个变体时,您需要在填充缓冲区后将位置重置为开始位置。您可以选择几个调用来执行此操作:

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

flip() 是大多数人似乎使用的选项,但其他选项也适用于您的用例。

关于java - 使用 Put on FloatBuffer 时遇到困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24467986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com