« 【号外】「ロード オブ アルカナ」体験版配信開始! | トップページ | 作業管理 »

2010年8月20日 (金)処理を減らすための数学(便乗)

おはようございます。本日の当番、プログラマーのK.Yです。

これまで「処理を減らすための数学」ということでいろんな小技を紹介してきました。距離判定・エリア判定・自由落下処理・円運動・三角関数などなど。

さて、今回はどんなネタにしようかと思っていたところ
先週大川のブログで「処理を減らすための数学」ネタが出てきました。
これ幸いということで、今回はそのお題に便乗する形で処理軽減ネタを紹介したいと思います。

そのブログではカリングというものが紹介されていました。
カリングとは一般的に描画する・しない判断に使われる処理になります。
(詳細はそちらのブログを参照してみてください)
ですので、こちらではもう少しゲームよりな感じで考えてみたいと思います。


まずは下の図をご覧ください。
※カメラは必ずプレイヤーの後ろについているという設定で話を進めます。

2010_0819_01_2

この図のようにフィールド上に複数のオブジェクトがあるときにカリングを使うことで描画するしないは判断できます。
例えば「宝箱1は視錐台の中に存在するので描画する」ということになります。

もちろんこのままでも問題なく描画判定は行なわれます。
しかしせっかくですので、ここではさらに描画判定が軽くできないかを考えてみましょう。


ここからの話はゲームの仕様によって大きく変わってくるとは思いますが、
例えば、それぞれのオブジェクトに意思を持たせる方法を考えてみます。
「意志を持たせる」というと、とても大げさに感じてしまいますが
要はそれぞれのオブジェクト自身にカリングの処理が必要かどうかを前もって判断させるということです。

先ほどの図に出ているオブジェクトにそれぞれ判断させるとこのような感じになります。

2010_0819_02

各オブジェクトが様々な条件のもとで判定を行なった結果、宝箱1のみカリングの対象になるということになりました。


と、ここでいくつか疑問が出てきます。
疑問1:キャラ1のカメラの方向を判定するのってカリングでやるのと同じじゃないの?
疑問2:同じように宝箱2の壁に隠れているかの判定もカリングでやるんじゃないの?
疑問3:ドラム缶の距離が微妙ってどういうことなの?

などです。

もちろんカリングの処理の中でも同じような判定は行ないます。
しかし、それぞれのオブジェクトが以下のような挙動をする場合は話が変わってきます。ひとつずつ見ていきましょう。

疑問1
例えばキャラ1が次のような動きをする敵オブジェクトだとします。
・プレイヤーがキャラ1を見ていたら逃げようとする
・プレイヤーが背中を向けたていたら攻撃を仕掛ける
この挙動をさせるためにはプレイヤーの向きを判定する必要が出てきます。
そして始めの方の設定でお話ししたようにカメラはプレイヤーの後ろについています。
ということは、プレイヤーに対して攻撃するのか逃げるのかの判定を行ったついでに
カメラに対して処理をする・しないの判定もできてしまうわけです。

疑問2
例えば宝箱にはユーザーに分かりやすいように「宝箱ですよマーク」みたいなのが必要だったとします。
2010_0819_03
この場合、宝箱1にはマークが付いていても問題ありません。
しかし宝箱2は壁の向こうにあるため、まだマークが見えてはいけません。
そのため、この宝箱にはマークを出すかどうかの判定を行なう必要が出てきます。
というわけで、マークを出さない判定をしたついでにカメラに対しての判定もできました。

疑問3
これはオブジェクトの大きさにもよりますが、オブジェクトが見えるか見えないかの距離での判定になります。
例えば、それぞれのオブジェクトに大きさや見えるようになる距離などのパラメータを持っておき
この距離の近くにいるオブジェクトは前もって順番に判定を行なうようにするなどの方法をとることで
一斉にオブジェクトの判定を行なわなくてもいいようになり、同じようにカメラ判定の処理を飛ばすことができます。

今回紹介した方法はゲームの仕様によって使える使えないもあると思いますので、
それぞれのゲームの仕様に合わせて考えてみてください。


このように、描画判定を行なう前にこのオブジェクトは描画しないということが分かってしまえば
その後のカメラの判定自体をする必要もなくなり、その分処理も軽くなっていきます。


前回は関数の中身を変更することで処理軽減を試みてみましたが
今回は対象となる関数に至る前での処理軽減を紹介してみました。
このように、処理軽減は様々な方法で実現することができます。
みなさんもまだまだ処理軽減ができそうな場所がないか探してみましょう。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2010/08/post-0364.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« 【号外】「ロード オブ アルカナ」体験版配信開始! | トップページ | 作業管理 »

プログラマー」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 処理を減らすための数学(便乗):

« 【号外】「ロード オブ アルカナ」体験版配信開始! | トップページ | 作業管理 »