1

我正在通过这个网站学习适用于 Android 的 OpenGL ES:http: //www.learnopengles.com/android-lesson-one-getting-started/

有两点没看懂。。。

这段代码究竟做了什么:

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

1 回答 1

2

为什么我们甚至需要这样做呢?

如果我们用 C 编写代码,我们就不需要上面的代码——我们只需跳过整个 ByteBuffer.allocateDirect 的内容,并在调用 drawArrays 或 drawElements 时将指针传递给我们的数组。但是,我们不能这样做,因为在 Android 中运行的 Java 虚拟机 Dalvik 有一个垃圾收集器,它可能会在我们身上移动数据。它甚至可能会废弃记忆,错误地认为我们不再需要它。安全的方法是使用 ByteBuffer.allocateDirect 在本机内存中创建一块内存,将数据复制到那里,然后 OpenGL 可以直接使用它,而无需担心虚拟机。

每个缓冲区都需要足够大以容纳我们要复制的数据;当我们创建缓冲区时,它需要一个以字节为单位的大小。我们的 Java 数组由浮点数组成,因此要计算字节大小,我们将数组长度乘以 4。浮点值是 32 位,字节是 8 位值,所以有始终是浮点数的 4 个字节。

希望这会有所帮助。:)

于 2012-06-06T02:31:48.637 回答