トップページ > 記事閲覧
144Hz Monitor Problem
名前:GEMA 日時: 2016/06/27 19:40

Hello, sorry about the English. I have trouble to limit the game FPS to 60 when using a monitor with high refresh rate (e.g. 75, 144) I used these functions but the game still running too fast. Is there something I missed? Thanks! SetGraphMode( 1280 , 720 , 16 , 60 ) ; SetWaitVSyncFlag(true); The basic main loop is like this : int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { SetGraphMode( 1280 , 720 , 16 , 60 ) ; SetWaitVSyncFlag(true); if( DxLib_Init() == -1 ) return -1 ; GameLoop(); DxLib_End() ; return 0 ; } よろしくお願いします。
メンテ

Page: 1 |

Re: 144Hz Monitor Problem ( No.1 )
名前:管理人 日時:2016/06/29 01:08

指定の RefreshRate にディスプレイが対応していない場合や、ウインドウモードの場合は SetGraphMode の RefreshRate は正常に機能しませんので、起動後に計測して、希望するリフレッシュレートではなかった場合は タイマーで同期を取るようにしてください m(_ _)m // リフレッシュレートが希望する値かチェックして、適合しなかった場合はタイマー同期にするサンプルプログラムです #include "DxLib.h" #define FPS (60) #define FRAME_TIME (1000000 / FPS) #define LOOP_COUNT (30) #define CHECK_COUNT (6) #define RANGE (500) int UseTimerSync ; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { LONGLONG Time ; LONGLONG OldTime ; int x ; int add ; SetGraphMode( 1280, 720, 16, 60 ) ; SetWaitVSyncFlag( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // ScreenFlip の同期に任せられるかチェックする { int i ; int Count ; ScreenFlip() ; Time = GetNowHiPerformanceCount() ; UseTimerSync = TRUE ; Count = 0 ; for( i = 0 ; i < LOOP_COUNT ; i ++ ) { ScreenFlip() ; OldTime = Time; Time = GetNowHiPerformanceCount() ; // 1回の ScreenFlip の時間が希望する時間かを調べる if( Time - OldTime > FRAME_TIME - RANGE && Time - OldTime < FRAME_TIME + RANGE ) { Count ++ ; // 何回か希望の時間が計測されたら VSYNC を信用する if( Count == CHECK_COUNT ) { UseTimerSync = FALSE ; break ; } } } } // メインループ x = 0 ; add = 8 ; while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; x += add ; if( x < 0 || x > 640 ) { add = -add ; } DrawBox( x, 32, x + 64, 32 + 64, GetColor( 255,255,255 ), TRUE ) ; DrawFormatString( 0, 0, GetColor( 255,255,255 ), "UseTimerSync:%d", UseTimerSync ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; // タイマー同期の場合はここで待つ if( UseTimerSync ) { OldTime = Time ; Time = GetNowHiPerformanceCount() ; // 3ms 以上待つ場合はここで纏めて待つ if( Time - OldTime < FRAME_TIME - 3000 ) { Sleep( ( DWORD )( ( ( FRAME_TIME - 3000 ) - ( Time - OldTime ) ) / 1000 ) ) ; } // 3ms 以下の分は正確に待つ Time = GetNowHiPerformanceCount() ; while( Time - OldTime < FRAME_TIME ) { Sleep( 0 ) ; Time = GetNowHiPerformanceCount() ; } } } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: 144Hz Monitor Problem ( No.2 )
名前:GEMA 日時:2016/08/17 23:38

Thanks a lot! ありがとう! I have another problem. Is it possible to launch the game in other monitor? Windowed and Fullscreen always appear in the first monitor. Thanks
メンテ
Re: 144Hz Monitor Problem ( No.3 )
名前:管理人 日時:2016/08/18 00:41

こちらの関数でモニターの番号を指定することができます // DXライブラリのウインドウを表示するディスプレイデバイスを設定する int SetUseDisplayIndex( int Index ) ; ただ、比較的最近追加した関数なので、もしお使いのDXライブラリのバージョンに SetUseDisplayIndex が無い場合は、こちらの最新バージョンをお使いください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存