- ベストアンサー
プログラムの『軽い』と『重い』について
C++でDirectXを使用したゲームプログラミングしているのですが、 どうもプログラミングの組み方が悪いのか動作が重く、うまく動いてくれません。 そこでいまさらかもしれませんが、プログラミングにおいて『重い』や『軽い』というのはどのような書き方なのでしょうか? 例えば、 「for文やwhile文などのループ系は重い」、 「windowsプログラミングのtimeGetTime関数などの時間を扱う関数は重い」 などはよく耳にするのですが、そういう情報はどこから手に入れるのでしょうか? わかる方いたら教えてください。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「ループ系は重い」といった単純な問題ではなく、あくまでもアルゴリズムの効率化の問題ですので、その可能性は無限にあります。ゲーム系ならば描画、当たり判定、AIなどが最も処理が重い部分ですので、この辺を見直すのが良いのでは。 描画は、ポリゴン数は多すぎないか、グラフィックカードの機能をちゃんと使っているか、などをチェックしましょう。壁の反対側にいるキャラクターを描く必要はないですし、遠くにいて小さくなってるモデルはポリゴンの少ない簡易モデルに切り替えたりしてスピードアップをはかれます。 当たり判定も、まずは大きな球体でチェックしてそれが当たっていればさらに細かくチェックする、別の部屋にいるキャラクターは完全に無視する、といった処理の効率化が必要です。
その他の回答 (2)
- salsberry
- ベストアンサー率69% (495/711)
ゲームプログラミングに限らない話ですが、条件の成立を待つのにビジーウェイトするようなループを書くと「重い」プログラムを簡単に作れてしまいます。 たとえば、スレッドAがあるフラグをセットするのをスレッドBが待つというプログラムの場合、スレッドBで while (flag.isSet() == false) { /* flagがセットされるまでただひたすらループしながら待つ */ } というようなコードを 書いてはいけません。スレッドBのこのループを実行するのにCPU時間を食われてしまい、フラグの値を変化させる側であるスレッドAの実行がなかなか進まなくなります。
お礼
回答ありがとうございます。 なるほど。確かにそれは勿体無いです。 参考にさせていただきます。
- tsuduki123
- ベストアンサー率32% (21/65)
クロック数的なことはわからないけれど 最近の傾向としては処理量を見積もらずに適当に書いたコーディングが遅い傾向がありますね。 基本的に重いといわれている関数でもネイティブに処理するものであれば 対して気になる世界ではないです。 そんなことよりも、ファイルクローズやループないでなくてもできることをループないでやるとか。 あとは、排他ロックこの辺りがプログラムの実行を遅くする理由ではないですかね。 DirectXだと、DirectPlayがなんか変な動きしているので あそこの処理を見直すと軽くなるかもしれません
お礼
回答ありがとうございます。 >あとは、排他ロックこの辺りがプログラムの実行を遅くする理由ではないですかね。 そこは気にしてなかったのでもう一度プログラムを見直して見ます。
お礼
回答ありがとうございます。 >ゲーム系ならば描画、当たり判定、AIなどが最も処理が重い部分ですので、この辺を見直すのが良いのでは。 その当たりをもう一度見直してみます。