トップページ > 過去ログ > 記事閲覧
VSyncと61FPS
名前:Saucer 日時: 2012/11/29 17:34

はじめまして。一応外国のものですので、日本語が間違っていたら申し訳ありません。 ある掲示板でDXライブラリの話を聞きまして、大変使いやすいライブラリを提供していただいていることを有難く存じます。 ただし、矩形を左右に動かし、FPSを表示するテストプログラムを作ってみたところ、あるデスクトップPC(OSはWindows 7)でプログラムを起動してみますと、モニターのリフレッシュレートは60FPSと書いてあるのに、プログラム内で表示されるFPSが61、というバグ?見たいなものを発見しました。3台ほど、他のPCで試してみましたが、普通に60FPSと表示されていました。 その原因がモニターや、DXライブラリのScreenFlip関数時のVSync機能等にあるのかわからないのですが、どうかアドバイスをお願いいたします。よろしくお願いします。

Page: 1 |

Re: VSyncと61FPS ( No.1 )
名前:Saucer 日時:2012/11/29 18:03

(あっ、実は他のPCを3台ではなく4台試しまして、そのうち1台は30FPSだったと思います。多分原因は処理落ちではないかと思います。)
Re: VSyncと61FPS ( No.2 )
名前:管理人 日時:2012/12/02 04:54

私もFPSを表示するプログラムを作ってみました #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int x, add ; LONGLONG time ; LONGLONG nowtime ; float fps ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ(何かキーが押されたらループを抜ける) x = 0 ; add = 8 ; ScreenFlip() ; time = GetNowHiPerformanceCount() ; fps = 0.0f ; while( ProcessMessage() == 0 ) { // 移動 x += add; if( x < 0 || x > 640 ) add = -add ; // 画面のクリア ClearDrawScreen() ; // ボックスの描画 DrawBox( x, 0, x + 64, 64, GetColor( 0,255,0 ), TRUE ) ; // FPSの描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "FPS:%.3f", fps ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; // FPS計算処理 nowtime = GetNowHiPerformanceCount() ; fps = 1000000.0f / ( nowtime - time ) ; time = nowtime ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 実行してみると分かりますが、59.456f の値が表示されることもあれば 60.167f の値が表示されることもあります、 DirectXでは正確にVSync直後に時間を計測することができませんので、このような値の誤差が発生します PCの性能や構成によって誤差の大きさも変化すると思いますので、FPSが61と計測されても特に不思議ではないと思います 30FPSと表示されるのは、仰られている通り処理落ちだと思います
Re: VSyncと61FPS ( No.3 )
名前:Saucer 日時:2012/12/02 14:40

なるほど、お忙しい中、大変丁寧に教えていただきまして真にありがとうございます。 いろいろと勉強になりました。 もうすこし、質問させていただいてよろしいでしょうか。 まず、プログラム内での移動速度を一定にする最良の手段というのは、 サンプルプログラムのページに書いてあるように、ひたすら待つことでしょうか。 やはり、これを試してみたところ、画像がぶれる場合があります (ぶれない場合も割りと多いのですが) あと、DXライブラリには、直接モニターのリフレッシュレートを調べる関数はあるのでしょうか。 待たなければ画像がぶれない場合が多いようなので、 もしそういう関数があれば「モニターのリフレッシュレートが60であるなら、 待たずに、タイミングを全てVSyncに任せる」という手段をとってみたいのですが。 どうか再びアドバイスをお願いいたします。ありがとうございます。
Re: VSyncと61FPS ( No.4 )
名前:管理人 日時:2012/12/02 14:53

仰られる通り「モニターのリフレッシュレートが60であるならVSyncに任せる」 というのが最良だと思います ただ、OSから直接モニターのリフレッシュレートを取得しようとすると 誤った値が返ってきたり、「既定値」として0が返ってきたりする環境もあるので あまり信用できません なので私はScreenFlip間の時間をGetNowHiPerformanceCountで何十回か計測して、 16666前後の値に収まっていればリフレッシュレートが60であると判断しています
Re: VSyncと61FPS ( No.5 )
名前:Saucer 日時:2012/12/02 16:33

なるほど。ではその手段でいってみようと思います。 実は、長い間グラフィックのぶれに悩まされていたので、DXライブラリの話を聞き、 やっと画像をきれいに表示できるようになって嬉しいです。 大変親切にしていただきまして、まことにありがとうございます。 これからもどうぞよろしくお願いいたします。
Re: VSyncと61FPS ( No.6 )
名前:Saucer(解決ずみ) 日時:2012/12/03 18:15

解決済みだと表示していませんでした、すみません。

Page: 1 |