ページ 1 / 1
3D 武器を持つとチカチカする
Posted: 2014年10月05日(日) 00:12
by ptolemy
いつも質問ばかりですみません。
今回は、なぜか原因がわからないのでなにかプログラムにおかしい点があるかどうか確認してもらいたいです。
症状は、武器を持つと画面がチカチカするといものです。
プログラムは、長いので添付します。
モデルは、添付していいかわからないのでとりあえずソースコードだけです。
操作方法は、
WSADで動く
左クリック弾発射
右リロード
キーボードの1で無手(テンキーでは、ありません。)
キーボードの2でメイン武器(テンキーでは、ありません。)
キーボードの3でサブ武器(テンキーでは、ありません。)
自分でもプログラムをところどころ消したりして探しましたが、わからないです。
もしかしたら、小さいミスなのかもしれません。
テスト中の項目は、構造体にしないで、簡単な変数にして書いてますので
見ずらかったら、書き直してきます。
また、インデントもおかしい点があったらご指摘ください。
あと、僕はすごく読みずらいプログラムを書いてると思います。すみません。
また、こういうときの原因の追究の仕方がいまいちわからないので教えてほしいです。
とても、大変な質問かもしれませんが、よろしくお願いします。
Re: 3D 武器を持つとチカチカする
Posted: 2014年10月05日(日) 19:36
by 顔芸
ソース見てみました.
よく見ていないですが,GAME.cppの関数が巨大ですね.機能の区切りにある3行コメントのおかげで
大きさの割りに見通しはいい気もしますが,自分ならコメントをつける前にそこを別途関数化します.
あと,
if((keybord_Get(KEY_INPUT_W)>0)&&(keybord_Get(KEY_INPUT_D)>0)&&GAMESTART==1){
player.ang=player.angleY+(45.0/180.0f*3.141592f);
player.HX=player.speed*-sin(player.ang);
player.HY=player.speed*-cos(player.ang);
IDOU=1;
}
if((keybord_Get(KEY_INPUT_W)>0)&&(keybord_Get(KEY_INPUT_A)>0)&&GAMESTART==1){
player.ang=player.angleY-(45.0/180.0f*3.141592f);
player.HX=player.speed*-sin(player.ang);
player.HY=player.speed*-cos(player.ang);
IDOU=1;
}
if((keybord_Get(KEY_INPUT_S)>0)&&(keybord_Get(KEY_INPUT_D)>0)&&GAMESTART==1){
player.ang=player.angleY-(45.0/180.0f*3.141592f);
player.HX=player.speed*sin(player.ang);
player.HY=player.speed*cos(player.ang);
IDOU=1;
}
if((keybord_Get(KEY_INPUT_S)>0)&&(keybord_Get(KEY_INPUT_A)>0)&&GAMESTART==1){
player.ang=player.angleY+(45.0/180.0f*3.141592f);
player.HX=player.speed*sin(player.ang);
player.HY=player.speed*cos(player.ang);
IDOU=1;
}
このような部分を眺めていると,パラメータの値がちょっと違う以外,よく似た構造の繰り返しだなぁと
気付いてほしいです.差分となっている値を引数にとる関数として,独立させられるサインです.
個人的に,閉じ波括弧はifと同じレベルに字下げしたほうがいいかなと思います.
そうなっているところもあるので上のは偶然かもしれませんが.
Re: 3D 武器を持つとチカチカする
Posted: 2014年10月05日(日) 20:14
by softya(ソフト屋)
> 症状は、武器を持つと画面がチカチカするといものです。
例えばプログラムでアニメの再生をスロー再生とかして確認できませんか?
こういうのは頭ひねって考えないとバグが取れません。
銃の時と同じで色々と手を変え品を変え試してみましょう。
Re: 3D 武器を持つとチカチカする
Posted: 2014年10月05日(日) 20:55
by ptolemy
顔芸 さん
関数化したいと思います。
移動のほかに銃の制御も関数にしてもっと見やすくしたい思います。
アドバイスありがとうございました。
softya(ソフト屋) さん
原因の追求方法についてありがとうございます。
アニメに関して色々試したいと思います。
しかし、武器を持っているときのみチカチカするので
どれを変えていけばいいか検討がつかなかったです。
一応、怪しい[武器の描画,アニメ速度,カメラ]辺りを探ってみます。
Re: 3D 武器を持つとチカチカする
Posted: 2014年10月06日(月) 17:16
by ptolemy
一応、原因はわかりませんが、原因となってる箇所を発見しました。
コード:
HitPolyDim5=MV1CollCheck_Sphere(STAGE,-1,PLAYER_CAP1,200.0f);
HitPoly1=MV1CollCheck_Line(STAGE,-1,StartRay,EndRay);
という箇所です。
モデルのSTAGEとのあたり判定関数が原因でチカチカしてます。
この部分を消してみたら、チカチカしなくなりました。
また、気づいた点として、
HitPolyDim5の後処理をしてませんでした。
GAME.cppの最後の部分に
コード:
MV1CollResultPolyDimTerminate(HitPolyDim5);
を追加しました。
しかし、後処理の問題では、ありませんでした。
なぜか、敵のモデルEnemyとのあたり判定は、チカチカしないので
なにかSTAGEの処理をし忘れてるのかもしれないのでもう少し調べてみます。
Re: 3D 武器を持つとチカチカする
Posted: 2014年10月06日(月) 17:20
by ptolemy
いま、コリジョン情報のセットアップで分割数を
いじったらチカチカが軽減しました。
たぶん分割数がちょうどよくなってないみたいです
Re: 3D 武器を持つとチカチカする
Posted: 2014年10月06日(月) 17:43
by ptolemy
一つ質問します。
過去トピックで分割数について前に少し質問したのですが、
分割数は、どうやって求めればよいのでしょうか?
ステージの総ポリゴン数÷プレイヤーのポリゴン数
みたいな感じで求められますか?
また、こういうのは式で求めれないものですか?
一応ステージのモデルが
落として使い倒せ!3DCGモデル & MikuMikuDanceフリー素材集こちらで
プレイヤーのモデルが
鍛冶屋黒胡椒@Wiki←ここの高校生というモデル
です。
Re: 3D 武器を持つとチカチカする
Posted: 2014年10月06日(月) 20:08
by softya(ソフト屋)
そもそもコリジョンしてチカチカするって事が理屈として変なので、その部分だけのシンプルなプログラムを別に作ってテストすべきだと思います。
[分割数を計算で求める]
部分部分でポリゴンのサイズが違うので定量的な計算式は立てられないでしょう。
処理が適切かは分割数を変えながら処理時間が大体の場合において最小になるように調整するしかありません。当然ms単位の時間計測が必要です。
Re: 3D 武器を持つとチカチカする
Posted: 2014年10月06日(月) 20:40
by ptolemy
分割数は計算では求めれないんですね。
XYZ(1,1,1~32,8,32)を計測してみたいと思います。
チカチカするというか、武器を持つと黒い画面が
一瞬表示されるというのが秒単位でその黒い画面がでる
というのをチカチカと表現させていただきました。
一応、テストのほうをしてみます。
Re: 3D 武器を持つとチカチカする
Posted: 2014年10月07日(火) 00:53
by ptolemy
解決いたしました。
X分割数1~32(YZは1)
Y分割数1~8(XZは1)
Z分割数1~32(XYは1)
で72回測定して、一番速い構成にしました。
そして最速の(26,2,26)を指定したらまだチカチカしていました。
でも、一定の周期で3回チカチカして、その時だけ処理時間が30くらいになっていたので
ずっとプログラムを見ていたら、コピペで貼っていた部分が原因でした。
マウスの入力情報を取得する
コード:
int Mouse = GetMouseInput ( ) ;
というのをメインループ中に3回も書いてました。
それが原因で一瞬負荷がかかってしまっていました。
チカチカは、分割数とケアレスミスの二つが原因でした。
今回教えてもらったバグの原因の追究の仕方をこれからも使って、できるだけ質問回数を減らしていこうと思います。
また、顔芸さんからのご指摘があった関数化についてですが、同じような状態で書いている箇所をできるだけ関数にします。
今回は、本当にありがとうございました。