トップページ > 過去ログ > 記事閲覧
CPU使用率を抑えるには・・
名前:犬福 日時: 2007/07/08 20:14

こんばんは、お久しぶりです。 DXライブラリとは直接関係無い質問かもしれませんが、ちょっとご意見を伺いたいなと思います。 まず、DXライブラリを使用してプログラムを作ると基本以下のようなプログラムになると思います。 while(ProcessMessage() == 0){ PutScreen(); // 画面描画 Exec(); // ゲーム内処理 } が、これだとどうしてもCPUに負荷を与えてしまい、他のプログラムの動作に影響を与えてしまいます。 例えばユーザからの入力がない場合に最後に描画した内容を保存しておいたビットマップを表示する形で負荷を抑えたとしても負荷は半分程度にしかならないし、連続して操作された場合は全く効果が無くなってしまいます。 このあたりを効果的に解決する方法は何かないものでしょうか?

Page: 1 |

Re: CPU使用率を抑えるには・・ ( No.1 )
名前:EMIYA 日時:2007/07/09 01:28

こんばんは、EMIYAと申します。 自分も、少々修行中なので、よくはわからないのですが・・・ こうしてみてはどうでしょう? int FrameStartTime ; //60FPS固定用、時間保存用変数 SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面にセット SetWaitVSyncFlag( FALSE ) ; //垂直同期信号を待たない FrameStartTime = GetNowCount() ; //60FPS固定用、時間保存用変数を現在のカウント値にセット while( ProcessMessage() == 0 ) { ClsDrawScreen() ; //画面のクリア while( GetNowCount() - FrameStartTime < 1000 / 60 ) //1/60秒立つまで待つ { Sleep( 1 ) ; } FrameStartTime = GetNowCount() ; //現在のカウント値を保存 PutScreen() ; //画面描画 Exec() ; //ゲーム内処理 } FPSについては、ここのサンプル?かどこかにあったものですが・・・ 自分は、まだこれを試してないので効果はわかりませんが^^;
Re: CPU使用率を抑えるには・・ ( No.2 )
名前:SweetBlack 日時:2007/07/09 04:07

私も同じ事でずっと悩んでいます。 私が作ってるものは、普通の2Dゲームで ヘボいプログラミング技術でムチャな処理させてるため かなり負荷が掛かっているとは思うのですが、 PCの性能はそれなりに高いのにCPU使用率が酷いので 色々いじって調べてました。 ちなみに処理の流れは  ・キャラの操作、移動処理     ↓  ・キャラの描画処理     ↓  ・画面表示(垂直同期信号待ち) ──のループという単純なもの。 色々調べたけれども、結局 「WaitVSync命令はCPU使用率を食う?」 「ScreenFlipによる同期待ちの場合はCPU使用率は食わない?」 という程度しか解らず、ScreenFlip命令や Sleep命令でなんとかごまかすくらいの事しか できていません。 (CPU使用率60〜80%まで抑えるのがせいぜい) 何かいい方法(一般的にはどうやっているのか等)がありましたら 私もご教示いただきたいです。 犬福さんの作られているものがどのようなものかは存じませんが、 「入力がなければ画面も変わらない」という事でしたら リアルタイムゲームではないのでしょうか。 もしそうならいっそ入力がないときは画面の更新すらしなくするとか、 入力待ちの時にSleep命令を多目に入れてみるとかはどうでしょう。
Re: CPU使用率を抑えるには・・ ( No.3 )
名前:犬福 日時:2007/07/09 12:57

こんにちは! >>EMIYAさん レスありがとうございます 私も最初その方法を試してみたんですが、 イマイチ効果がありませんでした。 >>SweetBlack レスありがとうございます。 あれから色々実験して、SweetBlackさんの 最後のアドバイスみたいな方式に落ち着きつつあります。 今作っているのはさほどリアルタイム性がない ものなんですが、下記のような感じです // 次回画面更新をするかを示すフラグ bool needDraw = true; while(ProcessMessage() == 0){    // フラグがたっていれば画面を更新し、フラグをクリア  if(needDraw){   PutScreen(); // ScreenFlip();はこの関数内で やっている   needDraw = false;  }  // ユーザの入力に応じて処理をする  // キャラの座標が変わったなどし、更新が必要ならフラグをセット  Exec();  // 使用率を下げるため適度にウエイトをかませる  WaitTimer(10); } これで最大60%ほどだった使用率を 20〜30%くらいまで減らせました。 ただFPSとか完全無視なので 動きのあるゲームには向かないかもですが・・。
Re: CPU使用率を抑えるには・・ ( No.4 )
名前:憂煉 日時:2007/07/09 15:14

犬福さんはじめまして! WaitVSync();は環境によっては使わない時よりも重くなるので僕は使っていないのですが、画面更新も無くしてしまうと他のWindowが上に乗ってきた後にそのまま痕跡が残る事があるので最低毎秒二回位は更新しておいた方が無難です。フルスクリーン固定なら問題無いです。
Re: CPU使用率を抑えるには・・ ( No.5 )
名前:犬福 日時:2007/07/10 17:36

>>憂煉さん こんにちは! 確かにそうですね。 デバッグ中は他のアプリを重ねることがなかったので 気づきませんでした^^; ありがとうございます!

Page: 1 |