描画処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
奥兵

描画処理について

#1

投稿記事 by 奥兵 » 11年前

キャラクターの画像表示し、キー入力に応じて移動するだけのプログラムなんですが
画面をクリアする処理を挟むと高速で点滅を繰り返して見づらいことこの上無く
描画する画像を増やした瞬間目に見えて処理が重くなります。
描画処理に問題があるのか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: 描画処理について

#2

投稿記事 by 奥兵 » 11年前

ごめんなさい、大事なとこ挟むの忘れてました。

コード:

#define FPS (1000/30)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 描画処理について

#3

投稿記事 by softya(ソフト屋) » 11年前

これって裏画面の描画は行なっていないのでしょうか?
その為にちらついて見えると言うことはないですか?

waitに関しては経過時間から実際のFPSを逆算して出力ウィンドウにOutDebugString()で表示してみると分かると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

奥兵

Re: 描画処理について

#4

投稿記事 by 奥兵 » 11年前

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

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);
	 
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 描画処理について

#5

投稿記事 by softya(ソフト屋) » 11年前

マルチバイト文字に設定するかOutputDebugStringA()を使ってみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

奥兵

Re: 描画処理について

#6

投稿記事 by 奥兵 » 11年前

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;
}

トントン
記事: 100
登録日時: 13年前

Re: 描画処理について

#7

投稿記事 by トントン » 11年前

奥兵 さんが書きました: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: 描画処理について

#8

投稿記事 by 奥兵 » 11年前

ご指摘頂いたの部分を修正したら動いてくれました。ありがとうございます。
FPSの設定値を30にするとなぜか41で安定してましたが、60に設定するとしっかり60で動いてくれました。
ハードかなんかの関係ですかね?

閉鎖

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