ページ 11

FPSの固定

Posted: 2009年5月05日(火) 01:53
by ゲーム創!!
60FPSで回したいのですが
処理が止まらなくなってしまいます・・・
修正個所がわからないのですがどなたか教えてはいただけないでしょうか?
const DWORD FPS_MAX		= 60;		// FPS設定
DWORD FPS;					// FPS計測値
BOOL EndF				= FALSE;		// 終了フラグ

//==============================================================================================
//  メインループ
//==============================================================================================
void GameMain(void){

	//メインループ
	while(!EndF){
		FPSCount(&FPS); // FPS の計測
	}

}

//==============================================================================================
// FPSウェイト
//==============================================================================================
void FPSWait(DWORD wait_time){
    MSG msg;
    DWORD start_time = timeGetTime();

    do{
        // メッセージ処理
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        if(wait_time > 0) Sleep(1); // ちょっと休憩(CPUの占有率を下げるため)
    }while(timeGetTime() < wait_time + start_time); // wait_time だけ回る
}

//==============================================================================================
// FPSの固定
//==============================================================================================
void FPSSet(DWORD wait_time){
	DWORD StartTime, EndTime, PassTime;

	StartTime = timeGetTime();
	EndTime = timeGetTime();
	PassTime = EndTime - StartTime; // 経過時間の計算
	(1000 / FPS_MAX > PassTime)? FPSWait(1000 / FPS_MAX - PassTime) : FPSWait(0); // 待つ。
}

//==============================================================================================
// FPS の計測
//==============================================================================================
void FPSCount(DWORD *fps){
    static DWORD before_time = timeGetTime(); // 以前の時間
    DWORD        now_time    = timeGetTime(); // 現在の時間
    static DWORD fps_ctr = 0;

    if(now_time - before_time >= 1000){
        // 初期化
        before_time = now_time;
        *fps = fps_ctr;
        fps_ctr = 0;
    }

    fps_ctr++;
}

Re:FPSの固定

Posted: 2009年5月05日(火) 02:36
by Justy

>処理が止まらなくなってしまいます・

 意味がよくわかりません。どういう状況で止まらないのでしょうか?


 強いてこのコードから読み取れる問題点を挙げるとしたら、2点ほど。

・ PeekMessage()がメインループから呼ばれていない可能性がある
・ WM_QUITのメッセージがきたときの処理がない。

 ってところでしょうか。

Re:FPSの固定

Posted: 2009年5月05日(火) 03:47
by ゲーム創!!
ご回答ありがとうございます。

void FPSSet(DWORD wait_time)

void FPSSet()
にかえてGameLoopで呼んだら留まるようになりました。

ただFPSを表示してみると61FPSでまわっているのと
GameLoopを呼んでいる位置が間違っているのかもしれないのですが
画面を動かすと処理が止まってしまいます。


以上の2点を修正したいのですが
どのようにすればよいのでしょうか?
//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{

            ~処理~


	GameMain();			//  ここ
	ReleaseDC(hWnd, hDC_Wnd);

	return TRUE;
}

Re:FPSの固定

Posted: 2009年5月11日(月) 21:39
by ゲーム創!!
自分なりに調べてみたのですが40FPSをうわまることはできませんでした・・・
またやはりウインドを動かしてしまうと処理が止まってしまうのと
かなりカクカク動いてしまいます。

ソースが長すぎてはりつけることができませんでしたので
txtを添付します。

何度も質問すいません。

Re:FPSの固定

Posted: 2009年5月12日(火) 00:33
by Justy

>40FPSをうわまることはできませんでした・

 CPUの処理が追いついていない、ということはないですか?
 環境に問題がなければ、誤差の関係で指定した FPS値になる保証はありませんが、
近い値になるはずです。



>ウインドを動かしてしまうと処理が止まってしまうのと

 ウインドウをドラッグで動かした時ということでしょうか?
 たしかに一瞬 fpsが低下しますね。

 であれば、メインの処理(fpsの計算など)を別スレッドで行うようにしてみては
どうでしょうか。
 
 これならウインドウの状態やメッセージ処理中であっても、ユーザー側の処理を
行うことができます。



# ところで BitBltをそんなところで実行するといろいろ問題がありそうな気がしますが……。

Re:FPSの固定

Posted: 2009年5月12日(火) 05:53
by ゲーム創!!
ご回答ありがとうございます
const DWORD FPS_MAX = 60; // FPS設定
を160とかまであげると数値も64近辺を行き来します・・・
なのでCPU関係ではないかと思ったのですが・・・
FPSWaitなどはあっているのでしょうか?

Re:FPSの固定

Posted: 2009年5月12日(火) 19:04
by Justy

>FPSWaitなどはあっているのでしょうか

 FPSSetでほとんどのケースで PassTimeは 0になります。
 それから timeGetTime()の精度を timeBeginPeriod()、timeEndPeriod()を使って
上げておいた方がいいかと思います。

 フレームレート制御周りで、おかしいところはそれくらいです。

Re:FPSの固定

Posted: 2009年5月12日(火) 22:55
by ゲーム創!!
>>justyさん
ご回答ありがとうございます。
timeBeginPeriod()らの引数に1を渡して試してみたのですが
ダメでした・・・・

FPSSetがおかしいのでしょうか?

http://zahyou.hp.infoseek.co.jp/cgame/fps_f.htm

を参考に作っているのですがなぜか定義した値より少ない40しかまわりません。
またいくつかのサイトを見て回ったところプログラムでは
1秒は1000で扱っているみたいなことがあったのですが
それは関係ないですよね・・・

Re:FPSの固定

Posted: 2009年5月13日(水) 00:10
by Justy

>定義した値より少ない40しかまわりません

 PassTimeが 0になる件は修正されていないようですが、直しても影響はないのでしょう。
 添付のソースだとどうなりますか?

Re:FPSの固定

Posted: 2009年5月13日(水) 20:29
by ゲーム創!!
できました><
Justyさんには何度も助けていただけて
感謝しています。

ありがとうございます。