我有三段代碼應該表現相似,或者不是,我仍在研究OpenGL ES如何綁定到Java的Android版本。不過我真的想知道爲什麼片段B和C表現不同:IntBuffer,ByteBuffer,ByteOrder和GLES20 for Android
以下(A)工作原理:
ByteBuffer bb = ByteBuffer.allocateDirect(8);
bb.order(ByteOrder.nativeOrder());
IntBuffer ib = bb.asIntBuffer();
Log.d("Info", "Generating buffers...");
GLES20.glGenBuffers(2, ib);
Log.d("Info", "Done!");
int buff1 = ib.get();
int buff2 = ib.get();
Log.d("A) buff1", String.format("%d", buff1));
Log.d("A) buff2", String.format("%d", buff2));
以下(B)不工作,並導致SIGSEGV上glGenBuffers;注意,與以前唯一不同的是在分配呼叫,而不是allocateDirect:
ByteBuffer bb = ByteBuffer.allocate(8);
bb.order(ByteOrder.nativeOrder());
IntBuffer ib = bb.asIntBuffer();
Log.d("Info", "Generating buffers...");
GLES20.glGenBuffers(2, ib);
Log.d("Info", "Done!");
int buff1 = ib.get();
int buff2 = ib.get();
Log.d("B) buff1", String.format("%d", buff1));
Log.d("B) buff2", String.format("%d", buff2));
以下(C)的作品,這着實讓我吃驚,因爲這又是一個呼叫分配,而不是allocateDirect:
IntBuffer ib = IntBuffer.allocate(2);
Log.d("Info", "Generating buffers...");
GLES20.glGenBuffers(2, ib);
Log.d("Info", "Done!");
int buff1 = ib.get();
int buff2 = ib.get();
Log.d("C) buff1", String.format("%d", buff1));
Log.d("C) buff2", String.format("%d", buff2));
使用「works」這個詞,我的意思是沒有錯誤出現在日誌中,buff1和buff2得到正面的「合理」值,例如70001,140002或210004,看起來像是名字。