OpenGL ES Android Confusion

1

Я изучаю OpenGL ES для Android через этот сайт: http://www.learnopengles.com/android-lesson-one-getting-started/

Есть несколько вещей, которые я не понимаю...

Что именно делает этот код:

mTriangle1Vertices = ByteBuffer.allocateDirect(triangle1VerticesData.length * mBytesPerFloat)
    .order(ByteOrder.nativeOrder()).asFloatBuffer();
    mTriangle2Vertices = ByteBuffer.allocateDirect(triangle2VerticesData.length * mBytesPerFloat)
    .order(ByteOrder.nativeOrder()).asFloatBuffer();
    mTriangle3Vertices = ByteBuffer.allocateDirect(triangle3VerticesData.length * mBytesPerFloat)
    .order(ByteOrder.nativeOrder()).asFloatBuffer();

    mTriangle1Vertices.put(triangle1VerticesData).position(0);
    mTriangle2Vertices.put(triangle2VerticesData).position(0);
    mTriangle3Vertices.put(triangle3VerticesData).position(0);

Что это за "буферные" вещи и всегда есть четыре байта для поплавка? Я не уверен, зачем нужен код выше. Автор объяснил это, но я не уверен, что он имеет в виду.

Благодарю!

  • 0
    Я недавно задавал подобный вопрос, возможно, один из ответов может быть полезен для вас: stackoverflow.com/questions/10697161/…
  • 0
    Эй, я также учусь с этими замечательными уроками по "Learn Open GL ES". Урок 7 посвящен переносимому использованию объектов буфера вершин и аппаратному ускорению.
Теги:
opengl-es
opengl-es-2.0
bytebuffer

1 ответ

2
Лучший ответ

Зачем нам вообще нужно это делать?

Если бы мы кодировали в C, нам бы не понадобился приведенный выше код - мы бы просто пропустили весь материал ByteBuffer.allocateDirect и передали указатель на наш массив, когда будем называть drawArrays или drawElements. Однако мы не можем этого сделать, потому что у Dalvik, виртуальной машины Java, работающей внутри Android, есть сборщик мусора, и он может перемещать данные вокруг нас. Это может даже сломать память, ошибочно думая, что нам это больше не нужно. Безопасный способ сделать это - использовать ByteBuffer.allocateDirect для создания блока памяти в собственной памяти, скопировать данные на него, а затем OpenGL может использовать это напрямую, без необходимости беспокоиться о виртуальной машине.

Каждый буфер должен быть достаточно большим, чтобы хранить данные, которые мы собираемся скопировать; когда мы создаем буфер, он хочет иметь размер в байтах. Наш массив Java выполнен из поплавков, поэтому для определения размера в байтах мы передаем длину массива и умножаем его на 4. Значение с плавающей запятой - это 32-разрядное, а байт - 8-битное значение, поэтому всегда 4 байта для поплавка.

Надеюсь, это поможет. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню