反編譯的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毫秒