注意!
このページはMIPSCPUやコンパイラの特性調査等の個人的な探究欲に基づいているため、飽きたら放置プレイの可能性大です
y氏公開の最新バイナリは0.02y32であり、y28と比較して若干パフォーマンスが良いようです。あくまで比較はソース公開された最新のy28版です。
y氏の活動復活(?)の際にはせっかくなのでコード提供しようかと目論んでますw
ややこしいことになるので改良版と称しサイト等で紹介などしないでください。
テストしてくれる方を呼びかける紹介は歓迎。
前置き
開発ソフトはPS2Devです。(PSPtoolchainは以前NesterJをBuildした際メモリ配置が悪いのか何故かかなり遅くなったのと、エミュレータは
CPUでゴリゴリやるのがメインなのでAPIが必要でないため)
ソースコードはSNES9X1.43ソースにy氏公開版ソース(y28)を上書きして使用しています。Makefile.eeはy28についてきたものを使用し
make --makefile=makefile.ee
でBuildしてます。はっきり言ってここらへんは適当です。^^;
※上記状態でBuildしてもy氏公開版のy28バイナリかなりサイズが違ってたような・・・。elf2pbp.exeやoutpatch.exeが違うからかなぁ?
現在のステータス
y氏バージョンの実験は終了しました。最後の0031のソースコードを公開する予定でしたが、PCをリカバリする際に消えた可能性があります(´・ω・`)
バックアップとっていたと思うので他のPCやバックアップメディアからサルベージ出来次第公開します。すみません。
速度比較
動作比較対象ソフトは SNES9X
Demo V1.16 (PD) を使います。何故これを選んだかというと、回転処理をしているのを見るのが好きだからですw
SNES9x Demo V0.24 (PD)も追加しました。パレット操作系とサウンド系も参考として確認していますが計測結果は載せていません。
測定用コンテンツ | サウンド処理 | 特徴など |
---|---|---|
SNES9X Demo V1.16 (PD) | ○ | 回転っていいねぇ〜 |
SNES9x Demo V0.24 (PD) | なし | サウンド処理が行われていないのでCPUエミュレーション部の高速化測定に最適。 |
Lynchpack3(PD) | ◎ | サウンド処理が上のより複雑みたい。 |
Rapid15(PD) | なし | パレット切り替えが激しい。連射測定機能つきw |
SNES9X設定
FrameSkip 00 Auto FrameSkip ON Screen Size Full BL Show FPS ON VSync OFF Sound ON Sound Rate 11kHz Transparency ON Graphic Speed x1.0 Sound Speed x1.0 ※念のためバッテリーは50%以上もしくはAC接続で測定すること |
測定方法
ファイルを選択し、デモが始まったらメニューに入る。その後、Resetを選択後 20 秒間動かしたあとの左上の数値を測定する。
数値は描画したフレーム数です。
Demo V0.24は
最大理論値1000(計算誤差のため999とか998出る)。
Demo V1.16は
最大理論値1200(計算誤差のため1199とか1198出る)。
222MHz,266MHz,333MHzの各クロック3回測定(メニューからReset)しその平均を算出(小数点は四捨五入)
当然平均FPSは数値を20で割ると求まります。
また、カウンターは簡易なものなので内部値がオーバーフロー起こすとカウントしなおしますので注意(めったに無いけど)
結果
ファームウェア1.00のPSPでの測定結果です。
ここで公開しているバイナリはテストバージョンです。他では絶対に配布はしないでください。有志によるテストのための公開です。
STATEセーブに互換性がなくなっている可能性が高いです。
ある程度進んだところで修正をしますので、常時使用はしないでください。
Build No | ベース | 変更点 | Demo V0.24 (PD)結果 | Demo V1.16 (PD)結果 | 備考/Memo | ||||
---|---|---|---|---|---|---|---|---|---|
222MHz |
266MHz | 333MHz | 222MHz |
266MHz | 333MHz | ||||
0001
(1,733,992) |
-
|
716 |
870 | 999 | 696 |
840 | 1064 | これが基準 | |
0002
(1,724,460) |
0001
|
646 |
786 | 991 | 689 |
833 | 1054 | gp相対適用値を 変更したけど逆効果 |
|
0003
(1,733,888) |
0001
|
740 |
899 | 999 | 724 |
867 | 1079 | ||
0004
(1,733,200) |
0003
|
747 |
907 | 999 | 710 |
856 | 1076 | ||
0005
(1,731,904) |
0004
|
772 |
938 | 999 | 712 |
860 | 1086 | ||
0006
(1,731,488) |
0005
|
794 |
962 | 999 | 746 |
898 | 1131 | Flag最適化 | |
0007
(1,729,272) |
0006
|
675 | 822 | 999 | 701 | 842 | 1062 | コード減少確認したが遅くなる。 命令キャッシュヒット率減少のため? |
|
0008
(1,726,496) |
0006
|
681 | 828 | 999 | 688 | 829 | 1044 | 想定の範囲内。3歩進んで2歩下がる | |
0009
(1,724,280) |
0007
|
842 | 997 | 999 | 759 | 905 | 1118 | 0007+0008。予定通りの結果に満足。よしよし。 | |
0010
(1,723,640) |
0009
|
829 | 993 | 999 | 742 | 888 | 1095 | どのバージョンなのかテスト時数度混乱したので 0010からタイトルを"uoSnes9x 0.02y28 Ruka Optimize"に変更 |
|
0011
(1,708,024) |
0010
|
843 | 997 | 999 | 723 | 865 | 1066 | CPU処理部は最適化されてる模様。ただバランスが悪い。 SA1CPU使ってるソフトでのテストできてません…動くの? |
|
0012
(1,705,800) |
0011
|
APU調整 | 849 | 997 | 999 | 726 | 871 | 1084 | 他の部分のバランスとらないと効果でない・・・ |
0013
(1,705,792) |
0012
|
APU調整その2 | 822 | 989 | 999 (1266) |
678 | 815 | 1023 | うーむ・・・ |
0014
(1,705,600) |
0013
|
APU調整その3 | 823 | 989 | 999 (1267) |
681 | 820 | 1031 | とりあえずAPUは暫く放置。 |
0015
(1,702,016) |
0014
|
パレット調整 | 818 | 985 | 999 (1258) |
705 | 849 | 1066 | パレット操作ほとんどしてないから影響ほぼなし |
0016
(1,702,016) |
0015
|
アセンブラ使用の効果検証 | 819 | 985 | 999 (1260) |
705 | 850 | 1067 | 効果ほとんどなし。お試しの数箇所だけだからなぁ・・・ |
0010〜0015までの対応に逆に速度が落ちる修正があったので0009からやり直し。 PSPSDKを適用してみるテスト |
|||||||||
0017
(1,027,184) |
0009
|
0009のコードをPSPSDKに移植 | 764 | 927 | 999 (1178) |
618 | 733 | 897 | めちゃくちゃ遅くなった。PSPSDK使わないほうがよさげ (MediaEngine適応しようとしていたのでKernelMode動作です。) |
0018
(1,149,652) |
0017
|
描画処理をMediaEngineにやらせる | 744 | 904 | 999 (1143) |
797 | 970 | 1188 | 速くはなってるけど、失敗。作り途中なのでバグで止まります。 失敗で破棄するのでバグ修正しません。 ファイルに解説.txtつけてます。 参考程度に。 |
PSPSDK挫折。SNES9XはPSPSDK使わなくても問題なしなのでPS2SDKでいく。 | |||||||||
0019
(1,713,488) |
0009
|
0009に0010〜0014までの変更をチョイスして対応 + 描画関連変更その1 |
814 | 986 | 999 (1251) |
776 | 934 | 1155 | 描画関連のコードに手を出す。 Mode7関連の描画変更したから回転速くなる〜♪ |
0020
(1,707,480) |
0019
|
描画準備部の効率化 | 813 | 984 | 999 (1248) |
777 | 935 | 1153 | 掛け算をシフト演算に変更、その他変数見直し 結構弄ったのにブレが少ない。そろそろ爆上げか!? |
0021
(1,707,544) |
0020
|
描画効率化実験その1 | 845 | 997 (1026) |
999 (1303) |
775 | 931 | 1149 | DrawTile若干修正により2Dが速くなる 他のDraw系も修正すればかなり早くなる!? |
0022
(1,709,848) |
0021
|
カウンタをつけて各処理測定できるようにした。 タイトルも"uoSnes9x 0.02y28 Ruka Counter"に変更 |
カウンタ90個表示してるので遅いです。 測定対象ではありません。 |
各処理の処理量測定用です。画面に90個のカウンタが常時表示しています。 |
|||||
0023
(1,709,456) |
0022
|
1,2,364,65変更(1,2,3は暫定) | 785 | 950 | 999 (1207) |
778 | 936 | 1158 | 1、2、3の修正により2D遅くなる。測定対象物だと表示物により 遅くなるが市販ゲームだと効果あり!?(とりあえず暫定) |
0024
(1,707,536) |
0022
|
0023から1,2,3適用修正消して 未使用メモリなど削除 |
828 | 992 (1004) |
999 (1274) |
755 | 911 | 1146 | メモリ配置の影響が地味にあるなぁ。。。 |
0002〜0024は地味な修正個所ばかり。特にそんなので変わるの?的な修正ばかりやってたのにまぁまぁ早くなった。 次はグラフィックRender周りの修正に力いれてみる。(地味な修正に飽きたとも言う) |
|||||||||
0025
(1,716,400) |
0024
|
Mode7の回転関連のコード改良その1 | 848 | 997 (1024) |
999 (1301) |
837 | 1009 | 1193 (1288) |
回転60FPS達成。まだ高速化の余地はあるがとりあえず。 |
0026
(1,716,688) |
0025
|
mul100万回駆除、他 | 856 | 998 (1042) |
999 (1322) |
848 | 1021 | 1194 (1304) |
1秒間約100万回の掛け算処理をしていた個所があったので変更した。 ちょっとの工夫でこの美味さ。 |
0027
(1,727,744) |
0026
|
y28 -> y33ベースに移行 | 838 | 992 (1015) |
999 (1285) |
854 | 1024 | 1188 (1308) |
y氏よりy33ソースを頂きましたのでマージ+ちょい修正 チートなどの機能が増えた分若干おそくなったけど相殺されたのかな? |
0028
(1,716,288) |
0027
|
0026+0010に似た修正 | 869 | 999 (1056) |
999 (1342) |
828 | 995 | 1192 (1273) |
CPU最適化したコード適用。CPU処理がメインと思われる2Dにて早く なったのが分かる。回転のほうはメモリ配置ズレかな? |
0029
(1,716,544) |
0028
|
0024->0025時のMode7バグ混入の修正 | 782 | 999 (948) |
999 (1208) |
827 | 998 | 1192 (1273) |
回転物の抜き色処理しないバグ修正。回転処理部のコード変更のみなのに 回転しないほうが遅くなる。メモリ配置の問題か!?興味深い… |
0030
(1,717,408) |
0029
|
DepthBufferの扱い方変更 | 902 | 999 (1097) |
999 (1392) |
864 | 1036 | 1196 (1330) |
ZBufferとZSubBufferの処理方法を変更。暫定コードながら早くなったのが 分かる。コードを整理すればもうすこしいけそう。 |
0031
(1,718,304) |
0030
|
Stateセーブ時のサムネイルバグ修正 | 895 | 999 (1089) |
999 (1382) |
847 | 1019 | 1195 (1304) |
0029修正に伴うStateセーブ時のサムネイルが真っ黒になってしまうバグ修正 バグ修正しただけなのに速度が地味に落ちてる。調整難航 |
2007/3/26 研究打ち切りました。 | |||||||||
0032
(935,732) |
0027
|
2010/6/5
再開 |
843 | 999 (1023) |
999 (1201) |
651 | 769 | 942 |
PSP1000だと正常に動作するのに、PSPgoだと0031では画面表示 癖がありすぎ・・・PDROMしか試してないためゲームは動かないかも。 3年ぶりなのにソースコードすらすら読めて笑ったw |
0033
(926,360) |
0032
|
HBL制限を強制的に無くした |
716 | 873 | 999 (1107) |
763 | 903 | 1115 |
-G0オプションを無くし、GPレジスタを使用可能にした。 |
0034
(884,440) |
0033
|
メモリ配置調整と一部インライン展開廃止 |
817 | 986 | 999 (1201) |
770 | 913 | 1128 |
少し回復? |
884,184
|
|||||||||
今思い浮かぶ限りのネタをやると0050は余裕で行く予感^^;。というか、既に没になったバージョンが100超えそう
上記結果を試してみて、結果と極端に違う値になったり、動作異常が起こった場合は連絡していただけると助かります。
その際は異常の発生した番号のベースとなっている番号でも発生するのかを確認してください。
基本的には出力画面、出力サウンド両方がy28と同じ結果になるのを前提としています。
その他
spc700.cppのL1122のWork32はInt32の間違いと思われるので修正。(0003)
spc700.cppのL206のInt16はWork16の間違いと思われるので修正。(0004)
資料等へのリンク
www.snes9x.com SNES9X総本山。
snesadvance.org 65816の仕様書があり、読み込み時にROM自体にパッチをあてて速くしようと試みるものもある。
どのくらい変わるのだろうか・・・面白そう。
cgfm2.emuviews.com SPC700に関する資料あり。