#blognavi
#blognavi
「ミスティックロンド」ver0.26をリリース。
動作速度の劇的な改善に成功いたしました。
実行時の負荷は実に7割減!(当社比)
これで貴方も処理落ちによる不快な思いからはオサラバ!
動作速度の劇的な改善に成功いたしました。
実行時の負荷は実に7割減!(当社比)
これで貴方も処理落ちによる不快な思いからはオサラバ!
[更新内容]
ver0.25->0.26
ver0.25->0.26
- 動作速度の劇的改善。
- - - -
[改善内容の解説]
ここで少し、動作速度の改善に用いた方法とその解説をさせて頂く。
[改善内容の解説]
ここで少し、動作速度の改善に用いた方法とその解説をさせて頂く。
- -
問題点について
動作速度について問題となっていた処理は、コインオブジェクト(O_Coin)の処理である。
このオブジェクトは、敵を倒すと大量に発生し、多いときには同時に50個以上発生する。
また、ここで行われている処理も重い。
周囲8方向に壁が無いか調べ、その影響を計算するという処理を毎フレーム行っている。
この処理の軽量化をすることで、動作速度は大きく改善する。
問題点について
動作速度について問題となっていた処理は、コインオブジェクト(O_Coin)の処理である。
このオブジェクトは、敵を倒すと大量に発生し、多いときには同時に50個以上発生する。
また、ここで行われている処理も重い。
周囲8方向に壁が無いか調べ、その影響を計算するという処理を毎フレーム行っている。
この処理の軽量化をすることで、動作速度は大きく改善する。
- -
改善方法について
改善に用いた方法は2つ。
-
先ず、毎フレーム周囲を調べる処理について。
周囲に壁があるか調べるというのは、人ならパッと見で分かるが、
計算機が行うのは、思いのほか処理が重い。
明らかに壁から遠いにも拘らず、毎フレーム周囲を調べるという”無駄な”計算を強いられる。
壁に近いか否かだけでも簡単に分かれば、壁に近い場合にのみ周囲を調べればよくなり、負荷は軽減される。
それを実現する方法には、あらかじめその地点(座標)が壁から近いか否かを調べておく方法をとった。
あらかじめ各地点が壁から近いか否か(最も近い壁からの距離)を調べその情報を配列に格納しておく。
コインオブジェクトは、まずその配列にアクセスし、壁から近い場合にのみ実際に調査・計算を行えばいい。
これにより、毎フレーム周囲を調べていたのが、必要なときにのみ周囲を調べ、
通常は配列の1要素にアクセスするという簡単な処理のみで済むようになった。
なお、地点の刻み幅は8ドットとした。
理想を言えば、1ドット刻み、つまり全ドットに対して調べたほうがいいのだが、それを行うには膨大な手間が掛かり、
またそこまでやる意味もない。(画面サイズ400×300の場合、データ数は12万に上り、調査に要する時間も膨大)
壁にある程度近いか否かの判別に使うだけなので、さほど正確な情報は必要ない。
コインのサイズや刻み幅の大きさによるコストなどから、8ドット刻みとした。
あからじめ各地点の情報を調べるのに多少時間は掛かるが、さほど問題ではない(1秒程度)。
-
もう1つ、処理の停止について。
コインの動きを見てもらえば分かるが、一度停止したコインはもう動作しない。
動作する必要が無い。つまり、動作に必要な(重い)処理、周囲を調べ壁の影響を計算、重力の影響を計算、
等をする必要が無い。
そこで、動作しているか(!=速度0)を先ず判定し、動作している場合にのみ処理を行うようにした。
これにより、長い時には出現から300フレーム目に自動消滅するまで、上記の処理を行っていたのが、
生成から停止するまでの約100フレーム程度の時間で処理を停止させることが出来る。
改善方法について
改善に用いた方法は2つ。
-
先ず、毎フレーム周囲を調べる処理について。
周囲に壁があるか調べるというのは、人ならパッと見で分かるが、
計算機が行うのは、思いのほか処理が重い。
明らかに壁から遠いにも拘らず、毎フレーム周囲を調べるという”無駄な”計算を強いられる。
壁に近いか否かだけでも簡単に分かれば、壁に近い場合にのみ周囲を調べればよくなり、負荷は軽減される。
それを実現する方法には、あらかじめその地点(座標)が壁から近いか否かを調べておく方法をとった。
あらかじめ各地点が壁から近いか否か(最も近い壁からの距離)を調べその情報を配列に格納しておく。
コインオブジェクトは、まずその配列にアクセスし、壁から近い場合にのみ実際に調査・計算を行えばいい。
これにより、毎フレーム周囲を調べていたのが、必要なときにのみ周囲を調べ、
通常は配列の1要素にアクセスするという簡単な処理のみで済むようになった。
なお、地点の刻み幅は8ドットとした。
理想を言えば、1ドット刻み、つまり全ドットに対して調べたほうがいいのだが、それを行うには膨大な手間が掛かり、
またそこまでやる意味もない。(画面サイズ400×300の場合、データ数は12万に上り、調査に要する時間も膨大)
壁にある程度近いか否かの判別に使うだけなので、さほど正確な情報は必要ない。
コインのサイズや刻み幅の大きさによるコストなどから、8ドット刻みとした。
あからじめ各地点の情報を調べるのに多少時間は掛かるが、さほど問題ではない(1秒程度)。
-
もう1つ、処理の停止について。
コインの動きを見てもらえば分かるが、一度停止したコインはもう動作しない。
動作する必要が無い。つまり、動作に必要な(重い)処理、周囲を調べ壁の影響を計算、重力の影響を計算、
等をする必要が無い。
そこで、動作しているか(!=速度0)を先ず判定し、動作している場合にのみ処理を行うようにした。
これにより、長い時には出現から300フレーム目に自動消滅するまで、上記の処理を行っていたのが、
生成から停止するまでの約100フレーム程度の時間で処理を停止させることが出来る。
- -
ここまで上手く出来るとは思っても見なかった。
久々にプログラムやってて感動した。
ここまで上手く出来るとは思っても見なかった。
久々にプログラムやってて感動した。
カテゴリ: [ゲーム制作] - &trackback() - 2006年05月04日 03:28:28
#blognavi