我正在尝试读取包含顶点和元素的内存映射文件,以便在 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);
根据我对文档的解释,asIntBuffer
调用应该返回一个缓冲区到从当前位置开始的字节,一直到缓冲区的末尾。换句话说,它应该忽略我通过调用跳过的顶点数据data.position(data.position() + lenVerts)
。
问题是它似乎没有这样做。无论我传递什么值data.position(...)
,调用asIntBuffer
总是返回一个缓冲区到整个底层 ByteBuffer。通过注意到lenVerts == lenElems
(即,相同的值被读取两次,即使顶点和元素数据的大小不同)以及data.capacity() == 4*ib.capacity()
(即 ByteBuffer 的字节数是 IntBuffer 的整数的四倍),这一点得到了双重证实.
难道我做错了什么?我是否错误地解释了文档?
如何创建仅由底层 ByteBuffer 的一部分支持的 XxxBuffer?