渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

UnityEngine.MathfとSystem.Mathどっちを使うのが良い?という話


f:id:esakun:20150730215258g:plain

ふと気になったシリーズです。

Unityを使っていると、ありがたいことに様々な便利関数がラップ、または拡張追加提供されています。
例えばC#の算術関連クラスであるSystem.Mathをラップ & 拡張しているUnityEngine.MathfというものがUnityでは提供されています。
その中でUnityEngine.Mathf.Abs関数は引数の絶対値を求めてくれますが、中身を覗くと以下のコードで記述されています。

内部的にはSystem.Math.Abs関数を実行しているだけです。

ではUnityでコードを書く場合、UnityEngine.Mathf.AbsSystem.Math.Absどちらを使えばよいの?っていう話になると思いますが、これはケースによって異なると思います。

パフォーマンス観点から見た場合

上記のコードを使い、Unityプロファイラで負荷を確認すると、1回の実行では目立った差は出てきませんが、10000回実行すると顕著に出てきます。

f:id:esakun:20180430031226p:plain

結果は明らかですが、

UnityEngine.Mathf.AbsSystem.Math.Absに比べて約2倍の負荷がかかっているということになります。 これは、UnityEngine.Mathf.AbsMathf.AbsMath.Abs2つの関数をまたいでいるためだと思われます。

ということで、パフォーマンスチューニングするときの手段としてはMathクラスをそのまま使うというのは1つの手かもしれません。

マルチプラットフォーム対応観点

Unityはワンソースで複数のプラットフォームに対応するように作られているため、UnityEngine.Mathfクラスに限りませんが、UnityEngine配下のクラスを使ったほうが安全だと思われます。
※注意 : 逆のパターンもありえます

チーム開発観点

チーム内でコードレビューをすると思いますが、その際にMathfとMathどっち使うの?みたいな議論が出て、このケースだと使っていいけど、このケースはやめようというコードレビューの複雑化が予想されます。大きな問題が発生していないのであればMathfクラスを使ったほうが、シンプルで良いと思います。

まとめ

パフォーマンスに余裕がある場合は素直にUnityEngine.Mathfを使ったほうが良いという自分の中での結論。