适用于Android的IntBuffer,ByteBuffer,ByteOrder和GLES20

时间:2012-09-08 13:33:28

标签: java android

我有三个代码片段应该表现相似,或者可能不是,我还在研究OpenGL ES如何绑定到Android for Java。但是我真的想知道为什么片段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;请注意,与之前的唯一区别在于分配调用而不是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)有效,这让我感到很惊讶,因为它再次调用分配而不是分配直接:

        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,看起来它们可能是名字。

0 个答案:

没有答案