我正在嘗試讀取包含頂點和用於在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?