• ベストアンサー

プログラムの『軽い』と『重い』について

C++でDirectXを使用したゲームプログラミングしているのですが、 どうもプログラミングの組み方が悪いのか動作が重く、うまく動いてくれません。 そこでいまさらかもしれませんが、プログラミングにおいて『重い』や『軽い』というのはどのような書き方なのでしょうか? 例えば、 「for文やwhile文などのループ系は重い」、 「windowsプログラミングのtimeGetTime関数などの時間を扱う関数は重い」 などはよく耳にするのですが、そういう情報はどこから手に入れるのでしょうか? わかる方いたら教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BearCave
  • ベストアンサー率20% (189/909)
回答No.2

「ループ系は重い」といった単純な問題ではなく、あくまでもアルゴリズムの効率化の問題ですので、その可能性は無限にあります。ゲーム系ならば描画、当たり判定、AIなどが最も処理が重い部分ですので、この辺を見直すのが良いのでは。 描画は、ポリゴン数は多すぎないか、グラフィックカードの機能をちゃんと使っているか、などをチェックしましょう。壁の反対側にいるキャラクターを描く必要はないですし、遠くにいて小さくなってるモデルはポリゴンの少ない簡易モデルに切り替えたりしてスピードアップをはかれます。 当たり判定も、まずは大きな球体でチェックしてそれが当たっていればさらに細かくチェックする、別の部屋にいるキャラクターは完全に無視する、といった処理の効率化が必要です。

ikippe
質問者

お礼

回答ありがとうございます。 >ゲーム系ならば描画、当たり判定、AIなどが最も処理が重い部分ですので、この辺を見直すのが良いのでは。 その当たりをもう一度見直してみます。

その他の回答 (2)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

ゲームプログラミングに限らない話ですが、条件の成立を待つのにビジーウェイトするようなループを書くと「重い」プログラムを簡単に作れてしまいます。 たとえば、スレッドAがあるフラグをセットするのをスレッドBが待つというプログラムの場合、スレッドBで while (flag.isSet() == false) { /* flagがセットされるまでただひたすらループしながら待つ */ } というようなコードを 書いてはいけません。スレッドBのこのループを実行するのにCPU時間を食われてしまい、フラグの値を変化させる側であるスレッドAの実行がなかなか進まなくなります。

ikippe
質問者

お礼

回答ありがとうございます。 なるほど。確かにそれは勿体無いです。 参考にさせていただきます。

回答No.1

クロック数的なことはわからないけれど 最近の傾向としては処理量を見積もらずに適当に書いたコーディングが遅い傾向がありますね。 基本的に重いといわれている関数でもネイティブに処理するものであれば 対して気になる世界ではないです。 そんなことよりも、ファイルクローズやループないでなくてもできることをループないでやるとか。 あとは、排他ロックこの辺りがプログラムの実行を遅くする理由ではないですかね。 DirectXだと、DirectPlayがなんか変な動きしているので あそこの処理を見直すと軽くなるかもしれません

ikippe
質問者

お礼

回答ありがとうございます。 >あとは、排他ロックこの辺りがプログラムの実行を遅くする理由ではないですかね。 そこは気にしてなかったのでもう一度プログラムを見直して見ます。

