SNES9X0.02y28〜y33を使ったコード実験室

注意!
このページは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)
-

SNES9X 1.43+uoSNES9X0.02y28
ノーマル

716

870 999

696

840 1064 これが基準
0002
(1,724,460)
0001

-G 16追加(Default-G 8)

646

786 991

689

833 1054 gp相対適用値を
変更したけど逆効果
0003
(1,733,888)
0001

グローバル変数の変更その1

740

899 999

724

867 1079  
0004
(1,733,200)
0003

グローバル変数の変更その2

747

907 999

710

856 1076  
0005
(1,731,904)
0004

グローバル変数の変更その3

772

938 999

712

860 1086  
0006
(1,731,488)
0005

SPC700 最適化

794

962 999

746

898 1131 Flag最適化
0007
(1,729,272)
0006

SPC700 抜本変更

675 822 999 701 842 1062 コード減少確認したが遅くなる。
命令キャッシュヒット率減少のため?
0008
(1,726,496)
0006

65c816改良その1

681 828 999 688 829 1044 想定の範囲内。3歩進んで2歩下がる
0009
(1,724,280)
0007

0007+0008

842 997 999 759 905 1118 0007+0008。予定通りの結果に満足。よしよし。
0010
(1,723,640)
0009

さらにSPC700部最適化

829 993 999 742 888 1095 どのバージョンなのかテスト時数度混乱したので
0010からタイトルを"uoSnes9x 0.02y28 Ruka Optimize"に変更
0011
(1,708,024)
0010

65c816の大改造!!劇的ビフォーアフター
〜とりあえずやりました〜編

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達成。まだ高速化の余地はあるがとりあえず。
2Dのほうの機嫌もいいようだ。

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 再開
PSPgo6.20+HBL R85使用時のフリーズ問題修正
開発環境をPS2SDKからPSPSDKに変更

843 999
(1023)
999
(1201)
651 769 942

PSP1000だと正常に動作するのに、PSPgoだと0031では画面表示
がバグるので0027verをベースに変更。

癖がありすぎ・・・PDROMしか試してないためゲームは動かないかも。

3年ぶりなのにソースコードすらすら読めて笑ったw
PSPSDK+HBL制限により遅くなるがPSPSDKを使った0017よりは速い。

0033
(926,360)
0032

HBL制限を強制的に無くした
(これHBL側のバグ? )

716 873 999
(1107)
763 903 1115

-G0オプションを無くし、GPレジスタを使用可能にした。
Demo1は遅くなってるけどDemo2は早くなる。
Demo1が遅いのはメモリ配置の影響?
ゲームならDemo2のように若干速くなるかも。

0034
(884,440)
0033

メモリ配置調整と一部インライン展開廃止

817 986 999
(1201)
770 913 1128

少し回復?
Demo1の改善が著しい。

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に関する資料あり。