Android 我应该单独存储转换矩阵吗?

Android 我应该单独存储转换矩阵吗?,android,opengl-es,transform,opengl-es-2.0,Android,Opengl Es,Transform,Opengl Es 2.0,我是OpenGLES2.0新手,我正在尝试一些二维渲染 假设每个对象都将被平移、旋转、倾斜和缩放,并且可以通过鼠标单击进行选择,我现在有两个选择: 为每个变换存储一个矩阵,并将它们分别传递给顶点着色器。矩阵乘法将在GPU上完成,我想这会更快。当只改变一个变换矩阵时也很方便。由于我需要将每一个矩阵应用到一个向量上,所以决定选择是很难的 仅存储一个矩阵作为所有变换矩阵的乘积,并将其传递给顶点着色器。这可能很好,因为一些方法,例如Matrix.scaleM()和Matrix.translateM()非

我是OpenGLES2.0新手,我正在尝试一些二维渲染

假设每个对象都将被平移、旋转、倾斜和缩放,并且可以通过鼠标单击进行选择,我现在有两个选择:
  • 为每个变换存储一个矩阵,并将它们分别传递给顶点着色器。矩阵乘法将在GPU上完成,我想这会更快。当只改变一个变换矩阵时也很方便。由于我需要将每一个矩阵应用到一个向量上,所以决定选择是很难的

  • 仅存储一个矩阵作为所有变换矩阵的乘积,并将其传递给顶点着色器。这可能很好,因为一些方法,例如
    Matrix.scaleM()
    Matrix.translateM()
    非常快速,不需要乘法。这也是因为我们每帧上传到着色器的统一数据减少了。但每次变换矩阵中的一个发生变化时,整个乘积都应该重新计算。决定选择相对简单,因为我只需要将单个矩阵应用于向量


    欢迎对选择提出任何建议。

    最好执行基准测试,因为性能与多个问题相关:
  • CPU和GPU的乘法性能之间的差距。
  • 上传制服的带宽。
  • 应用于变换的顶点数。
  • 仅将一个变换矩阵标记为脏矩阵的可能性。
  • 改变变换参数的频率


    通常可以在局部执行此操作,因为当仅涉及2D对象时,矩阵乘法可以轻松优化。

    您有在顶点着色器中编写的计算矩阵变换的代码吗?@Radu它只是一些乘法,例如
    gl\u Position=uTrans*uRotate*uScale*aPos。你看,在CPU上,每个对象只需要做一次矩阵乘法。在GPU上,您需要对对象的每个顶点进行矩阵乘法(千次)。因此,没有必要用这种方式加快速度。@peter,如果性能是您主要关心的问题,您真的必须进行基准测试,因为这取决于处理能力(GPU比CPU快)、上载带宽(上载更多矩阵可能会抵消GPU带来的任何性能提升)和对象的实际数量(同样,必须对大量对象进行计算可能会抵消GPU带来的任何性能提升)。@MārtiņšMožeiko我明白了。但如果GPU上的乘法速度快得多怎么办?我对此不确定。