0

在 Android 中使用 OGLES。我想创建一些三角形并翻译它们。够直截了当。

我查看了示例,发现 FloatBuffers 被推荐作为在 Android 中使用 GLES 的多边形坐标的存储结构,因为它们是原生代码类固醇。好东西!解释在这里。

为什么使用 FloatBuffer 而不是 float[]?

现在让我感到困惑的是,Android 中的 Matrix 类几乎只在 java 浮点数组上运行。因此,一方面我被告知要使用 FloatBuffers 来提高速度,但另一方面,我现在想做的每个转换都必须看起来像这样?

float[] myJavaFloatArray = new float[polylength];
myFloatBuffer.get(myJavaFloatArray);
Matrix.translateM(myJavaFloatArray,0,-1.0f,0.0f,0.0f);
myFloatBuffer.put(myJavaFloatArray);

这真的是最佳实践吗?是否只是假设我的翻译与抽奖的比率足够低以至于这笔费用是值得的?如果我要进行大量翻译,每帧的每个对象都进行翻译,这是否是贯穿始终使用 java 浮点数组的参数?

4

1 回答 1

1

首先,是不是有一种方法array()可以FloatBuffer返回float[]直接指向缓冲区数据的值?您应该在 translate 方法中使用它,这样您就不会在内存中复制数据,这应该将您的 4 行代码变成一行:

Matrix.translateM(myFloatBuffer.array(),0,-1.0f,0.0f,0.0f);

其次,在 CPU 上转换顶点数据不是最佳实践,您有一个顶点着色器。使用矩阵并将它们推送到 GPU,以便您从中受益。此外,如果您以您的方式转换这些数据,您会破坏它们:如果浮动缓冲区包含您想要在多个位置绘制的某个对象的顶点数组,您必须在将其转换为新位置之前将其转换回 0对于每个绘图调用或具有顶点数据的多个实例。

无论如何,尽管能够转换数组缓冲区非常方便,但如果可能的话,您应该避免每帧使用它。在准备某些元素时在加载时间或后台执行此操作。至于每帧,而是尝试使用顶点着色器。如果您正在处理 ES1 并且您没有顶点着色器,那么仍然有以相同方式工作的矩阵操作(平移、旋转、缩放、设置、推送、弹出......)

于 2013-06-21T06:47:57.260 回答