60フレームでない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 579
登録日時: 9年前
住所: 宮崎県

60フレームでない

#1

投稿記事 by dic » 11ヶ月前

DxLibの骨組みを作っています。
そこで、最小限の骨組みを作ったのですが、
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;
}

アバター
あたっしゅ
記事: 258
登録日時: 9年前
住所: 東京23区
連絡を取る:

Re: 60フレームでない

#2

投稿記事 by あたっしゅ » 11ヶ月前

とりあえず、誰も答えてないので、ワイが答えます。

なぜ、使っているグラボやモニタの名前を書かないのでしょうか ?
宗教上の理由ですか ?
Note PC なのかな ?
640x480 は、VSYNC すら、なかった時代の規格じゃなかったっけ ?
液晶モニタは、VSYNC 関係ないんだっけ ?
800x600, 1024xいくつだっけ? とにかく高解像度にした方がフレームレートが上がるかもしれません。
とにかく、ワイのマシンは、もう 8 年ぐらいたってるので、最近の情報を、あまり仕入れてないのだよ。

今年中に new PC、来年になったら、3D ゴーグル買うぞ。



>連続して投稿する権限がありません。しばらく時間が経ってから投稿してください。

書き込もうとしたら、こんなん出たぞ。ここは、回答者に、嫌がらせする場所なのか ?
手提鞄あたっしゅ、[MrAtassyu] http://ameblo.jp/mratassyu/
手提鞄屋魚有店(てさげかばんやうおありてん)
レスがついていないものを優先して、レスしています。時々、見当外れなレスをします。

dic
記事: 579
登録日時: 9年前
住所: 宮崎県

Re: 60フレームでない

#3

投稿記事 by dic » 10ヶ月前

あったしゅ さんが書きました: なぜ、使っているグラボやモニタの名前を書かないのでしょうか ?
宗教上の理由ですか ?
Note PC なのかな ?
ノートパソコンです。

昔は60フレームでていたので書く必要がないと思っていました。
あたっしゅ さんが書きました: 640x480 は、VSYNC すら、なかった時代の規格じゃなかったっけ ?
液晶モニタは、VSYNC 関係ないんだっけ ?
800x600, 1024xいくつだっけ? とにかく高解像度にした方がフレームレートが上がるかもしれません。
解像度を上げてみましたが、やはり50フレーム以上はでませんでした。
どの解像度にしても同じ数値を出しました。


私のパソコンで、不思議な現象が起きるので
バックアップもかねて最小限の環境を構築しておきたいのです。

返信

“C言語何でも質問掲示板” へ戻る