おかげさまで解決できました。ありがとうございました。
問題のプログラムはこんなのでした。SetWaitVSyncFlag()の行のコメントアウトすると
処理が重たくなります。
test.pngを表示して、上下左右に動かすプログラムです。ESCで終了です。
ところで、fpsという変数で割り算するのですが、fpsが0の時の例外処理も書くべきでしょうか?
ほとんど天文学的確率かなと思うのですが。
#include "DxLib.h"
class FpsClass{
private:
//定数の宣言と初期化。他に定義が必ず必要。
static const int FpsRenewalCounter ;
//変数の宣言。
//int x = 0 ;
LONGLONG OldFpsCountTime ;//FPS計測のカウントの内最初の描画成功時の時間
LONGLONG OldFrameTime ; //前フレームの終了時間。16ミリ秒を超えたかどうかの判定に使う。
LONGLONG fps ; //FPSを記憶。
LONGLONG WaitTime ; //処理が早すぎるときに待つ時間。
int FlipCount ; //FpsRenewalCounter回フリップされるごとにFPSを更新。
public://子クラスからアクセスするバージョンではプロテクトにする。
FpsClass();//コンストラクタ
int GetFps();//LONGLONG fpsをintにキャストして返す。
int GetWaitTime();//↑のWaitTime版。
void FpsControl();
//↑全ての描画後に呼び出す。描画回数をカウントして、30回描画するごとにFPSを計算する。
//また、60FPSを保つ役割も持つ。
};
const int FpsClass::FpsRenewalCounter = 15 ;//FPSを何フレーム毎に更新するか
FpsClass::FpsClass(){
fps = 0 ;
FlipCount = 0 ;
WaitTime= 0 ;
OldFpsCountTime = GetNowHiPerformanceCount() ;//計測開始
OldFrameTime = OldFpsCountTime ;
}
int FpsClass::GetFps(){
return ( int ) fps ;
}
int FpsClass::GetWaitTime(){
return ( int ) WaitTime ;
}
void FpsClass::FpsControl(){
LONGLONG NowTime ;//時間を記憶。
//int IntWaitTime ;//悪者探しに使いました。>解決済み。
FlipCount++;
NowTime = GetNowHiPerformanceCount();
if( FlipCount == FpsRenewalCounter ){
FlipCount = 0 ;
fps = NowTime - OldFpsCountTime ;
fps = 100000000 / fps * FpsRenewalCounter ;
//実際は1秒は1000000だが、あえて100倍してある。
//これは、FPS描画用関数で小数点第二位まで表示するために便利だから・・・けど修正予定
OldFpsCountTime = NowTime ;
}
if( NowTime - OldFrameTime <= 16667 ){//処理スピードが60FPSを超えているので補正する。
WaitTime = OldFrameTime + 16667 - NowTime ;
//余った時間。
//以下は悪役探しに使いました。>CPU使用率が上がる問題
//IntWaitTime = ( int ) ( WaitTime / 1000 );//どこが悪いの???
//WaitTimer( IntWaitTime );
//while( GetNowHiPerformanceCount() - OldFrameTime <= 16667 ) {Sleep( 1 )}
//Sleep( 13 );
WaitTimer( ( int ) ( WaitTime / 1000 ) );//規定時間まで待つ。
//ミリ秒に直しつつintにキャスト。
OldFrameTime = OldFrameTime + 16667 ;//WaitTimerの誤差があるはずだが、(・ε・)キニシナイ!!
}
else{
OldFrameTime = NowTime ;
WaitTime = 0 ;
}
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
SetWindowText("表示のテスト");
SetOutApplicationLogValidFlag(FALSE);
ChangeWindowMode(TRUE);//デバッグモード専用
// DXライブラリ初期化処理
if( DxLib_Init() == -1 ) return -1 ;
//垂直同期をとらない
SetWaitVSyncFlag( FALSE ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
////////////////////////////////////////////////////////以上は前処理
int x = 0 ;
int y = 0 ;
int MyCount = 0 ;
int MyWaitTime = 0 ;
double fpsnum = 0 ;
int GrHandle ;
int Color ;
GrHandle = LoadGraph( "test.png" ) ;
Color = GetColor( 255 , 255 , 255 ) ;
FpsClass myfps ;
while( 1 )
{
// 画面に描かれているものをすべて消す
ClearDrawScreen() ;
// 上下左右のキー入力に対応して x, y の座標値を変更する
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) x -= 8 ;
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) x += 8 ;
if( CheckHitKey( KEY_INPUT_UP ) == 1 ) y -= 8 ;
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) y += 8 ;
// x , y が示す画面座標に画像を描画する
DrawGraph( x , y , GrHandle , TRUE ) ;
MyCount++ ;
if( MyCount == 30 ){//処理にどのくらい余裕があるかを見る。
MyCount = 0 ;
MyWaitTime = myfps.GetWaitTime();
}
DrawFormatString( 0, 0, Color, "FPS %d ", myfps.GetFps() ) ;
DrawFormatString( 0, 200, Color, "Wait %d ", MyWaitTime ) ;
// 裏画面の内容を表画面に反映させる
ScreenFlip() ;
//描画後に必ず呼ぶ。
myfps.FpsControl() ;
// Windows システムからくる情報を処理する
if( ProcessMessage() == -1 ) break ;
// ESCキーが押されたらループから抜ける
if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ) break ;
}
//////////////////////////////////////////////////////以下は終了処理
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
<!--3-->