描画だなあやっぱ
弾情報の受け渡しでvectorにpush、popするやり方を固定配列にしようと思ってたのを完全に忘れてた。
そこで実験。
描画を背景だけにして、1000万の弾情報要素を出し入れするのにかかる時間を測定。
手法は次の4種類。
1.静的に確保した固定配列
CBulletInfo list[10000000]; int pointer = 0; CBulletInfo b; for(int i=0; i<10000000; i++){ list[pointer++] = b; } while(pointer > 0){ pointer--; }
2.動的に確保した固定配列
CBulletInfo list = new CBulletInfo[10000000]; int pointer = 0; CBulletInfo b; for(int i=0; i<10000000; i++){ list[pointer++] = b; } while(pointer > 0){ pointer--; }
vector<CBulletInfo> list(10000000, CBulletInfo()); int pointer = 0; CBulletInfo b; for(int i=0; i<10000000; i++){ list[pointer++] = b; } while(pointer > 0){ pointer--; }
4.vectorでpushとpop
vector<CBulletInfo> list; CBulletInfo b; for(int i=0; i<10000000; i++){ list.push_back(b); } while(!list.empty()){ list.pop_back(); }
環境。
Core2Duo E8400 3GHz
結果。
手法 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
時間[ms] | 120 | 210 | 169 | 182 |
予想した通りに静的に確保した固定配列が最も速かった。vectorはいったん最大量突っ込んでしまうと、popしても内部では領域を解放しないためか大してオーバーヘッドはないようだ。動的に確保した固定配列が一番遅いってのはそういうもんなのか。
しかし実際のところこれでFPSが60を切るのは100万要素くらいからだが、弾の描画ありだと4000要素くらいで切ってしまう。つまり描画が圧倒的にボトルネックになっているので、正直どの方法を使ってもよさそうではある。
追記
肝心なことを書くのを忘れていた。
上の実験結果は数十回ループしたときの2回目以降の平均を取っていて、1回目はちょっと違った結果になっているのだ。
ということで1回目だけの結果。
手法 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
時間[ms] | 151 | 266 | 174 | 654 |
vectorはいったん最大量突っ込んでしまうと、popしても内部では領域を解放しないためか大してオーバーヘッドはないようだ。
と書いたように、4の方法では最初に最大量突っ込むときは領域の解放と再確保が繰り返されるので遅い。