トップページ > 過去ログ > 記事閲覧
STGで大量に弾を出したときに線が描写される
名前:あかいの 日時: 2009/02/17 02:46

STGゲームを作っているのですが、とある場面で画面に線がはしるときがあります。 ttp://www.h.do-up.com/home/kaorumhk/gazou2.bmp DrawRotaGraphを使い、バイリニア法で描画しています。 弾の画像を変えても線がでます。 環境はVC++2005です。 原因がわかる方がいましたら、教えてください。 よろしくお願いします。

Page: 1 |

Re: STGで大量に弾を出したときに線が描写される ( No.1 )
名前:管理人 日時:2009/02/18 12:35

あかいのさんが製作中のソフトのプログラムを私の環境で実行してみないと どんな環境でも発生する現象なのか、環境に依存した現象なのかを判断することができませんが、 とりあえず私の手元にある最新のライブラリではもしかしたら直っているかもしれませんので、 宜しければこちらのファイルををお試しになってみてくださいm(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: STGで大量に弾を出したときに線が描写される ( No.2 )
名前:あかいの 日時:2009/02/20 02:54

管理人さんレスありがとうございます。 頂いたライブラリでリビルドしてみると発生率が半分以下になりました。 原因はわからなかったですが、発生率が半分以下なら許容内なのでこれでいこうと思います。 ありがとうございました。
Re: STGで大量に弾を出したときに線が描写される ( No.3 )
名前:あかいの 日時:2009/02/22 18:39

管理人さんこの前はありがとうございました。 しかし時たま出てくる謎の線がどうしても気になるので、再度質問させてください。 その謎の線がでる状態と同じプログラムを作ってみました。 皆さん、わかる方がいましたらどうぞよろしくお願いします。 Windows XP Home Edition Service Pack 3 Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz (4 CPUs) DirectX 9.0c (4.09.0000.0904) NVIDIA GeForce 9600 GT VC++2005 #include "DxLib.h" #include <time.h> #include <stdlib.h> #include <math.h> #define PI 3.1415926535897932384626433832795 #define RAD 57.295779513082320876798154814105 bool WindowMode = TRUE; LONGLONG timer; int i; int count=0; float plx=320,ply=400; int T1[6]; #include "enemy_shot.h" int X; int rnd(int min, int max){ int aaa = 0; aaa = (rand() % (max - min + 1)) + min; return(aaa); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ SetGraphMode( 640 , 480 , 16 ); ChangeWindowMode( WindowMode ); if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); srand(time(NULL)); SetTransColor( 255,0,255 ); LoadImg(); while(1){ ClearDrawScreen(); timer = GetNowHiPerformanceCount() ; AddEShot2(ABS,X,rnd(0,200), rnd(1,3),rnd(0,360),T1[BLUE]); AddEShot2(ABS,X,rnd(0,200), rnd(1,3),rnd(0,360),T1[BLUE]); AddEShot2(ABS,X,rnd(0,200), rnd(1,3),rnd(0,360),T1[BLUE]); AddEShot2(ABS,X,rnd(0,200), rnd(1,3),rnd(0,360),T1[BLUE]); X+=3; if(X>640){ for(i=0; i<ESHOT2MAX; i++) eshot2s[i].used = false; X=0; } DrawEShot(); ActionEShot(); ScreenFlip(); while( GetNowHiPerformanceCount() - timer < 16666 ); if( ProcessMessage() == -1 ) break; } DxLib_End(); return 0; } ///////////////////////////////////////// enemy_shot.h #define ESHOT2MAX 4096 #define RED 0 #define GREEN 1 #define BLUE 2 #define YELLOW 3 #define CYAN 4 #define MAGE 5 #define PLAYER 0 #define ABS 1 void LoadImg(); void DrawEShot(); void ActionEShot(); void AddEShot2(int TYPE, int X, int Y, float SP, float ANGLE, int IMG); void DrawEShot2(); void ActionEShot2(); struct Eshot2{ int type; float x,y,vx,vy; float angle; float sp; int img; bool used; }; Eshot2 eshot2s[ESHOT2MAX]; void LoadImg(){ LoadDivGraph( "image/etama_1.png" , 6 , 6 , 1 , 8 , 8 , T1 ); } void DrawEShot(){ DrawEShot2(); } void ActionEShot(){ ActionEShot2(); } void AddEShot2(int TYPE, int X, int Y, float SP, float ANGLE, int IMG){ for(i=0; i<ESHOT2MAX; i++){ if(eshot2s[i].used == false){ eshot2s[i].type = TYPE; eshot2s[i].x = X; eshot2s[i].y = Y; eshot2s[i].angle = ANGLE/RAD; eshot2s[i].sp = SP; if(eshot2s[i].type == ABS){ eshot2s[i].vx = cos(ANGLE/RAD)*eshot2s[i].sp; eshot2s[i].vy = sin(ANGLE/RAD)*eshot2s[i].sp; } else if(eshot2s[i].type == PLAYER){ if(eshot2s[i].x < plx){ eshot2s[i].angle = atan( (eshot2s[i].y - ply)/(eshot2s[i].x - plx)) + ANGLE/RAD; eshot2s[i].vx = cos(eshot2s[i].angle)*SP; eshot2s[i].vy = sin(eshot2s[i].angle)*SP; } else if(eshot2s[i].x > plx){ eshot2s[i].angle = atan( (eshot2s[i].y - ply)/(eshot2s[i].x - plx)) + ANGLE/RAD; eshot2s[i].vx = -cos(eshot2s[i].angle)*SP; eshot2s[i].vy = -sin(eshot2s[i].angle)*SP; } else { eshot2s[i].angle = atan( (eshot2s[i].y - ply)/(eshot2s[i].x - plx)) + ANGLE/RAD; eshot2s[i].vx = cos(eshot2s[i].angle)*SP; eshot2s[i].vy = -sin(eshot2s[i].angle)*SP; } } eshot2s[i].img = IMG; eshot2s[i].used = true; break; } } } void DrawEShot2(){ for(i=0; i<ESHOT2MAX; i++){ if(eshot2s[i].used == true){ DrawRotaGraph( eshot2s[i].x, eshot2s[i].y, 1.0f, 0, eshot2s[i].img, TRUE ) ; } } } void ActionEShot2(){ for(i=0; i<ESHOT2MAX; i++){ if(eshot2s[i].used == true){ eshot2s[i].x += eshot2s[i].vx*0.5; eshot2s[i].y += eshot2s[i].vy*0.5; if(eshot2s[i].x < -64 || eshot2s[i].x > 640+64 || eshot2s[i].y < -64 || eshot2s[i].y > 480+64)eshot2s[i].used = false; } } }
Re: STGで大量に弾を出したときに線が描写される ( No.4 )
名前:しーぷ 日時:2009/02/23 01:28

こんばんわ。 ちょっと気になったので、上の再現コードを実行してみると、 同じような現象になりました。 ただ上のコードだと原因が絞りきれなかったので、 再現できる短いコードに修正にしてみました。 が、再現率は100%ではありません。 同じプログラムでも再現する時としない時があります。 現象は最初のフレームで現れ、 何かキーを押すと大体正常に戻ります。 描画する画像の左上の頂点が飛んでいるようです。 ちなみにDrawGraphF関数の第4引数がFALSEだと、 自分がやった限りでは再現しませんでした。 ただ結構メモリの状態に左右されているっぽいので、 何かのタイミングによっては出るのかも。。。 もしかすると環境のせいかもしれないので、 自分の環境も書いておきます。 (GeForce9600GT、あかいのさんと一緒なのが少し気になります。。。) Windows XP Professional Edition Service Pack 3 Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz DirectX 9.0c NVIDIA GeForce 9600 GT(ドライババージョン:180.84) VC++2005 // 再現コード #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ // DxLibの初期化 ChangeWindowMode( TRUE ); if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); // 変数の宣言・定義 int T ( LoadGraph( "bullet.png" ) ); static const int ESHOT2MAX ( 4096 ); // メインループ while( ProcessMessage() == 0 ) { // 描画 ClearDrawScreen(); for( int i=0; i<ESHOT2MAX; i++){ // 第4引数をFALSEにすると現象は出ない(多分) DrawGraphF( 200.f, 200.f, T, TRUE ); } ScreenFlip(); // キーを押すと再描画 WaitKey(); } // 終了処理 DxLib_End(); return 0; }
Re: STGで大量に弾を出したときに線が描写される ( No.5 )
名前:キーチック 日時:2009/02/23 06:05

興味本位でやってみました. しーぷ 様のソースでやってみたのですが,そのような現象は出ませんでした. (あかいの 様のソースだとenemy_shot.hがないといって起こられました.) bullet.pngは適当に200×200で作成しましたが,間違ってませんよね(汗) 当方の環境は Windows XP Professional Edition Service Pack 3 Intel(R) Core(TM)2 Duo CPU E6700 @ 2.66GHz DirectX 9.0c RADEON X1950(ドライババージョン:8.282.0.0) VC++2005 というところです. ご参考まで...
Re: STGで大量に弾を出したときに線が描写される ( No.6 )
名前:しーぷ 日時:2009/02/23 09:28

キーチックさん、ご協力ありがとうございます。 こちらでも200x200で試してみましたが、 テクスチャサイズを大きくすると出ませんね。。。 もしかするとテクスチャのサイズによっては出ないのかもしれません。 なので、動作環境を統一すべく、 こちらで再現を確認したファイル(16x16)を用意しました。 ttp://www2.uploda.org/uporg2039833.png.html あとライブラリはNo.1で管理人さんがリリースされたものです。 もしお時間があればお試しをお願いいたします。
Re: STGで大量に弾を出したときに線が描写される ( No.7 )
名前:管理人 日時:2009/02/23 14:02

手元にある環境であかいのさんとしーぷさんがご用意されたプログラムを何度も実行してみましたが、ご報告頂いたような現象は確認できませんでした 環境1 Windows XP Professional Edition Service Pack 3 Pentium(R) 4 CPU 2.40GHz DirectX 9.0c ATI Radeon HD 2600 PRO Visual C++ 2005 環境2 Windows XP Professional Edition Service Pack 3 Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz DirectX 9.0c NVIDIA GeForce 8800 GTX Visual C++ 2005 ドライバが原因である可能性が高いかもしれませんので、宜しければ最新のドライバをインストールしてみてください
Re: STGで大量に弾を出したときに線が描写される ( No.8 )
名前:あかいの 日時:2009/02/23 18:54

皆さん、ご協力ありがとうございます >// 第4引数をFALSEにすると現象は出ない(多分) >DrawGraphF( 200.f, 200.f, T, TRUE ); FALSEにすると確かに線の現象が出なかったです >(あかいの 様のソースだとenemy_shot.hがないといって起こられました.) No.3で私が書いたソースは二つあり、///////////から先がenemy_shot.hです わかりにくく書いてすみませんでした ドライバを最新版に更新(181.22)してみました しかしまだ線の現象は出ます;; 画像サイズの話ですが、しーぷさんが用意してくれた画像サイズを拡大して試してみました 64*64で実行すると線の現象がでて、96*96で実行したら線の現象はでなかったです 環境のせいだとどうしようもないのでしょうか…
Re: STGで大量に弾を出したときに線が描写される ( No.9 )
名前:管理人 日時:2009/02/23 23:43

TransFlag を FALSE にすれば線が出ないということから どうしようもないわけではないのですが、どのような状況で線が出るのかを把握するためには 私の環境で線が出せないと難しいというのがあります また、この現象が多くの環境で発生するのでしたらビデオカードを購入してでも解決したいと思いますが、 今のところ GeForce 9800GT のみでの発生で将来的にドライバの更新で解決するかもしれない現象なので、 そこまでする(1万越えのビデオカードを購入する)のも現実的ではありません なので、申し訳ありませんがこの件に関しては保留にしたいと思います m(_ _;m
Re: STGで大量に弾を出したときに線が描写される ( No.10 )
名前:しーぷ 日時:2009/02/24 21:34

管理人さん、ご回答ありがとうございます。 こちらの方で、現在リリースされているDxLibのソースを使って、 デバッガで追いかけてみようとしたのですが、 ソースからビルドしたライブラリを使うと、 LoadGraph関数内でスタックオーバーフローで落ちてしまう上に、 なぜかソースが合致しないと言われ、うまくステップインもできなかったため、 心が折れてしまいました(;; > なので、申し訳ありませんがこの件に関しては保留にしたいと思います m(_ _;m 自分としては問題の現象に直面しているわけではないので、全然大丈夫です。 上記のライブラリの問題が解消できれば、 また自分が調べ出すかもしれません(w とりあえず(?)ありがとうございました。
Re: STGで大量に弾を出したときに線が描写される ( No.11 )
名前:しーぷ 日時:2009/02/24 23:26

書き込んだ後、ライブラリのソースが更新されている事に気付きました。。。orz これをビルドしてみたら、ステップインまでバッチリできました。 そこで早速ライブラリ内を追っかけていて、 気になった箇所を修正してみたら、頂点が飛ぶ現象が出なくなりました。 ■修正箇所  Dx3D.cpp の GETVERTEX_QUAD マクロ内(55行目)の   if( (省略) || Dev->VertexNum + 6 > D3DDev_VertexBuffer_MaxVertexNum[Dev->VertexType] ) )\  を   if( (省略) || Dev->VertexNum + 6 >= D3DDev_VertexBuffer_MaxVertexNum[Dev->VertexType] ) )\  と変更 が、ここからが問題なのですが、 なぜ修正をしないと、あの現象が出るのかが説明付かない状態です。 この部分は、頂点バッファがいっぱいになったらDrawPrimitiveで吐き出しちゃう、という 処理だと思うのですが、単純にそれだけであれば修正前の状態でも大丈夫なはずなんですが。 やはりグラフィックドライバのせいなんでしょうか。。。 これ以上のことはDirectXに疎い自分にはよくわからないです。 なので、とりあえず報告という形で留めておきたいと思います。 出来る限りのことはやりたいと思いますので、 何かお気付きの点があれば、ご連絡頂けると幸いです。 ちなみに、自分の環境では、該当の描画時(DrawGraphF関数)に、 マクロ内で使用している変数は以下のようになっていました。 Dev->VertexType == 1 D3DDev_VertexBuffer_MaxVertexNum[Dev->VertexType] == 2340
Re: STGで大量に弾を出したときに線が描写される ( No.12 )
名前:あかいの 日時:2009/02/24 23:43

皆様ありがとうございます。 ドライバの更新を待つことにします。
Re: STGで大量に弾を出したときに線が描写される ( No.13 )
名前:管理人 日時:2009/02/25 13:42

しーぷさんの仰られる部分をみて、バッファオーバーランのバグがあるかと思いましたが、 ソースを見てみた限りではそれはなさそうです・・・ ただ、「=」を追加するだけで GeForce 9800GT で不具合が発生しなくなるのでしたら その変更を加えてみても良いような気がします
Re: STGで大量に弾を出したときに線が描写される ( No.14 )
名前:あかいの 日時:2009/02/25 23:50

書き込みのタイミングが遅れました;; しーぷさんわざわざバグの原因を探して頂いてありがとうございます Dx3D.cppの内容を書き直すのはわかったのですが、その後どうやってDXライブラリの形にするのかがわかりません 教えて頂けたら嬉しいです
Re: STGで大量に弾を出したときに線が描写される ( No.15 )
名前:しーぷ 日時:2009/02/26 00:16

先ほど最新のドライバ(182.06)がリリースされていたので 試してみましたが、やはりこれでもダメでした。 > しーぷさんの仰られる部分をみて、バッファオーバーランのバグがあるかと思いましたが、 > ソースを見てみた限りではそれはなさそうです・・・ 自分もそうじゃないかと思って「=」を付けてみたんですが、 よくよく考えるとそれなら、そこまで環境には左右されないはずなんですよね。。。 > ただ、「=」を追加するだけで GeForce 9800GT で不具合が発生しなくなるのでしたら > その変更を加えてみても良いような気がします 具体的な説明が付けられていないだけに、 こちらからは何とも言えないところです。。 なので誠に勝手ではありますが、 この判断は管理人さんに委ねさせて頂く事にいたします。 (※ちなみにグラボはGeForce9600GTです) なんだか結局無駄に掻き回しただけになってしまい、 申し訳ありませんでした。
Re: STGで大量に弾を出したときに線が描写される ( No.16 )
名前:しーぷ 日時:2009/02/26 00:30

> あかいのさん すいません、一歩遅かったようです。。 公開されているライブラリのプロジェクト(DxLibMake)をビルド(デバッグビルド)すると、 プロジェクトのディレクトリ内に「Debug」というディレクトリができると思うので、 その中のDxLib_d.libを元のDxLib_d.libに上書きすれば使えるはずです。 同じようにリリースビルドすると「Release」というディレクトリにDxLib.libができるので、それも上書きしてください。 簡単に説明してしまいましたが、これでわかりますでしょうか??
Re: STGで大量に弾を出したときに線が描写される ( No.17 )
名前:管理人 日時:2009/02/26 00:58

件の箇所の変更であれば後々改良の足枷になることもないと思いましたので、 > から >= に変更することにしました こちらに変更を加えたバージョンをアップしましたので、宜しければお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: STGで大量に弾を出したときに線が描写される ( No.18 )
名前:しーぷ 日時:2009/02/26 01:15

> 管理人さん ありがとうございます、こちらでも 不具合が解消されているのを確認いたしました。
Re: STGで大量に弾を出したときに線が描写される ( No.19 )
名前:あかいの 日時:2009/02/26 04:25

管理人さん、しーぷさんありがとうございました 無事に線が描写される現象が解消されました

Page: 1 |