DXライブラリPSP(DXP)をつかって、
DXライブラリのゲームをPSPに移植してみよう!
(CFW必須、ver0.5.7、3D不可能)
いやー、移植するのに、かなりのトラブルを起こしましたw。
同じことをしている同志たちの力に慣れればと思い、
トラブルを起こした後の反省点を考慮して、移植の説明をしていきたいと思います。
そして、DXPを開発してくださった憂煉さんに感謝!
※テストは DXP(0.5.7) PSP-2000で行っています。
※テスト結果や、言ってることが 必ず 正しいとは限りません。
気になるのなら、自分で試してみることを推奨します。
------------------------------------------------------------------------------------
☆PSPの性能とDXPの注意点
・CPU 222MHz (最大 333MHz) , DXPがフル稼働させてるかは知らない
・メモリ 32MB , …っといっても、少し、DXPに食われてるw (実際に使えるのは24MBらしい)
・画面サイズは 480*272
・DXPでは、画像は PNG のみ サイズは 512*512 以下
・DXPでは、音は、MP3 のみ(+現バージョンでは、44.1khzのみ再生可、22khzは不可能)
・一部の文字が入力化けする。\を前に入れよう (間違ってるかも)
------------------------------------------------------------------------------------
☆問題点
理論上は、移植可能ですが、速度的な面で不可能な物はたくさんあります。
(例、BGMのストリーミング再生など)
処理が軽い物、もしくは軽くなるように設計されたものでない限り
移植は不可能 (速度的な面で)
と考えて下さい。
ソースを1からPSP用に作らない限り、ろくな速度がでないってことです。
------------------------------------------------------------------------------------
☆移植について
移植時の注意を述べて生きたいと思います。
DXPのwikiの導入について、あたりをみながら、こちらも読んでみて下さい。
・SDKのインストール時の注意
最初、PSP,SDKを入れるとき、上記5つのチェックは、はずさないようにしましょう。
はずしてしまうと、コンパイルエラーになるものがあります。
・makefileの設定
C++使っている場合は、"lstdc++" 追加しなきゃダメですよ。
をインクルードしてる場合も一緒です。
・DrawBox や DrawImage を 先に、関数化
もし、DrawBoxやDrawImageを直に書いているのなら、
実行速度がやや落ちますが、画面あわせのために、任意の関数に変換しましょう
後から、その関数に、640*480→480*272 へ座標を変換すれば、楽です。
・画像は、片っ端から縮小
小規模なら、後からプログラムで縮小もありですが
ロード時間考えますと、縮小した方がよいです。
もし、透過PNGで縮小したくて、photoshopないなら、
GIMPオススメですよ!(フリーなのに便利すぎるだろうw)
・DXPに存在しない関数
DXPにはDXライブラリの関数がないところもあります。
使っているところがあったら、省きましょう
・DeleteGraph 等の関数に注意
初期化などで、画像がないのに、DeleteGraph を意味もなく呼び出したり
SetDrawBlendMode(int x), 0 <= x <= 255 で x に256とか入れる。
この時、本家のライブラリでは、問題ないのですが(多分)、
DXPでは、意味不明な現象(他のメモリの書き換えかw?)がおきます。
もし、やってたら ソースの見直し推奨です。
・その他のバグについて
元々、PC上で、バグを起こしているかもしれません。
PSP上で、同じ現象が起きるとは限りません。(配列のオーバーアクセスとか)
ソースの見直しも大切ですよ。
------------------------------------------------------------------------------------
☆高速化について
やっと移植できたー、そして5FPSしかでねぇええ
そんな貴方に、早くなる方法をいくつかご紹介しよう
・sin cos tan atan2 はテーブル化
PSP上では三角関数の計算速度は致命的です。
ちょっとしたテストで、
sin 10000 loop , 642 ミリ秒
とでました。
………1000回で64ミリ…だと…!?
しっかりテーブル化しましょう。
テーブル化後、クラスの関数の呼び出しによるテスト
table sin 10000 loop 13
まだ、13 ミリ秒もかかってしまうとな!?
しかし、なんとか実機でもやっていける速度なので
これ以上は追求しないことにしますw
え?atan2のテーブルわかんない?ググって下さい
・double 型は止めて。float型に置換
割り算のテスト
double / double , 1000000 回 9249 ミリ秒数
float / float , 1000000 回 339 ミリ秒数
int / int , 1000000 回 339 ミリ秒数
明らかに、double型は遅いです。
すべて、float型に置換しておきましょう
(これはPSP上であって、PC上だとdoubleのほうがはやいんじゃないかな…?)
因みにキャストのテスト
double → int , 1000000 回 531 ミリ秒数
float → int , 1000000 回 191 ミリ秒数
int → int , 1000000 回 130 ミリ秒数 (なんもしてないじゃんw)
・math.h → fastmath.h
ちょっとはやくなる…かも…
・関数はinlineの指定をいれておく
PSPは意外と関数の呼び出しが遅いです。
inlineを入れることで少しだけ早く…
・回転描画の節約
描画テスト
DXライブラリPSP 通常描画 10000回 222 ミリ秒数
DXライブラリPSP 回転拡大描画 10000回 425 ミリ秒数
※描画 は 裏に任意の回数描いた後に、screenflipしてます
回転描画しないでいいものは、通常描画にしましょう。
・一部の関数の排除
DXPの関数の中には、速度が遅すぎる物も存在します。(DrawOval とか)
使用しないようにしましょう。
・気になったこと
for文を500*20の10000回を行い、中に適当なif文が入ってるとき、
if文だけの処理で、20ミリ秒ぐらいかかりました。
大量のループに弱い可能性があります。もしそうだとしたら、アルゴリズムの見直しを…
(特に弾幕STGとか、処理が追いつかなくなるかも)
・BGMについて
メモリにおいて、再生するBGMを常に1つにし、再生時間を、1:30以内におさめれば、
なんとか容量的にメモリに入ります (DXPの掲示板から 2 * 44100 * 2 * 90 ≒ 15MB)
ストリーミング再生の設定では、遅いです。
もし遅い場合、音楽の設定を考える必要もありますね…。
------------------------------------------------------------------------------------
☆シューティングを作ろうと思っている方へ
自分は遊んで、弾幕STGを移植させてみようとしましたが、
設計の面で問題があり、理想的な速度は出せませんでした…。
例えば、敵と弾の判定、敵100体と弾100個とすれば、
単純に計算すれば、10000のループが必要です。
この計算を16ミリ秒以内に行いかつ描画するには、結構つらい物があります。
もし、作っていこうと思い、理想的な速度を出したい人へ
・処理、描画ともに、30FPSで妥協
・設計段階で、すべてにおいて、最適化、高速化の考慮をし、実装する
上記のどちらかを行えば、
BGMならしつつ、弾を1000発ほど表示して、処理落ち無しを保つことも 可能 です。
ゲーム機でゲームを作ることがこれほど大変だとは思いませんでしたねぇ…
以上でおわりです。参考になりましたか?
戻る