1
렌더러 초기화시 VBO가 만들어지고 GL_ARRAY_BUFFER 또는 GL_ELEMENTS_ARRAY_BUFFER에 바인딩되고 첫 번째에 세 개의 정점이 있습니다. glBufferData를 호출하여 GPU에이 세 꼭지점 특성을 캐시합니다. 예를 들면 :호출을 반복 함 glBufferData가 새 버퍼에 대한 메모리 할당에 실패했습니다
InitVBO() {
vboArray = new int[4];
GLES20.glGenBuffers(4, vboArray, 0);
poseBuf = ByteBuffer.allocateDirect(poseLength * Float.SIZE/Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
UpdatePose(); // fill array data to FloatBuffer
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboArray[VBO_VERTEX]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, poseLength * Float.SIZE/Byte.SIZE, poseBuf, GLES20.GL_DYNAMIC_DRAW); // poseBuf initialized capacity is 9 * 4
GLES20.glGetBufferParameteriv(GLES20.GL_ARRAY_BUFFER, GLES20.GL_BUFFER_SIZE, params, 0); // Get params[0] is 36
colorBuf = ByteBuffer.allocateDirect(colorLength * Float.SIZE/Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
UpdateColor(); // fill array data to FloatBuffer
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboArray[VBO_GRID_COLOR]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, colorLength * Float.SIZE/Byte.SIZE, gridColorBuf, GLES20.GL_DYNAMIC_DRAW);
...
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
}
그런 다음,이 자식 스레드에서 TCP 네트워크 메시지에서 정점 데이터를받을 수 있습니다. 정점 수는 3보다 큽니다. glBufferData를 회상했습니다 :
UpdateVBO(){
poseBuf = ByteBuffer.allocateDirect(poseLength * Float.SIZE/Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
UpdatePose(); // fill array data to FloatBuffer
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vboArray[VBO_VERTEX]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, poseLength * Float.SIZE/Byte.SIZE, poseBuf, GLES20.GL_DYNAMIC_DRAW); // poseBuf has been updated with capacity 12 * 4
GLES20.glGetBufferParameteriv(GLES20.GL_ARRAY_BUFFER, GLES20.GL_BUFFER_SIZE, pnew, 0); // get pnew[0] is 0
...
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
}
왜 새 버퍼에 OpenGL ES Server가 메모리를 할당하지 않습니까?
이 버퍼 캐시는 주 스레드에 있어야합니다. –