2012-05-27 2 views
1

나는이 웹 사이트를 통해 안드로이드는 OpenGL ES를 배우고 : http://www.learnopengles.com/android-lesson-one-getting-started/는 OpenGL ES 안드로이드 혼란

내가 이해하지 못하는 몇 가지 ... 정확히이 코드를 무엇

할 수 있습니다 :

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); 

"버퍼"란 무엇이며 플로트에 항상 4 바이트가 있습니까? 위의 코드가 왜 필요한지 잘 모르겠습니다. 저자가 설명했지만, 그가 의미하는 것이 확실하지 않습니다.

감사합니다.

+0

최근에 비슷한 질문을 던졌을 것입니다. 답변 중 하나가 유용 할 수 있습니다. http://stackoverflow.com/questions/10697161/why-floatbuffer-instead-of-float – Tim

+0

안녕하세요 저는 또한 학습하고 있습니다. "Open OpenGL ES 배우기"에 대한 훌륭한 자습서가 있습니다. 7 단원에서는 버텍스 버퍼 객체 및 하드웨어 가속의 이식성있는 사용법을 다룹니다. –

답변

2

우리는 왜이 작업을 수행해야합니까?

C로 코딩하는 경우 위 코드는 필요하지 않습니다. 우리는 drawArrays 또는 drawElements를 호출 할 때 ByteBuffer.allocateDirect 전체 내용을 건너 뛰고 배열에 대한 포인터를 전달합니다. 그러나 안드로이드 내에서 실행되는 자바 가상 머신 인 Dalvik은 가비지 콜렉터를 가지고 있기 때문에 데이터를 이동할 수는 없습니다. 그것은 우리가 더 이상 필요하지 않다고 잘못 생각한 기억을 고칠 수도 있습니다. 안전한 방법은 ByteBuffer.allocateDirect를 사용하여 기본 메모리에 메모리 블록을 만들고 데이터를 복사 한 다음 OpenGL에서 가상 컴퓨터에 대해 걱정할 필요없이 직접 사용할 수 있습니다.

각 버퍼는 복사 할 데이터를 저장할만큼 커야합니다. 버퍼를 만들 때 바이트 단위의 크기가 필요합니다. 우리의 Java 배열은 float로 구성되어 있으므로 크기를 바이트 단위로 계산하려면 배열 길이를 전달하고 4를 곱합니다. 부동 소수점 값은 32 비트이고 1 바이트는 8 비트 값이므로 거기에 float에 대해 항상 4 바이트입니다.

희망이 도움이됩니다. :)