2011-05-08 78 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