ページ 1 / 1
PSPにて
Posted: 2009年10月05日(月) 09:49
by ft
DXライブラリportableで龍神録プログラミングの館さんを参考にPSPでの起動を試みております。
現在、第14章と15章あたりなのですが、大量の弾を発射させるとどうも処理落ちしてしまいます。
ソースはほぼそのままです。
一度、弾の描画graph_bullet();をすべて削除して起動させてみてみましたが、
弾が増える箇所で重くなってしまいました。
これは弾の座標計算の量が増えたため起きた現象なのでしょうか?
それとも何か別の要因があるのでしょうか?
Re:PSPにて
Posted: 2009年10月05日(月) 12:40
by softya
PSPについては詳しくありませんが、龍神録ってdoubleとか平気で使ってますがパソコンなら専用演算回路があるので良いのですが、PSPではソフトでdoubleを計算しているのではないでしょうか。そのため劇的に遅くなっているのでは?
PSPのVFPUの浮動点演算速度はすごいと聞きましたが、C言語で普通に組んでいる時は動作していませんよね?
floatとdoubleで、どのぐらい差が有るか調べてみる事をお勧めします。
Re:PSPにて
Posted: 2009年10月05日(月) 21:04
by Justy
>PSPではソフトでdoubleを計算しているのではないでしょうか。そのため劇的に遅くなっているのでは?
PSPはやったことがないので詳しくはないのですが、それはパフォーマンスに
大きな影響を与えそうですね。
# ftさん
変数で使用する型は勿論ですが、演算中の定数や数学ライブラリも float版を使うように
しないと doubleが混ざってしまいますので書き換えるのはなかなか大変かもしれません。
ちなみに -fshort-doubleコンパイルオプションも使えそうですが、使用するライブラリとの
整合性や可変引数での扱いがおかしくなりそうなので、避けた方がいいかもしれません。
Re:PSPにて
Posted: 2009年10月06日(火) 00:45
by ft
プログラミングについて勉強不足で申し訳ないのです。。。
まず最初にdoubleで宣言しているものをすべてfloatに変えたら動きませんでした。
いろいろ弄っていたのですが、
弾の座標を計算していると思われるshot.c中のshot_calc()の、
shot[n].bullet.x+=cos(shot[n].bullet.angle)*shot[n].bullet.spd;
shot[n].bullet.y+=sin(shot[n].bullet.angle)*shot[n].bullet.spd;
という個所を次のように、
shot[n].bullet.x+=cos((float)shot[n].bullet.angle)*shot[n].bullet.spd;
shot[n].bullet.y+=sin((float)shot[n].bullet[i].angle)*shot[n].bullet[i].spd;
そしてstruct.c中の
//弾に関する構造体
typedef struct{
//フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの種類
int flag,knd,cnt,col,state,till,eff;
//座標、角度、速度、ベースの角度、一時記憶スピード
double x,y,angle,spd,base_angle[1],rem_spd[1];
}bullet_t;
という個所を次のように
//弾に関する構造体
typedef struct{
//フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの種類
int flag,knd,cnt,col,state,till,eff;
//座標、角度、速度、ベースの角度、一時記憶スピード
float x,y,angle,spd,base_angle[1],rem_spd[1];
}bullet_t;
これらの箇所だけ変えたら、今度は弾の描画がなくなってしまいましたが、
処理落ちは確認されませんでした。
Re:PSPにて
Posted: 2009年10月06日(火) 09:38
by toyo
言語は c ですか c++ ですか
Cならcos( f )ではなくてcosf( f )のようにfloat用の関数にしないと結局doubleで計算されます
shot[n].bullet.xなどの変数の宣言自体からfloatに変更しましょう
Re:PSPにて
Posted: 2009年10月06日(火) 09:57
by toyo
ちょっと調べたらこんなレスがありました
http://gameurawaza.me.land.to/test/read ... 814877/503
これが本当ならdouble=>floatは効果なさそうですね
単にグラフィック処理が追いつかないだけでしょうか
PSPみたいな組み込みに近いやつで処理速度求めるならライブラリ使わないでゴリゴリ書いた方がいいのかもしれません
Re:PSPにて
Posted: 2009年10月06日(火) 10:48
by softya
そうですね。
doubleとfloatのコアの部分は差は無いかも知れませんが、double→float(計算)→doubleの変換が入っているだけでもロスはロスです。
floatとdoubleをそれぞれ百万回ループで計算速度の差を計測するなど実際に試して実験して見ましょう。なんとなく早くなった気がするってのが後々不幸の元です。正しいデータを取る事の手を抜くと自分にお返しがありますよ。
この手の浮動少数点系の貧弱なハードでは、全てfloatで計算をするのは当たり前としてint→floatやfloat→int変換がなるべく起きないように気をつけてください。この時間ロスも馬鹿に出来ません。
toyoさんも書かれているsinfなどの活用も忘れていはいけませんね。
Re:PSPにて
Posted: 2009年10月06日(火) 11:11
by Mist
> doubleとfloatのコアの部分は差は無いかも知れませんが、double→float(計算)→doubleの変換が入っているだけでもロスはロスです。
toyoさんのリンク先読んだけどPSPには倍精度は存在しなくて単精度しかないってことじゃないの?
double記述はコンパイル時にfloatと同じと解釈されるって読めるけど。
だとすれば実行時のロスはないんじゃないかと。
試してみることは悪いことではないと思いますけど。
Re:PSPにて
Posted: 2009年10月06日(火) 12:09
by ちゃお
龍神録のプログラムだと当たり判定が、表示している(敵弾と自機)や(敵と自機弾)になってるし、当たり判定をバケット分割式にするとか色々工夫がいるかも。
それで少しは処理落ちを緩和できないかな。
Re:PSPにて
Posted: 2009年10月06日(火) 12:16
by softya
>double記述はコンパイル時にfloatと同じと解釈されるって読めるけど。
floatとdoubleは、sizeofで確認できますので、確認は簡単だと思います。
とりあえずプログラミングで思い込みは間違いの元ですので、試してみるか正式な資料を探すかどちらか無いと思います。試しもせず結論付けるのは、私はアバウトすぎると思うんですけど。
特に処理落ちは、地道に原因となるネックの部分を1つづつ潰して行くことが大事なので怪しいところは全部疑うしかないかと。
Re:PSPにて
Posted: 2009年10月06日(火) 14:32
by toyo
PSPの実行環境があるので試してみましたがsizeof(double)は8でsizeof(float)は4でした。
変数宣言だけでも実行ファイルに違いが出るはずなので先ほどのURLは眉唾ですね。変なの張ってすみません。
無駄な型変換を避ける意味でも変数を float に統一する価値はありそうです。
三角関数がボトルネックならテーブル参照にする方法もありますね。
0-90度のsinかcosだけテーブルにすればすべて変換できますし。
Re:PSPにて
Posted: 2009年10月06日(火) 14:50
by GPGA
PSPを生業としている私としては、解決方法は2つあると思います。
一つはPSPが積んでいるFPUに浮動小数計算をすべて委任すること。
もう一つは浮動小数は使わず全て固定小数で計算すること
Re:PSPにて
Posted: 2009年10月06日(火) 15:28
by ft
>>toyoさん
dxライブラリportableのサイト
ttp://dxlibp.sourceforge.jp/
のチュートリアルにて、「test.c」を作っていたので.cのままでやっております。
龍神録さんのC++のソースをほぼそのまま移行してたらエラーする箇所もいくつかありました。
あとdouble→floatに変えてみると動かなくなったり、途中で停止してしまうため、
もう一度最初からfloatというのを確認しながら、次はC++で組んでみたいと思います。
また調べていたら読み込んだ画像をPSPのvramに置くとかなんとかという事が書かれていましたが…
この辺はどのようにしたらいけるのか今のところイマイチです。