2016-07-13 8 views
0

Добрый день, друзья,Android/OpenglES2/examples: Зачем использовать ByteBuffer для коордов?

Я новичок в Android и Java в целом, поэтому извините за вопрос о нобе. я наткнулся на стандартных примерах OpenGL ES и пытались понять этот код:

static float wallCoords[] = { 
     // in counterclockwise order: 
     -0.5f, 0.6f, 0.0f, // top left 
     -0.5f, 0.5f, 0.0f, // bottom left 
     0.5f, 0.5f, 0.0f, // bottom right 
     0.5f, 0.6f, 0.0f, // top right 
}; 
private final int vertexCount = wallCoords.length/COORDS_PER_VERTEX; 
private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex 

float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 0.0f }; 

private final FloatBuffer vertexBuffer; 
private final ShortBuffer drawListBuffer; 
private final short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices 

... 

ByteBuffer bb = ByteBuffer.allocateDirect(
     // (number of coordinate values * 4 bytes per float) 
      wallCoords.length * 4); 
// use the device hardware's native byte order 
bb.order(ByteOrder.nativeOrder()); 
// create a floating point buffer from the ByteBuffer 
vertexBuffer = bb.asFloatBuffer(); 
// add the coordinates to the FloatBuffer 
vertexBuffer.put(wallCoords); 
// set the buffer to read the first coordinate 
vertexBuffer.position(0); 

Так что мой вопрос, почему не использовать метод FloatBuffer.wrap(), например:

vertexBuffer = FloatBuffer.wrap(wallCoords); 

Спасибо!

ответ

0

Это из соображений удобства.

FloatBuffer не имеет allocateDirect метода, который выделяет direct buffer:

Прямые по сравнению с не-прямыми буферами

буфером байт является прямым или непрямым. При наличии прямого байтового буфера виртуальная машина Java будет прилагать максимум усилий для выполнения собственных операций ввода-вывода непосредственно с нее. То есть он попытается избежать копирования содержимого буфера в (или из) промежуточного буфера до (или после) каждого вызова одной из основных операций ввода-вывода базовой операционной системы.

Прямой байтовый буфер может быть создан путем вызова фабричного метода allocateDirect этого класса. Буферы, возвращаемые этим методом, обычно имеют несколько более высокие затраты на выделение и освобождение, чем непрямые буферы.

В действительности FloatBuffer.wrap сильно связывает массив и буфер

Новый буфер будет поддержанный данного массива флоат; то есть изменения в буфере вызовут изменение массива и наоборот.

Затраты возможно на копирование данных.

+0

Да, правильно :) только что нашел это объяснение. Однако это не объясняет, что для этого нет удобного API. В любом случае, Buffer и массив сильно привязаны в этой ситуации (и, откровенно говоря, в Android это всегда будет так). –

 Смежные вопросы

  • Нет связанных вопросов^_^