はい、知っています。真ん中で区切って探索しsoftya(ソフト屋) さんが書きました:アルゴリズムの二分探索をご存知ですか?
的を絞って行く方法ですよね?
ただ、プログラムの前半後半とかよくわからないので
手間でもわかりやすい関数単位で調べるという方が
自分向きだと思いましたので時間食いましたが調べていました。
とりあえず、
TimeStart = GetNowCount(); // 現在時刻
〜ここに計測したい処理〜
TimeEnd = GetNowCount(); // 現在時刻
といった形で関数をはさんで、
TimeSpan = TimeEnd - TimeStart;
といった感じです。
(それぞれdouble型で宣言しております)
で、結果ですが、時間がかかっている処理をつきとめました。
それは、オブジェクト同士の衝突判定を行う処理(関数)でした。
ここから、重要な質問なのですが、
自分はHitCheckというクラスをシングルトンで生成しており
そのHitCheckクラスにて
オブジェクトlist内のオブジェクト同士の衝突判定をする
関数(名をhitcaseとします)を作っています。
ややこしいのですが、そのhitcase関数の中で扱っている
オブジェクトlistは、オブジェクトを管理させているObjectMgrクラスが持っています。
ObjectMgrクラスもシングルトンで作っているのですが
(そこではオブジェクト用のlistを作り、そこに作ったオブジェクトを入れたり、
中のオブジェクトを削除したり、オブジェクトの更新をさせたりしています)
そのhitcase関数をステージの更新関数内にて実行させているときに
オブジェクトが増えると遅延する様です。
しかし、ここで疑問があります。
オブジェクトlistのサイズがただ増加すれば
重くなるわけでありません。
処理時間計測で調べたのですが、
ObjectMgrクラスの更新関数や、描画関数でも
オブジェクトlist内の更新や描画処理をさせているので
イテレータを作ってまわしておりますが、
オブジェクトが増えたところで、
その処理速度はまったく変わりません。
目に見えて時間がかかるようになるのは
オブジェクトリストを扱っているhitcase関数だけなのです。
そしてここでも疑問があるのですが
そのhitcase関数内の衝突処理を空っぽに、つまりは↓
//HitCheckクラスの、オブジェクト同士の衝突判定をする関数
void HitCheck::hitcase(){
list<sObject*>::iterator it, it2;//ふたつのイテレータ宣言
for(it = ObjectMgr::getInstance()->objectlist.begin(); it !=ObjectMgr::getInstance()->objectlist.end(); ++it)
{
for(it2 = ObjectMgr::getInstance()->objectlist.begin(); it2 !=ObjectMgr::getInstance()->objectlist.end(); ++it2)
{
本来ここでオブジェクトを抽出して、
ダラダラと衝突確認をしているわけですが、
すべてを削除して、ここにはなにも無い、空っぽの状態にしています。
}
}
}
つまり、これは
衝突処理の内容では無いということですよね?
そこでさらに、イテレータ宣言や、多重for文を削除して
本当に空っぽにすると↓ 遅延がまったく無くなるのです。。。
これは、どういうことでしょう???
オブジェクトlistに入ってる数が問題ならば
衝突判定処理だけで無く、オブジェクトlist更新処理なども
増加に比例し、時間がかかってくるはずです。
しかし衝突判定関数以外はすべて正常時間です。
また、衝突判定処理の内容が問題で
オブジェクトが増加とともに遅延が発生するなら
そのhitcase関数の中でイテレータ宣言と多重for文を残していようが
その中の衝突処理を削除すれば遅延は起きないはずです。
なのにオブジェクトが増えると遅延が起きます。
hitcase関数をコメントアウトするか、
hitcase関数内の全処理をコメントアウトすると
遅延はまったく発生しません。
つまり、犯人はこの部分です。
↓これはそんなに遅延を誘発するような処理なのでしょうか???