画面が一瞬消えてしまいます(一応、原因は見つかってます)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
はんなり
記事: 48
登録日時: 13年前

画面が一瞬消えてしまいます(一応、原因は見つかってます)

#1

投稿記事 by はんなり » 13年前

裏画面処理を有効にして、画面(320*200)でゲームを作っていたのですが、

画面はぬるぬる安定した動きをしているのに、
時折画面が一瞬消えてしまいます。

原因と思われるプログラムを見つけたのですが、
解決方法が分かりません。(↓の関数を使わないと、この症状は無くなりました)
このプログラムは「ゲームプログラミングの館」にある、キーの押したフレーム数を測るプログラムです。

コード:

int GetHitKeyStateAll_2(int KeyStateBuf[]){
	char GetHitKeyStateAll_Key[256];
	
	GetHitKeyStateAll( GetHitKeyStateAll_Key );
	for(int i=0;i<256;i++){
		if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++; else KeyStateBuf[i]=0;
	}
	return 0;
}
関連すると思われることを箇条書きでまとめました。

・画面はDrawBoxで塗りつぶした上にタイトルロゴ用の画像一つとシンプルです。
・ScreenFlipの戻り値を取ってみましたが正常(0)に動作しているようです。
・画像は読み込めていなくても関係なく症状が起きます。
・消えるときは画像や文字等含め全て消えて、真っ黒になります。
・キーは特に押さなくても起きます。
・規則性は無くアトランダムに起きるようです。
・音楽も流してますが、音楽の有無は関係無いようです。
・GetHitKeyStateAllでも同じ症状が起きました。
・問題のプログラムを消して、プログラムのあった場所に故意にfor文を挟んでみましたが症状は起きませんでした
・C++でクラスを使用してますが、この事と因果関係は無いように思えます。

その他必要な情報があればその都度お答えします。
解決方法に限らず、考えられる原因等でも教えて頂ければ幸いです。


よろしくお願いします。
長々と失礼しました。
最後に編集したユーザー はんなり on 2011年3月31日(木) 17:12 [ 編集 1 回目 ]

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

Re: 画面が一瞬消えてしまいます(一応、原因は見つかってます)

#2

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

とても、これだけが原因と思えませんのでプログラム全体を添付してもらったほうが良いようです。
そうすれば、こちらとしても調べる事が出来ます。

[追記]
そのコード自体は実績(龍神録その他に多様)されているので使い方に問題が無い限りトラブルの原因とは思えないと言うのが根拠です。なので、他の部分を見せてもらうのが一番手っ取り早いです。
それとcodeタグを使ってくださいね。詳しくはフォーラムルールを。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

おっく

Re: 画面が一瞬消えてしまいます(一応、原因は見つかってます)

#3

投稿記事 by おっく » 13年前

単純に考えて、
・一定のタイミングで、バックとフロントのフレームバッファが入れ替わる。(つまりダブルバッファ)
・バックとフロントの入替は、GetHitKeyStateAllを実行してるスレッドと別。
・バックバッファに対して、↑のタイミングまでに描画処理がされていない時がある。
こんな状況なのかなーと思います。

んで、個人的にはフリップされるまでに、
バックバッファに描画が済んでないタイミングがあるのかなと妄想します。

提示されている「原因と思われるコード」とは別の所に問題があるかと。
>・規則性は無くアトランダムに起きるようです。
ともあるので、この関数が悪さしてる可能性は低いかな。
ここのデータが後々にどう使われるのか分かりませんけど。

アバター
はんなり
記事: 48
登録日時: 13年前

Re: 画面が一瞬消えてしまいます(一応、原因は見つかってます)

#4

投稿記事 by はんなり » 13年前

返信ありがとうございます。

とりあえず、全部のプログラムを添付します
main.cpp
(5.9 KiB) ダウンロード数: 89 回
※追記
winmain内の
Sys_Support support;
は削除してください。

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

Re: 画面が一瞬消えてしまいます(一応、原因は見つかってます)

#5

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

Sys_Supportの実体がないので、実行できないのですが目についた問題点だけ。

DxLib_Init()後に呼ぶべき次の関数が前に呼ばれています。

コード:

        SetGraphMode(320,200,32);				//画面は320*240、32ビット
		SetWindowSizeExtendRate(2.0);
		SetDrawScreen(DX_SCREEN_BACK);			//裏画面処理を有効へ
[追記]
初期化順番を変えても戻しても再現してません。
どの様な操作をすると再現しますでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
はんなり
記事: 48
登録日時: 13年前

Re: 画面が一瞬消えてしまいます(一応、原因は見つかってます)

#6

投稿記事 by はんなり » 13年前

返信ありがとうございます。
DxLib_Init()後に置き直したら症状が出なくなりました!
ありがとうございます!

あと、これからコードを貼るときはcodeのタグを付けるようにします^^;


おっくさんの意見もとても参考になりました。

ありがとうございました!

※追記
再現性については、
画像とか音楽とか添付してないので再現はできないです^^;
画像とか無くても起動はするはずです

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

Re: 画面が一瞬消えてしまいます(一応、原因は見つかってます)

#7

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

たぶん私はWin7なので再現しなかったと思われます(スクリーンの動作が違うため)。
原因としては
SetDrawScreen(DX_SCREEN_BACK); //裏画面処理を有効へ
がDxLib_Init()前に呼ばれていて裏画面処理になっていなかったと推測されます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
はんなり
記事: 48
登録日時: 13年前

Re: 画面が一瞬消えてしまいます(一応、原因は見つかってます)

#8

投稿記事 by はんなり » 13年前

なるほど。
たまたま家のPC(VISTA)で出来ただけの話ですね^^;

わざわざ原因まで、ありがとうございました^^

閉鎖

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