#blognavi
#blognavi
TonyuBBSで話題に上がった
「一つのオブジェクドにforを使わせ・・・」
ということにヒントを得て、
Tonyuの動作を軽量化するライブラリを作ってみました。
思った以上の軽量化に成功。
「一つのオブジェクドにforを使わせ・・・」
ということにヒントを得て、
Tonyuの動作を軽量化するライブラリを作ってみました。
思った以上の軽量化に成功。
以下にその詳細を記します。
以下、プログラムに興味がない人にとっては
面白くもなんともない話が続きます。
以下、プログラムに興味がない人にとっては
面白くもなんともない話が続きます。
- -
Tonyuでは(Tonyuに限らないが)、
「全てのオブジェクトを調べる」という処理がよくある。
例えば、シューティングで敵が弾に当たっているかどうか、
アクションで、自キャラが敵に当たっているかどうか。
で、そんなよく使う処理が実はとても重い。
Tonyuでは(Tonyuに限らないが)、
「全てのオブジェクトを調べる」という処理がよくある。
例えば、シューティングで敵が弾に当たっているかどうか、
アクションで、自キャラが敵に当たっているかどうか。
で、そんなよく使う処理が実はとても重い。
例えば弾幕系シューティングなんかでは、
オブジェクト(弾やキャラクタ)の数は100を平気で超えるが、
その全てが「全てのオブジェクトを調べる」という処理を行った場合、
単純計算で”100×100=10000”という膨大な処理量になる。
(当然ながらオブジェクトが増えれば増えるほど処理は多くなる)
そして、Tonyuの処理速度はそれほど速くないため、
その様な処理を行うゲームを作るのは困難。
オブジェクト(弾やキャラクタ)の数は100を平気で超えるが、
その全てが「全てのオブジェクトを調べる」という処理を行った場合、
単純計算で”100×100=10000”という膨大な処理量になる。
(当然ながらオブジェクトが増えれば増えるほど処理は多くなる)
そして、Tonyuの処理速度はそれほど速くないため、
その様な処理を行うゲームを作るのは困難。
で、少し前にTonyuサイトのBBSにも似た話題が挙がっていて、
その中の、
「一つのオブジェクドにforを使わせ・・・」と、
「#先日話題に上った『マップ座標系でのオブジェクトの位置をあらかじめ求めておく』話とかも・・・」
という言葉でピンときた。
「予め、ある程度近いオブジェクトだけでも分かれば、高速に処理できる」
その中の、
「一つのオブジェクドにforを使わせ・・・」と、
「#先日話題に上った『マップ座標系でのオブジェクトの位置をあらかじめ求めておく』話とかも・・・」
という言葉でピンときた。
「予め、ある程度近いオブジェクトだけでも分かれば、高速に処理できる」
”ある程度近いオブジェクト”を高速に求める方法はある。
それは、画面座標に対応した2次元配列を使う方法。
例えば、先ず座標の0~9は配列の0番、座標10~19は配列の1番、というように対応付ける。
そして、各オブジェクトを配列の対応する位置に格納する。
そうして、全オブジェクトを格納すると、
近い位置にあるオブジェクト同士は配列内で近い位置に格納されている
という仕組み。
(これは以前ミスティックロンドの高速化に使用した手法と似ている)
(人間ならぱっと見で分かるものでも、コンピュータにはここまでしないと分からない。難儀な)
それは、画面座標に対応した2次元配列を使う方法。
例えば、先ず座標の0~9は配列の0番、座標10~19は配列の1番、というように対応付ける。
そして、各オブジェクトを配列の対応する位置に格納する。
そうして、全オブジェクトを格納すると、
近い位置にあるオブジェクト同士は配列内で近い位置に格納されている
という仕組み。
(これは以前ミスティックロンドの高速化に使用した手法と似ている)
(人間ならぱっと見で分かるものでも、コンピュータにはここまでしないと分からない。難儀な)
そうして、”ある程度近いオブジェクト”を求めたら後は簡単。
近い場所にいるオブジェクトを配列から取得し、
その中から、必要な処理(衝突判定等)を行えばいい。
こうして軽量化が完了する。
近い場所にいるオブジェクトを配列から取得し、
その中から、必要な処理(衝突判定等)を行えばいい。
こうして軽量化が完了する。
ただ、途中省略したが、
この手法は「”ある程度近いオブジェクト”に対する処理(ex.衝突判定)」にしか使用できない。
つまり、「”遠距離にいるオブジェクト”にも行う必要がある処理(ex.誘導弾)」には使えない。
これは大きな問題。
この手法は「”ある程度近いオブジェクト”に対する処理(ex.衝突判定)」にしか使用できない。
つまり、「”遠距離にいるオブジェクト”にも行う必要がある処理(ex.誘導弾)」には使えない。
これは大きな問題。
もっと上手い方法を御存知の方、
ありましたら御一報を。
ありましたら御一報を。
- - - -
せっかくなので、簡単な軽量化手法を一つ紹介。
せっかくなので、簡単な軽量化手法を一つ紹介。
全てのオブジェクトを調べる必要がある処理(接触判定等)の多くは、
実はその処理を毎フレーム行う必要はない。
数フレームに一度実行するだけで十分。
案外知らない人も多いのでは。
実はその処理を毎フレーム行う必要はない。
数フレームに一度実行するだけで十分。
案外知らない人も多いのでは。
自分が上で懸命に作ったライブラリを使うより、
この手法の方が、圧倒的に手軽で確実。
お勧め。
この手法の方が、圧倒的に手軽で確実。
お勧め。
カテゴリ: [ゲーム制作] - &trackback() - 2006年09月05日 11:53:41
- し、知らなかった。為になります。 -- 少佐 (2006-09-05 23:28:15)