反编译的U3D 的Transform 的源码,研究了下里面的关于数学的一些借口,
发现有两个函数的实现有 性能问题。
如图
当relativeTo=Space.Self 的时候,其实直接改成
this.localPosition += translation; 接可以了。
其实底层存的应该都是localPosition. 即使算出了worldposition最终底层还是需要转换为localPosition的,如果节点的层级关系很多,
这样计算量就更大了。
测试1百万次6个节点的情况,调用Translate函数需要391毫秒。直接this.localPosition += translation 消耗135毫秒
Rotate函数在relativeTo == Space.World的情况下也有性能问题。
参考源码可以发现
this.rotation *= (Quaternion.Inverse(this.rotation) * quaternion) * this.rotation;
等价于
this.rotation = quaternion * this.rotation;
四元素是满足结合律的。
测试1百万次6个节点的情况,调用Translate函数需要718.1761毫秒。直接this.rotation = quaternion * this.rotation; 消耗421.4793毫秒