Android ByteBuffer.asXxxBuffer忽略了位置?

时间:2011-05-08 10:18:34

标签: android bytebuffer

我正在尝试读取包含顶点和元素的内存映射文件,以便在OpenGL中进行渲染。该文件正确加载到iPhone应用程序中,但我无法理解如何在Android中执行相同操作。我一直在和ByteBuffer,FloatBuffer和IntBuffer打架,他们行为的一个方面让我感到困惑。

以下代码尝试读取长度,为顶点数据设置FloatBuffer,读取顶点数据之后的另一个长度,并为元素数据设置ShortBuffer。

int lenVerts = data.asIntBuffer().get();
data.position(data.position() + 4);

verts = data.asFloatBuffer();
data.position(data.position() + lenVerts);

IntBuffer ib = data.asIntBuffer();
int lenElems = ib.get();
data.position(data.position() + 4);

elems = data.asShortBuffer();
data.position(data.position() + lenElems);

根据我对docs的解释,asIntBuffer调用应该返回一个缓冲区到从当前位置开始的字节,一直到缓冲区的末尾。换句话说,它应该通过调用data.position(data.position() + lenVerts)来忽略我跳过的顶点数据。

问题在于它似乎没有这样做。无论我传递给data.position(...)的值是什么,对asIntBuffer的调用总是会向整个底层ByteBuffer返回一个缓冲区。通过注意lenVerts == lenElems(即,相同的值被读取两次,即使顶点和元素数据的大小不同)以及data.capacity() == 4*ib.capacity()(即,ByteBuffer有四个),这是双重确认的。 intBuffer具有整数的字节数。

我做错了吗?我是否错误地解释了文档?

如何创建仅由底层ByteBuffer的一部分支持的XxxBuffer?

1 个答案:

答案 0 :(得分:0)

我只花了几个小时解决这个问题,直到注意到Buffer.position()被其他使用缓冲区作为争论的方法忽略。我的解决方法是创建一个只包含所需字节的新缓冲区:

int pos = 100;
Buffer myBuffer; // old buffer containing ALL data
byte[] tmpBuf = new byte[myBuffer.capacity()-pos];
myBuffer.position(pos);
myBuffer.get(tmpBuf);

// Create new buffer:
Buffer fixedBuffer = ByteBuffer.wrap(tmpBuf); // new buffer containing only required data