2012-05-27 4 views
1

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

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

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

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

Недавно я задал аналогичный вопрос, возможно, один из ответов может быть вам полезен: http://stackoverflow.com/questions/10697161/why-floatbuffer-instead-of-float – Tim

+0

Эй, я также изучаю с этими великолепными учебниками по «Learn Open GL ES». Урок 7 посвящен портативному использованию объектов буфера вершин и аппаратного ускорения. –

ответ

2

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

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

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

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