DXライブラリについて、ScreenFlip()関数の動作が非常に遅いのですが・・・

DXライブラリについて、ScreenFlip()関数の動作が非常に遅いのですが・・・ 今までDirectXを使ってゲームプログラムをしていたのですが、音楽の再生などが難しいため、そのあたりがとても簡単なDXライブラリを使ってみようと思い、ためしに作ったゲームを移植してみました。 しかし、どうも動きが遅くなってしまい、いろいろと数値をいじりながら見ていると「画面のちらつきを抑えるために裏画面に描画し、それを表画面に移す」という処理が重いのだということがわかりました。 その関数がScreenFlip()という関数なのですが、これの動作が標準のフレーム(1/60秒)を超えているようなのです。 このプログラムを軽くする方法はないのでしょうか? それともDXライブラリを使う場合、この重さは仕方ないのでしょうか・・・ 詳しい方、教えていただけないでしょうか。

補足

次のコードを作り、ブレークポイントを使って変数を確認したところ、ScreenFilpにかかる時間はウィンドウモードで27~32ミリ秒、フルスクリーンモードで17~23ミリ秒となりました。 int timer,flip; timer = GetNowCount(); ScreenFlip(); flip = GetNowCount()-timer; 1/60秒が16~17ミリ秒だということを考えると、やはり問題がある速度です。 パソコンの性能は十分なもの(CPU:Core i7、メモリ:4GB)であるはずなのですが…

リズム、音楽ゲーム3,543閲覧xmlns="http://www.w3.org/2000/svg">50

ベストアンサー

0

【補足回答】 >次のコードを作り、ブレークポイントを使って変数を確認したところ、ScreenFilpにかかる時間はウィンドウモードで27~32ミリ秒、フルスクリーンモードで17~23ミリ秒となりました。 ブレークだと同期の関係で不正確なので、PrintDXなどで表示するようにしてくださいね。 GPUの描画する処理が重い場合は、ScreenFilp内で描画の終了を待つので時間がかかる場合があります。 例えば、DrawGraph()とかの命令は実際に描画するのではなく描画を予約しているだけで、次のフレームにGPUが実際に描画します。 あと、ScreenFlip()はデフォルトで垂直同期(液晶なら一般的に1/60秒周期)を待つ設定です。 なので、ScreenFlipのタイミングは1/60秒の倍数となります。 もし、ScreenFlip()自体に問題があるなら、切り替えはSetWaitVSyncFlag(FALSE);で出来ます。これで試してみてください. ※ 同期は待ったほうが良いで、あくまで実験と言う事で。 DirectXのバージョンや、ビデオカードのドライバ、DXライブラリのバージョン等の相性問題が起こる場合もありますので、そちらも再確認してみてください。 それでもDXライブラリに問題がありそうなら、こちらで質問してもらうとDXライブラリの作者の方に解決してもらえると思います。 「DXライブラリ質問掲示板」 http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi? 【最初の回答】 sxigumaさん。 なにか使い方が間違っているのでは無いでしょうか? DXライブラリで1/60の速度が出ているゲームは沢山あります。 LoadGraphScreen()とかを使ってしまうとか、メッセージループ中にLoadGraphがあれば確実に遅くなります。 ScreenFlip()前後で時間を計測して、本当にScreenFlip()で時間がかかっているか確認してみてください。

ThanksImg質問者からのお礼コメント

なるほど、同期しているのですか・・・ 色々教えてくださってありがとうございます。ただまだうまく動かないようで・・・ただ別の理由がわかってきたので、そっちでもう一度対策を考えてみようと思います。 親身になってアドバイスしていただきありがとうございました!

お礼日時:2011/2/28 17:23