とりあえず抽象クラスのポインタをstd::listにぶち込んでタスクシステム風にしてみる
↓
1000個でFPS28wwwww
↓
コンパイラの設定を変えてみる
↓
1000個でFPS58
↓
ソート用の評価関数をinlineにしてみる
↓
1600個でFPS53
これ以上軽く出来る方法無いのかな…(´・ω・`)
std::listを出来るだけ軽く
RE: std::listを出来るだけ軽く
コンパイラの設定し直したら3000個でFPS60出ました( ;⊙´◞౪◟`⊙)夢幻ノ月夜 さんが書きました:とりあえず抽象クラスのポインタをstd::listにぶち込んでタスクシステム風にしてみる
↓
1000個でFPS28wwwww
↓
コンパイラの設定を変えてみる
↓
1000個でFPS58
↓
ソート用の評価関数をinlineにしてみる
↓
1600個でFPS53
これ以上軽く出来る方法無いのかな…(´・ω・`)
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
Re: std::listを出来るだけ軽く
std::listは使い方を間違わなければ十分高速なので、それで速度がでないなら、設計に原因があるのだと思います。
普通ゲームプログラムは描画以外にはほとんど処理時間を食いません。
9割がた処理時間は描画時間だと思った方がいいでしょう。
そこに描画以外の処理時間が食い込んでいるのであれば設計がまずい可能性が高いです。
とりあえず測定するときコンパイルオプションでDebugからReleaseにしていますか?
普通ゲームプログラムは描画以外にはほとんど処理時間を食いません。
9割がた処理時間は描画時間だと思った方がいいでしょう。
そこに描画以外の処理時間が食い込んでいるのであれば設計がまずい可能性が高いです。
とりあえず測定するときコンパイルオプションでDebugからReleaseにしていますか?
Re: std::listを出来るだけ軽く
Releaseの設定の中からSTLの実行速度に関係ありそうな部分だけDebugに持ってきてみましたDixq (管理人) さんが書きました:std::listは使い方を間違わなければ十分高速なので、それで速度がでないなら、設計に原因があるのだと思います。
普通ゲームプログラムは描画以外にはほとんど処理時間を食いません。
9割がた処理時間は描画時間だと思った方がいいでしょう。
そこに描画以外の処理時間が食い込んでいるのであれば設計がまずい可能性が高いです。
とりあえず測定するときコンパイルオプションでDebugからReleaseにしていますか?
すると3000個でFPS60が
Re: std::listを出来るだけ軽く
仮にvectorにしてみたらどうなりますか?
意味的に(挿入削除の位置や頻度的に)dequeやlistだろうと思う状況でも
vectorにしたらそっちの方が遥かに早かったという経験がわりとあります.
要素数が何個くらいで逆転(?)するのかわかりませんが,
例えば「個数少ないならバブルソートでいいじゃん」的な話があるように
データ構造についても個数次第ではvectorにするという選択もあると思います.
意味的に(挿入削除の位置や頻度的に)dequeやlistだろうと思う状況でも
vectorにしたらそっちの方が遥かに早かったという経験がわりとあります.
要素数が何個くらいで逆転(?)するのかわかりませんが,
例えば「個数少ないならバブルソートでいいじゃん」的な話があるように
データ構造についても個数次第ではvectorにするという選択もあると思います.
Re: std::listを出来るだけ軽く
シーケンスコンテナって,そもそもとりあえずstd::vectorで,それで問題が出たらstd::dequeやstd::list使う,という認識だったりしますが……。
# Effective STLは遠くなりにけり。
# Effective STLは遠くなりにけり。
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
Re: std::listを出来るだけ軽く
> Releaseの設定の中からSTLの実行速度に関係ありそうな部分だけDebugに持ってきてみました
??
意味がよく分かりません。
コンパイル設定はどっちなんですか?
??
意味がよく分かりません。
コンパイル設定はどっちなんですか?
- Hiragi(GKUTH)
- 記事: 167
- 登録日時: 14年前
Re: std::listを出来るだけ軽く
それにしてもVisual Studioのデバッガって高性能だけど
超超超激遅ですよね...10倍ぐらい遅いんじゃないかあれ
つまりDebugビルドならReleaseビルドにして最適化を実行速度最大化にしたら10倍早くなるんじゃねということ
Releaseビルドなのにその速度なら相当無駄な事してそう...
とりあえずprintfDxとGetNowCountなりで色々時間計測して見たりをおすすめします
printfDx便利すぎる
超超超激遅ですよね...10倍ぐらい遅いんじゃないかあれ
つまりDebugビルドならReleaseビルドにして最適化を実行速度最大化にしたら10倍早くなるんじゃねということ
Releaseビルドなのにその速度なら相当無駄な事してそう...
とりあえずprintfDxとGetNowCountなりで色々時間計測して見たりをおすすめします
printfDx便利すぎる
最後に編集したユーザー Hiragi(GKUTH) on 2016年4月13日(水) 21:39 [ 編集 2 回目 ]
Re: std::listを出来るだけ軽く
DebugでやってましたがReleaseにしてみたら18000個でも処理落ちほぼ0でしたDixq (管理人) さんが書きました:> Releaseの設定の中からSTLの実行速度に関係ありそうな部分だけDebugに持ってきてみました
??
意味がよく分かりません。
コンパイル設定はどっちなんですか?
Re: std::listを出来るだけ軽く
Debugビルドは,Debug用に最適化処理はされないですし,標準ライブラリも状態を細かくチェックをしています。Hiragi(GKUTH) さんが書きました:それにしてもVisual Studioのデバッガって高性能だけど
超超超激遅ですよね...10倍ぐらい遅いんじゃないかあれ
つまりDebugビルドならReleaseビルドにして最適化を実行速度最大化にしたら10倍早くなるんじゃねということ
例えば,コンパイラ側では,default-initializeされたプリミティブな型のオブジェクトは0xCDを全バイトに埋め込みます。
また,バッファオーバーフローを検出するために,mallocされたりした領域にさらに0xCCが埋め込まれた領域を用意しますし,解放時にその領域の値が変化していないかチェックします。
ライブラリだと,例えばstd::vector::iteratorの逆参照1つでも,有効な範囲内かどうかを調べています。
# VS2015Upd2のvectorだと64行目から。
これらはReleaseビルドではまったく行われません。
std::vector::iteratorの逆参照は,*_Ptrと,ポインタの逆参照そのものと最終的に同等になります。
一応Releaseビルドでもデバッガをアタッチできますが,Debugビルドに比べて非常にデバッグがしにくくなるかと。
そもそも,デバッグ時に速度が遅いと困るアプリケーションは特殊なので,デバッグ時にバグを見つけやすいことに重点を置いた構造になっているかと。
Re: std::listを出来るだけ軽く
じゃあデバッグモード(処理落ち)前提で避ける弾幕をお遊びで用意してみましょうかねYuO さんが書きました:Debugビルドは,Debug用に最適化処理はされないですし,標準ライブラリも状態を細かくチェックをしています。Hiragi(GKUTH) さんが書きました:それにしてもVisual Studioのデバッガって高性能だけど
超超超激遅ですよね...10倍ぐらい遅いんじゃないかあれ
つまりDebugビルドならReleaseビルドにして最適化を実行速度最大化にしたら10倍早くなるんじゃねということ
例えば,コンパイラ側では,default-initializeされたプリミティブな型のオブジェクトは0xCDを全バイトに埋め込みます。
また,バッファオーバーフローを検出するために,mallocされたりした領域にさらに0xCCが埋め込まれた領域を用意しますし,解放時にその領域の値が変化していないかチェックします。
ライブラリだと,例えばstd::vector::iteratorの逆参照1つでも,有効な範囲内かどうかを調べています。
# VS2015Upd2のvectorだと64行目から。
これらはReleaseビルドではまったく行われません。
std::vector::iteratorの逆参照は,*_Ptrと,ポインタの逆参照そのものと最終的に同等になります。
一応Releaseビルドでもデバッガをアタッチできますが,Debugビルドに比べて非常にデバッグがしにくくなるかと。
そもそも,デバッグ時に速度が遅いと困るアプリケーションは特殊なので,デバッグ時にバグを見つけやすいことに重点を置いた構造になっているかと。