処理を減らすための数学
おはようございます。本日の当番、プログラマーのK.Yです。
ゲームを作成していく上で仕様を実装していくことはもちろんですが、ある一定量まで実装していくと別の作業が発生することがあります。
それは処理を減らすことです。
主に処理落ち対策なのですが、今まで実装したものを残しつつ処理を減らしていくということでなかなか大変な作業になります。
方法のひとつとして
・データの形式を変更する
・配置できるオブジェクトの数を調整する
などデータ側での対応がありますが、
プログラマーもプログラム中の処理を効率よくすることで処理軽減を行っていきます。
そんな中、今回は計算処理を減らすために役に立ちそうなお話をしたいと思います。
例えば、複数存在しているオブジェクトの中からプレイヤーに一番近いオブジェクトを探すという処理を考えてみます。
まずは一番近いオブジェクトということでそれぞれの距離を取得します。
プレイヤーの座標を ( px py pz )
オブジェクトの座標を ( ox oy oz )
としたとき
プレイヤーとオブジェクトの距離は以下の手順で求めることができます。
(1)それぞれの値を引く
x1 = px - ox
y1 = py - oy
z1 = pz - oz
(2)その値を2乗する
x2 = x1 * x1
y2 = y1 * y1
z2 = z1 * z1
(3)それらを全て足す
L2 = x2 + y2 + z2
(4)足した値の平方根が距離
求めたい距離 L1 = √L2
存在するオブジェクトの数分この処理を行うことでそれぞれの距離が取得でき、その中で一番距離が短いものが探すべきオブジェクトになります。
一応このように(1)~(4)の処理で目的を達成することはできます。
しかし、今回行いたい処理は【一番近いオブジェクトを探す】です。
そうなると、上の(1)~(4)の処理のうち(4)の処理は飛ばしても同じ結果を得ることはできます。
なぜなら上の例で挙げた L1 と L2 の大小関係は同じだからです。
(正方形の面積が大きければ大きいほど、その一片も長いということ)
というわけで、(3)の処理で取得できた L2 が一番小さいオブジェクトが、そのまま【一番近いオブジェクト】になります。
これで平方根を求めるという(4)の処理を飛ばした分、処理軽減ができました。
「たったこれだけ?」と思われるかもしれません。
しかし、オブジェクトの数が増えれば増えるほど、この小さな積み重ねが生きてきます。
他にも仕様によりますが、次のような対応もできます。
例えば【一定以上距離が離れたオブジェクトは検索の対象にならない】という場合です。
この場合、(1)の処理で得られた x1 y1 z1 のどれかの絶対値が一定以上というだけで、そのオブジェクトはそれ以降の(2)(3)の処理を飛ばすこともできたりします。
このように【距離を求めるために必要な数学の知識は、正確に距離を求めなくても処理として使える場面を発見できる】ということもあったりします。
(もちろん全てのオブジェクトに正確な距離が必要なのであれば、処理は(4)まで必要になってきますが)
今回の例は当たり前といえば当たり前の処理ですが、他にも必要・不要な部分をしっかり分けることで更なる処理軽減ができるような場所は色々とあるかも知れません。
そんな場所を発見し、変更を加え、小さな積み重ねをどんどんと増やしていければと思います。
・・・というわけで、プログラムとにらめっこ中。
| 固定リンク
« 私はゲームを作っている | トップページ | 見直し »
「プログラマー」カテゴリの記事
- ポジティブシンキング♪(2012.01.25)
- Simple is best(2011.12.19)
- 残り半月!(2011.12.16)
- もしもの時の為に(2011.12.15)
- OpenCVと某カメラを使う(2011.12.14)












コメント