指定の 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 ;
}