ページ 11

毎フレームにおける平方根や二乗計算につきまして

Posted: 2012年3月27日(火) 11:34
by ジャム
こんにちは、いつもお世話になっております。

私は今3Dでゲームをつくっています。その中で、自身が操作するキャラクター(以降PC)とマップ上に配置したNPCとの会話をさせるプログラムを書きたいと考えております。

しかし、そこで問題が発生しました。PCとNPCとの距離を測る部分を組み込むとプログラム全体が起動しなくなりました(ウインドウは出るものの終始画面は真っ暗)。その部分をコメントアウトすれば起動します。エラー等は出ておりません。
フレームごとに計算させていたので、その負荷が大きかったせいでしょうか...


仕様は、
毎フレームPCとNPCの距離を、二点間のベクトルを求め、そのベクトルの二乗を計算することで求め、それが一定距離の二乗より近くになると別に確保しておいたフラグ変数をたてる。遠くなるとフラグを折る。
二乗のままにしたのは平方根を使わないようにしたためです。(結局効果は得られませんでしたが...)


そこで質問なんですが、
1.毎フレームこのような計算をすることに無理があったのでしょうか。

2.他に何かいい方法がありましたら是非ご享受ください。


お願いいたします。

Re: 毎フレームにおける平方根や二乗計算につきまして

Posted: 2012年3月27日(火) 11:41
by softya(ソフト屋)
そのぐらいでは処理落ちしませんので別の原因だと思います。
各処理の処理時間の計測をしてみて下さい。

[補足]
ジャムさんと言う名前の方に心当たりがないのですが名前を変えられませんでしたか?
名前を統一して頂くと前回とのつながりが出来て話がつながりやすくなるのでお願いします。

Re: 毎フレームにおける平方根や二乗計算につきまして

Posted: 2012年3月27日(火) 12:58
by ジャム
お早い回答ありがとうございます。

原因はほかにある、ですか...
まだまだつたないプログラミングスキルですので否定できません。

そこでFPSを取得してみました。

問題の関数を抜いた時のFPSは平均60ほどあり、ほとんど変動もしませんでした。

下記に距離を測るソースコードのほうを張らせていただきます。当方DXライブラリを使用させていただいております。
       
       //一つ目の引数でNPCの位置情報、二つ目の引数でPCの位置情報を取得して、PCからNPCへのベクトルを求める
       VECTOR vec = VSub(NPC->GetPos(), Player->GetPos()); 
float len = VSquareSize(vec);  //ベクトルを二乗して、二点の距離の二乗を出す
if(len <= 10000) {   //二乗した値が10000以下(これを一定距離の二乗とする)だったら
Flag = true;  //フラグをセット
} else {
Flag = false;
}

コードに何か問題がありますでしょうか。

Re: 毎フレームにおける平方根や二乗計算につきまして

Posted: 2012年3月27日(火) 13:06
by softya(ソフト屋)
FPSで計測するのではなく、FPSで使っている時間計測の仕組みを応用して重そうな処理の始めと終わりで時間差分を求めて下さい。これが時間計測です。
これをprintfDXなどで画面に表示します。

それとソースコード自体に問題は感じませんが、これが1フレーム辺り数万回行われるな別です。

Re: 毎フレームにおける平方根や二乗計算につきまして

Posted: 2012年3月27日(火) 13:54
by ジャム
たびたびありがとうございます。

NPCが複数いる場合に備えてfor文で回していたところにミスが見つかりました。
アドレスのアクセス違反が原因のようでした。

質問自体が的外れでした...

softyaさんの言うとおり他のところにミスがあり、速く修正することができました。

この度はありがとうございました。