Matrix.setRotateM和Matrix.rotateM之间有什么区别吗?

Ant*_*kiy 1 android matrix opengl-es-2.0

在android.opengl.Matrix类中有两种旋转矩阵的方法,它们是:

  1. static void rotateM (float[] m, int mOffset, float a, float x, float y, float z)
    围绕轴(x,y,z)以角度a(以度为单位)旋转矩阵m

  2. static void setRotateM(float[] rm, int rmOffset, float a, float x, float y, float z)
    围绕轴(x,y,z)以角度a(以度为单位)旋转矩阵m

这是原始的ducumentation

这些方法有点不同,但我不明白确切的区别.你能向我解释这个吗?

Mār*_*iko 5

假设矩阵R是围绕(x,y,z)轴旋转矩阵的角度a,则rotateM方法修改现有矩阵m,如下所示:m = R * m,但setRotateM会覆盖它:m = R.


kea*_*ine 5

以上答案是正确的.不过,我有一个小小的通知.请注意,Matrix.rotateM()分配16个字节,因此不要在绘制每个帧时调用它.如果需要,最好使用预先分配的临时矩阵实现自己的旋转方法.更多信息:https://groups.google.com/forum/?fromgroups#!topic / android-Developers / sw3SpDfPsHY [1-25]

  • 我正在研究这个问题,结果是rotateM现在使用临时矩阵进行计算.我试着看看哪个Android版本有这个更新.从AOSP看源代码来自这个提交:https://github.com/android/platform_frameworks_base/commit/cc5471c35327c1511075f5df0d45a2d57610fecb虽然我无法知道这是什么时候投入生产. (3认同)
  • @AntonBoritskiy我在我的博客中写过关于这个和其他性能调整的文章:http://androidworks-kea.blogspot.com/2012/05/developers-notes-about-opengl-es.html如果你分配了16个字节的几个每帧的时间可以导致100-300 KB的GC清理.在Android 2.2上,每5-10秒会导致100-200毫秒的锁定.这非常引人注目. (2认同)