在Android中使用OGLES。我想创建一些三角形并翻译它们。直截了当。
我看一下这些例子,看看在Android中使用GLES建议使用FloatBuffers作为多边形坐标的存储结构,因为它们是本机代码类固醇。好东西!这里的解释。
Why FloatBuffer instead of float[]?
现在令我困惑的是,Android中的Matrix类几乎完全依赖于java float数组。所以一方面我被告知要使用FloatBuffers来提高速度,但另一方面我现在要做的每一次转换都必须看起来像这样?
float[] myJavaFloatArray = new float[polylength];
myFloatBuffer.get(myJavaFloatArray);
Matrix.translateM(myJavaFloatArray,0,-1.0f,0.0f,0.0f);
myFloatBuffer.put(myJavaFloatArray);
这真的是最好的做法吗?假设我的翻译与抽奖的比率是否足够低以至于这笔费用是值得的?如果我正在进行大量翻译(每帧每个对象一次),那么整个过程中使用java float数组的参数是什么呢?
答案 0 :(得分:1)
首先,array()
没有方法FloatBuffer
返回float[]
值直接指向缓冲区数据?您应该在translate方法中使用它,这样就不会在内存中复制数据,这应该将您的4行代码转换为一行:
Matrix.translateM(myFloatBuffer.array(),0,-1.0f,0.0f,0.0f);
其次,在CPU上转换顶点数据不是最佳做法,你有一个顶点着色器。使用矩阵并将它们推送到GPU,这样您就可以从中受益。此外,如果您按照这种方式转换这些数据,则会破坏它们:如果浮动缓冲区包含要在多个位置绘制的某个对象的顶点数组,则必须先将其转换回0,然后再将其转换为新位置对于每个绘制调用或具有顶点数据的多个实例。
任何方式,虽然能够转换数组缓冲区非常方便,但如果可能的话,应该避免每帧使用它。在准备一些元素时,在加载时间或后台执行此操作。至于每帧,请尝试使用顶点着色器。如果你正在处理ES1而你没有顶点着色器,那么仍然有矩阵运算以相同的方式工作(平移,旋转,缩放,设置,推送,弹出...)