erl*_*man 3 android bytebuffer allocation opengl-es floatbuffer
这就是我如何制作一个三角形数组
float[] tableVerticesWithTriangle = {
// triangle 1
0f, 0f, 9f, 14f, 0f, 14f,
// triangle 2
0f, 0f, 9f, 0f, 9f, 14f
};
Run Code Online (Sandbox Code Playgroud)
这就是我在本机环境中分配块的方式
vertexData = ByteBuffer
.allocateDirect(
tableVerticesWithTriangle.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexData.put(tableVerticesWithTriangle);
Run Code Online (Sandbox Code Playgroud)
人们使用的原因ByteBuffer.allocateDirect()是其他缓冲区类,如FloatBuffer,没有allocateDirect()方法。只能ByteBuffer作为直接缓冲区分配。因此分配 a ByteBuffer,然后将内存用作 a FloatBuffer,是获得直接分配的 a 的唯一方法FloatBuffer。
的文件isDirect()中的FloatBuffer类解释它是这样的:
指示此缓冲区是否为直接缓冲区。直接缓冲区会尽量利用本机内存 API,它可能不会留在 Java 堆中,因此不会受到垃圾收集的影响。
如果浮点缓冲区基于字节缓冲区并且字节缓冲区是直接的,则它是直接的。
换句话说(不太正式),本机缓冲区是 Java 不会干扰的本机内存分配。
奇怪的是,我从来没有找到明确的文档。所以以下是我通过实验证实的假设,目前没有找到任何反例。
直接缓冲区有当缓冲区被传递给一个OpenGL API在内存使用的OpenGL实现中使用的调用返回后。
我只能找到一个这样的例子:客户端顶点数组(顺便说一句,它在 ES 3.0 中被标记为遗留功能,但仍受支持)。这是glVertexAttribPointer()具有以下签名的调用,它支持不使用 VBO 的顶点数组:
glVertexAttribPointer(int indx, int size, int type, boolean normalized,
int stride, Buffer ptr)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,OpenGL 将在稍后的绘制调用中从缓冲区中提取顶点数据,因此在调用返回后缓冲区内容必须保持可供 OpenGL 访问,并且可能会被 GPU 直接读取。
在所有其他情况下(再次根据我的假设),没有必要使用直接缓冲区。例如,您可以执行以下操作:
float[] vertexData = {...};
GLES20.glBufferData(GL_ARRAY_BUFFER, vertexData.length * 4,
FloatBuffer.wrap(vertexData), GLES20.GL_STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)
该glBufferData()呼叫在通话过程中消耗的数据,原来的缓冲区不能由OpenGL的调用返回后访问。因此,没有必要使用直接缓冲区。
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |