8

我一直想知道是否有人对此有所了解

android.opengl.Matrix.multiplyMM

他们可以分享。

.

问的原因是,在通过OpenGL ES学习时,该方法被广泛用于各种计算。但是,我发现使用android.renderscript.Matrix4f比使用原始 float[] 数组更自然。问题是,Matrix4f 的乘法函数使用临时矩阵来执行操作,这导致内存效率低下。

解决这个问题的一种方法是创建我自己的Matrix4f并自己编写 multiply() 。我基于以下示例。它可能看起来很糟糕,但为我节省了所有 set()、get() 和循环,从而提高了性能。

但是,我仍然不想让multiplyMM离开。在源代码中,您可以读到该方法是native,因此应该更快地评估(是吗?)。这让我再次感到好奇。

.

因此,有谁知道:

  1. multiplyMM 的底层算法是什么?它使用临时工吗?
  2. 用起来会比自己写的乘法快吗?
4

1 回答 1

10

1)算法是矩阵乘法。这和你在线性代数课上学到的东西是一样的。(来源:http ://androidxref.com/source/xref/frameworks/base/core/jni/android/opengl/util.cpp )

multiplyMM使用临时工吗?它是原生的,所以没关系。如果有临时变量,则将其分配在堆栈上。不涉及 GC,因为它是本机的。

2)也许。仅仅因为它是用 C++ 编写的,这并不能加快代码的执行速度。为什么?从 Java 领域切换到本机代码存在开销,并且可能该开销超过了在本机代码中执行的性能优势。

尽管如此,还有两件事要记住:1) 不要过早地优化你的代码,除非你确定这是一个性能瓶颈,2) 如果你不确定,请进行一些测量。对您的代码进行一些分析以得出正确的结论。

于 2014-08-07T18:14:55.777 回答