我有三个代码片段,它们的行为应该相似,或者可能不相似,我仍在研究 OpenGL ES 如何绑定到 Java for Android。但是我真的很想知道为什么片段 B 和 C 的行为不同:
以下(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) 不起作用,并导致 glGenBuffers 上的 SIGSEGV;请注意,与前一个的唯一区别在于 allocate 调用而不是 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) 有效,这真的让我感到惊讶,因为它再次调用 allocate 而不是 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));
使用“工作”一词,我的意思是日志中没有出现错误,并且 buff1 和 buff2 得到正的“合理”值,例如 70001、140002 或 210004,它们看起来可能是名称。