タイトルの通りです。
cocokyoro.hateblo.jp
引き続きここに追加していってます。
ですがこのままだと非常に長い記事になりそうなので、一個一個の項目ごとに記事に残して、上の記事は目次的な存在にしようかなと。。
というわけで今回は「Consider using distance-squared over distance」の項目について。
普通の距離よりも二乗された距離を使いましょうね、というお話。
通常ルート(√)の計算はCPUに大きな負荷がかかります。
Vector3.magnitudeとかVector3.Distance()は三平方の定理の式に基づいて値を出しています。
これの2で求まる値ですね。
Vector3クラスにはsqrMagnitudeというプロパティがあります。
これは距離を二乗した値に等しいです。
上の図の1で求まる値ですね。
二乗した値を使うことには以下の2つのメリットがあります。
- 値の精度のロスを減らせる
- パフォーマンスが向上する
・値の精度のロスを減らせる
a,b の大小と a^2,b^2の大小は一致します。
が、a,bはルートを取った際に値のロスが発生します。
より正確な値を取りたい場合は二乗された値を使用した方が安全。
パフォーマンスが向上する
前述の通りルート計算だとCPUに負荷がかかっちゃうからやめましょう。
距離に関わらずルート値を使ってるところは二乗の値に置き換えてやりましょう。
Unity側がVector3のプロパティにsqrMagnitudeというものを用意してるということはそういうことなんでしょう。
・before
float distance = (transform.position - other.transform.position).Distance(); if(distance < targetDistance){ //処理 }
・after
float distance = (transform.position - other.transform.position).sqrMagnitude; if(distance < targetDistance * targetDistance){ //処理 }
ちなみにxのy乗はMathf.Pow(x,y);で表現できます。
簡単だけど以上です。
今回わかんなかった単語
precision = 精度