ページ 11

描画処理について

Posted: 2012年9月24日(月) 19:41
by 奥兵
キャラクターの画像表示し、キー入力に応じて移動するだけのプログラムなんですが
画面をクリアする処理を挟むと高速で点滅を繰り返して見づらいことこの上無く
描画する画像を増やした瞬間目に見えて処理が重くなります。
描画処理に問題があるのかFPSがうまく制御できてないのか原因に見当がつかずお手上げです。
どなたかアドバイスお願いします。

コード:

int wait(){//ここでFPS制御
	static DWORD lasttime=0;

	DWORD time=timeGetTime();
	if(FPS>(time-lasttime)){
		Sleep(FPS-(time-lasttime));
	}

	lasttime=time;
	return 0;
}
int oGameMain(class Graphic *app){
	
	static int mode=INITIAL;
	static unit *hoge=NULL;

	for(;app->RunMessageLoop();){	
		switch (mode){
		case INITIAL:{
			//unit hoge(app);
			hoge = new unit(app);			
			mode = MAIN;
		}
		break;
		case MAIN:
			GetKey(hoge);
			app->ClearScreen();
			app->paint(hoge->Graphic, hoge->x,hoge->y);
			app->paint(hoge->Graphic, hoge->x+50,hoge->y);
			//app->paint(hoge->Graphic, hoge->x-50,hoge->y);
			//mode=END;//仮置き
			wait();
		break;
		case END:	 
			return 0;
		break;
		}
			 
	 }
	return 0;
}


Re: 描画処理について

Posted: 2012年9月24日(月) 20:13
by 奥兵
ごめんなさい、大事なとこ挟むの忘れてました。

コード:

#define FPS (1000/30)

Re: 描画処理について

Posted: 2012年9月24日(月) 21:18
by softya(ソフト屋)
これって裏画面の描画は行なっていないのでしょうか?
その為にちらついて見えると言うことはないですか?

waitに関しては経過時間から実際のFPSを逆算して出力ウィンドウにOutDebugString()で表示してみると分かると思います。

Re: 描画処理について

Posted: 2012年9月25日(火) 00:45
by 奥兵
ちらつきはご指摘いただいたとおりダブルバッファリングに原因がありました。
描画関数をパッケージングした際によく確認せず、中にダブルバッファリングの開始と終了処理があったので
それを描画の度に何度も必要以上に呼んでいたのが原因っぽいです。
描画スピードも安定しました。

FPSのほうはFPSを表示する関数を作ってみました。
が、一番下のOutputDebugString(str);のstrに波線で 
「char * 型の引数は LPCWSTR のパラメータと互換性がありません」
と警告?が出てしまたので、文字列の変数の型をガチャガチャと入れ替えていろいろ試したんですが
どれもあっちを立てればこちらが立たずでうまく行きません。

コード:

int FPScheck(){
	static int counter=0;//ループ回数のカウンタ
	counter++;

	static DWORD basetime=0;
	if(basetime==0){
		basetime=timeGetTime();
	}
	DWORD time = timeGetTime();
 
	int tFPS=(counter/(time-basetime));

	char  *str;
	sprintf(str,"%2d",tFPS);
	OutputDebugString(str);
	 
}

Re: 描画処理について

Posted: 2012年9月25日(火) 01:04
by softya(ソフト屋)
マルチバイト文字に設定するかOutputDebugStringA()を使ってみてください。

Re: 描画処理について

Posted: 2012年9月25日(火) 01:30
by 奥兵
OutputDebugStringAを使うと無事コンパイルできました。
しかしexeは動作を停止しました。と表示されプログラムが停止してしまいます。
FPScheckを呼ぶのをやめると、正常に動くので原因は今作った関数だと思うのですが
どこに問題があるのかさっぱりです・・・

コード:

int FPScheck(){
	static int counter=0;//ループ回数のカウンタ
	counter++;

	static DWORD basetime=0;
	if(basetime==0){
		basetime=timeGetTime();
	}
	DWORD time = timeGetTime();
 
	int tFPS=(counter/(time-basetime));

	char  str[128];
	sprintf_s(str,"%2d",tFPS);
	OutputDebugStringA(str);
	 
	return 0;
}

Re: 描画処理について

Posted: 2012年9月25日(火) 01:49
by トントン
奥兵 さんが書きました:OutputDebugStringAを使うと無事コンパイルできました。
しかしexeは動作を停止しました。と表示されプログラムが停止してしまいます。
FPScheckを呼ぶのをやめると、正常に動くので原因は今作った関数だと思うのですが
どこに問題があるのかさっぱりです・・・

コード:

int FPScheck(){
	static int counter=0;//ループ回数のカウンタ
	counter++;

	static DWORD basetime=0;
	if(basetime==0){
		basetime=timeGetTime();
	}
	DWORD time = timeGetTime();
 
	int tFPS=(counter/(time-basetime));

	char  str[128];
	sprintf_s(str,"%2d",tFPS);
	OutputDebugStringA(str);
	 
	return 0;
}
流れ的に
timeとbasetimeが同じ値になるのではないでしょうか?

Re: 描画処理について

Posted: 2012年9月25日(火) 02:20
by 奥兵
ご指摘頂いたの部分を修正したら動いてくれました。ありがとうございます。
FPSの設定値を30にするとなぜか41で安定してましたが、60に設定するとしっかり60で動いてくれました。
ハードかなんかの関係ですかね?