2011-05-08 79 views
1

我正在尝试读取包含顶点和用于在OpenGL中呈现的元素的内存映射文件。该文件正确加载到iPhone应用程序中,但我无法理解如何在Android中执行相同操作。我一直在与ByteBuffer,FloatBuffer和IntBuffer进行斗争,他们的行为的一个方面让我感到困惑。Android ByteBuffer.asXxxBuffer忽略位置?

以下代码尝试读取长度,为顶点数据设置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(...)的值是多少,对asIntBuffer的调用始终会向整个底层ByteBuffer返回一个缓冲区。这通过注意到lenVerts == lenElems(即,即使顶点和元素数据的大小不同而相同的值被读取两次)以及data.capacity() == 4*ib.capacity()(即,ByteBuffer具有四倍于IntBuffer具有的字节数量)具有双重证实整数)。

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

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

回答

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