Android ByteBuffer.asXxxBuffer игнорирует положение? - PullRequest
1 голос
/ 08 мая 2011

Я пытаюсь прочитать отображенный в памяти файл, содержащий вершины и элементы для рендеринга в 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 имеет целые числа).

Я что-то не так делаю?Правильно ли я истолковал документы?

Как создать XxxBuffer, который поддерживается только частью базового ByteBuffer?

1 Ответ

0 голосов
/ 13 марта 2012

Я просто провел несколько часов с этой проблемой, пока не заметил, что 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
...