ちく のPSPゲーム移植講座!




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発ほど表示して、処理落ち無しを保つことも 可能 です。




ゲーム機でゲームを作ることがこれほど大変だとは思いませんでしたねぇ…

以上でおわりです。参考になりましたか?





戻る