トップページ > 過去ログ > 記事閲覧
ScreenFlipについて
名前:バッソ 日時: 2008/04/26 16:56

いつもお世話になります。 つかぬ事かもしれませんが、ちょっと判らない事がありますので質問させてください。 現在製作中のプログラムで、最初にScreenFlipを利用してCRTのリフレッシュレートを大雑把に調べ、 ゲーム中のスピード調整をするようにしています。 今までは何の問題もなかったのですが、 ちょっと古い型のノートパソコンを手に入れたのでそれでも動作確認をしてみましたところ、 スピード調整がまったく利かず、随分と早くなってしまいました。 そのノートパソコン(WindowsXP)の画面のプロパティの設定で モニタのリフレッシュレートを60になっているのに、です。 そこでサンプルプログラム(後述)を作ってみて実行していたところ、 FPSが100〜500とか大きい数値になり、しかも実行するたびに数値の範囲が変ります。 ScreenFlipで垂直信号同期待ちがされていないのか、 あるいはノートPCのリフレッシュレートがなぜか勝手に変わってしまっているか、 くらいしか想像がつかないのですが、 なにが原因か、おわかりになる方はいらっしゃいませんでしょうか? よろしくお願いいたします。 テストに使用したプログラムは以下のとおりです。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int i = 0 ; LONGLONG old_time = 0 ; LONGLONG now_time = 0 ; int old_fps_cnt = 0 ; int fps_cnt = 0 ; // 画面モードのセット SetGraphMode( 640 , 480 , 16 ) ; if(DxLib_Init()==-1)return -1; SetDrawScreen(DX_SCREEN_BACK); old_time = GetNowHiPerformanceCount() ; now_time = old_time ; while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { fps_cnt++ ; if ( old_time + 1000000 < GetNowHiPerformanceCount() ) { old_fps_cnt = fps_cnt ; fps_cnt = 0 ; old_time = GetNowHiPerformanceCount() ; } ClearDrawScreen() ; DrawFormatString( 0, 0, GetColor(255,255,255) , "%d:%d ", fps_cnt , old_fps_cnt ) ; ScreenFlip(); } WaitKey() ; DxLib_End(); return 0; }

Page: 1 |

Re: ScreenFlipについて ( No.1 )
名前:管理人 日時:2008/05/02 00:26

私の環境では正常に表示(約60)されましたが、ドライバの設定で垂直同期待ちを OFFにすることもできますので、ScreenFlip で必ず垂直同期待ちがされると 期待しないほうが良いかもしれません。
Re: ScreenFlipについて ( No.2 )
名前:バッソ 日時:2008/05/03 01:21

回答ありがとうございます。 >ScreenFlip で必ず垂直同期待ちがされると >期待しないほうが良いかもしれません。 なるほど。 とするとやはり時間を測って、適切なウェイトをはさむなどして 一定のゲームスピードを保つのが一般的なやり方なのでしょうか。 ティアリングが心配ですが……。 DXライブラリを使っていらっしゃる他の方々や、どうなさってるんでしょう。 とりあえず、FPSチェック時にあまりに早すぎる場合は それ相応のウェイトをかけるようにする方向で考えてみます。 ありがとうございました。
Re: ScreenFlipについて ( No.3 )
名前:bNmr 日時:2008/05/03 18:43

ウェイトで調整するのではなく キーフレームでゲームスピードを調整しています。
Re: ScreenFlipについて ( No.4 )
名前:管理人 日時:2008/05/06 23:40

デフォルトでは GetNowCount を使用したタイマー同期にしておいて、オプション設定等で ScreenFlip で垂直同期を取るようにするのが良いかもしれません。 (その場合は ScreenFlip一回当たりに何ミリ秒経過しているかを GetNowCount で取得して、 自分が望むFPSの1フレーム辺りの時間(例えば60FPSの場合は 16 又は 17)ではない場合は 垂直同期待ちがONになっていても垂直同期をしない、等の処理を入れる必要があります)

Page: 1 |