60フレームでない
Posted: 2018年12月21日(金) 16:40
DxLibの骨組みを作っています。
そこで、最小限の骨組みを作ったのですが、
50フレームしかでません。
60フレームに設定しているのですが、
どこか問題はありますか?
40フレームにしたら40フレームになります。
50フレーム未満はでますが、50フレーム以上はでません。
Windows 10 Pro
メモリ:8G
Visual Stdio 2017 Community
ソースコードを下に書きます。
// =============[ FPS.cpp ]==================
そこで、最小限の骨組みを作ったのですが、
50フレームしかでません。
60フレームに設定しているのですが、
どこか問題はありますか?
40フレームにしたら40フレームになります。
50フレーム未満はでますが、50フレーム以上はでません。
Windows 10 Pro
メモリ:8G
Visual Stdio 2017 Community
ソースコードを下に書きます。
#include "stdafx.h"
#define INIT_FILE "setting.txt"
// [ FPS.cpp ]
void draw_fps(int x, int y);
void fps_wait();
//=============================================================
// DxLibの初期化 INIT_FILE から設定を読み込む
// 成功:1 失敗:-1
int dic_Init()
{
#define DEF_BUFFSIZE 256
int window_mode = 1;
int window_width = 640;
int window_height = 480;
int window_bit = 16;
FILE *file;
fopen_s(&file, INIT_FILE, "rb");
if (file)
{
char szBuff[DEF_BUFFSIZE];
fgets(szBuff, DEF_BUFFSIZE, file);
fgets(szBuff, DEF_BUFFSIZE, file);
window_mode = atoi(szBuff);
fgets(szBuff, DEF_BUFFSIZE, file);
fgets(szBuff, DEF_BUFFSIZE, file);
window_width = atoi(szBuff);
fgets(szBuff, DEF_BUFFSIZE, file);
fgets(szBuff, DEF_BUFFSIZE, file);
window_height = atoi(szBuff);
fgets(szBuff, DEF_BUFFSIZE, file);
fgets(szBuff, DEF_BUFFSIZE, file);
window_bit = atoi(szBuff);
fclose(file);
file = NULL;
}
else
{
MessageBox(NULL, "設定ファイルが見つかりませんでした。", "警告", MB_OK);
}
file = NULL;
ChangeWindowMode(window_mode);// ウィンドウモード
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetGraphMode(window_width, window_height, window_bit);
SetDrawScreen(DX_SCREEN_BACK); // 裏に描画
return 1;
}
//=============================================================
int MainLoop()
{
DrawString(20, 20, "Hello World", GetColor(255, 255, 255));
return 0;
}
//=============================================================
// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// DxLibの初期化
if (-1 == dic_Init())
return -1;
while (ProcessMessage() == 0 && CheckHitKeyAll() == 0)
{
// 画面を消去
ClearDrawScreen();
// メインループ
MainLoop();
// フレーム数の描画
draw_fps(20, 0);
// 裏画面の内容を表画面に反映させる
ScreenFlip();
// 60フレーム待機する
fps_wait();
}
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
// =============[ FPS.cpp ]==================
//#include "stdafx.h"
#include "stdafx.h"
//fps
#define FLAME 60
//fpsのカウンタ、60フレームに1回基準となる時刻を記録する変数
int fps_count,count0t;
//平均を計算するため60回の1周時間を記録
int f[FLAME];
//平均fps
double ave;
//FLAME fps になるようにfpsを計算・制御
void fps_wait(){
int term,i,gnt;
static int t=0;
if(fps_count==0){//60フレームの1回目なら
if(t==0)//完全に最初ならまたない
term=0;
else//前回記録した時間を元に計算
term=count0t+1000-GetNowCount();
}
else //待つべき時間=現在あるべき時刻-現在の時刻
term = (int)(count0t+fps_count*(1000.0/FLAME))-GetNowCount();
if(term>0)//待つべき時間だけ待つ
Sleep(term);
gnt=GetNowCount();
if(fps_count==0)//60フレームに1度基準を作る
count0t=gnt;
f[fps_count]=gnt-t;//1周した時間を記録
t=gnt;
//平均計算
if(fps_count==FLAME-1){
ave=0;
for(i=0;i<FLAME;i++)
ave+=f[i];
ave/=FLAME;
}
fps_count = (++fps_count)%FLAME ;
}
//x,yの位置にfpsを表示
void draw_fps(int x, int y) {
if (ave != 0) {
DrawFormatString(x, y, GetColor(0, 255, 255), _T("[%.1f]"), 1000 / ave);
}
return;
}