関連するQ&A

  • C言語のプログラムについて

    C言語のプログラムについて 3桁の自然数の中で、自分自身を含めた約数が奇数になるものがいくつあるかを求めるプログラムを作りたいのですが、swich文を使って、6通りの方法で出そうとしていまして、 while 文、 for文、 do while文に加え、 for文のを、1つの関数として独立させたもの、 さらに、for文のを重ループ部分のそれぞれのループに対応して、2つの関数として独立させたもの、 そして、この2つの関数のどちらともをループを用いずに再帰呼び出しを用いたもの の6通りで出したいのですが、swich文を使うところは自力でできたのですが、あとの6つそれぞれのプログラムの組み方がわかりません。 教えていただけないでしょうか?ややこしい書き方をしてすいません・・・。

  • c言語プログラミングでの質問?です。

    学校でc言語プログラミングを使って簡単なゲームを作りなさい。 という課題が出ました。 下記の条件に沿って作れとのことです。 なかなかいいアイデアが浮かばないんですが、なにかちょうどいいものないですかね? ・scanf文を使うこと。。 ・if文を使うこと。 ・for文(while文)を使うこと。 ・rand関数を使うこと。 ・自分で定義した関数を使うこと。 ・配列または文字列を使うこと。

  • 流れ図からプログラムに直してください!【C言語】

    その流れ図をC言語のプログラムに直してくれませんか? 処理2はscanf(..);って感じの内容です。 入口 処理1 for(処理2; 判断; 処理4){ 処理3 } 出口 って感じかなって思ったんですが、for文の中にscanfの文を入れてもいいのかわからずに悩んでます。 ループ文なのでwhile文、for文、do..while文のどれかかな?って思ったんですが違う気もして、わかるかたいらっしゃいませんか?

  • CreateWindow関数について

    現在C++でプログラミングをしています。 CreateWindow関数をforループで回してボタンを複数作ろうとしているのですが、 ループ上でCreateWindow関数の第2引数(ウィンドウ名)をa,b,c,d…のように一つ一つ変えることはできないのでしょうか? ご指導よろしくお願いします。

  • 無限ループとループ文

    プログラミングにおいて while文、for文、foreach文などループ文は種類がありますが 無限ループに繋がってしまう恐れが高い順などは存在しますか? どのループ文もミスなく慎重に 正確な書き方さえしていれば無限ループは起きないと思いますが もしそのような順が存在するのであれば、わからないので教えて頂きたいです。

  • ループについて

     アンケート的な質問ですが、forの無限ループと、whileの無限ループが、C言語にはありますよね?  whileの場合は、while(1)と書きますし、問題ないですが、 forの場合は、for(;;)とかきますよね。  forの無限ループって、顔文字の涙にみえないですか? for文の無限ループって、何が悲しかったのでしょうか? 答えられる方、こたえてください。

  • DirectXとOpenGLはどちらが動作が軽い?

    環境:Visual Studio 2005 WinXP Win32 C/C++ Windowsプログラミングを一通り勉強したので、 次は3Dプログラミングに挑戦したいと思っています。 DirectXとOpenGL、どちらを学習しようか決めかねています。 最終的にはとても軽く動作する3Dゲームを作りたいです。 そこで、たとえばまったく同じ動作をする DirectXの3Dゲームと、OpenGLの3Dゲームがある場合、 どちらのほうが動作が軽いのでしょうか。 ここでいう「動作が軽い」というのは、 そのゲームが使用するメモリ量、CPU量などが低く動作が快適なものです。 メールソフトやブラウザを同時に起動しても気にならない ほど軽いものが作りたいと思っています。

  • perl:ループのカウンタ変数の値を保持したい。

    While文のループのなかにfor文でループをまわしているスクリプトなのですが、 forの中でカウンタ変数をつくり、ループ回数を計測しております。 またforの中である条件を満たした際に、lastでforを抜け、引き続きWhileのループを継続するという処理をしております。 $i=0; While(○○){ 処理1    for(××){ 処理2 $i++;      if($i >=100){  処理3       last; } } } ここで、一度for文のif文で一度forループを抜け、Whileでループをし、またforループに突入した際に、前回forループでカウントした$iの値を保持したまま、そのつづきから$iのカウンタを動作させたいのですが、$iの値はforループを抜けるとリセットしてしまいます。 このような場合、どうすれば$iの値を保持できますでしょうか。 お詳しい方、宜しくお願い致します。 ※ネストがうまく表現できず、みずらくてスミマセン。

    • ベストアンサー
    • Perl
  • DirectX&Win32API&C++ ドライブ情報の取得方法について

    Windowsプログラム(Win32API)と、DirectX9(2007January)と、C++を使用してゲームを制作しています。 ですがDirectXは環境によっては動作しないものも多く、 どんな環境では動かないかというのもを手軽に調べるために ゲーム起動前にドライブ情報を表示するようにしたいのです。 (例えば、グラフィックボードだとか、VRAMや、HDD容量や  メインメモリの容量など、DirectX診断ツールのようなもの) それを調べる関数が有りそうな気もしたのですが、 C#やJavaだといくつかありましたが意外と見つからず、 (調べ方が悪いだけかもしれませんが)難儀しています。 もしドライブ情報の取得方法をご存知の方がいらっしゃいましたら どうかアドバイスをお願い致します。

  • メッセージループを調べすぎてCPU使用率が100%にならないのはどうしてですか?

    WINDOWSプログラミングでは、WinMainでメッセージループをつくりますが、一般にこのようなwhile文をコンピュータが一生懸命グルグルまわしたりしてCPU使用率が100%になったりしないのはどうしてですか。 入力が大してないときに、無駄にメッセージループをまわらせるのが悪いような気がします。

専門家に質問してみよう