ドリクラエミュ再々高速化

 遂に念願のアイスソード、じゃなくてソースコードの整理を果たしたぞ! 果たしたぞ、、(疲弊)。
 えっとまぁそれだけじゃないんですが、今回は人様には面白味のない話です、はい。
 ぶっちゃけ今はお出し出来るようなネタは何一つ挙がってませんし。いやプログラム的には大分あれこれ手を着けてるんですけどね。それが目に見える結果を生むかはまた別の話。

 正直、自分はただ弄りたいものを弄って遊んでいるだけなので、、、。
 もっと欲求に忠実なネタは他の人に頑張って貰えればってのはありまして。巨乳化ネタでフォロワー数が増える度に申し訳ない気持ちにもなるんですが。「本当に申し訳ない」某博士の精神でここは一つ(すっとぼけ)。(まぁ正直、たまに気が向いたらやるくらいの温度感で勘弁願えればと思っておりますので、、)

 ぶっちゃけ他の人も言ってたけど大体の事はやっちゃってネタ切れ気味ですからね、、。
 やれる事はあるけど重い事しか残ってないのでそれはそれでお辛い。

●ソースコードと開発環境
 アイスソードは全く関係すらないソースコードとその開発環境の整備問題。

 いやですね、いい加減これをやっておかないとこの先とてもやってられんのですよ。
 というか実際、将来見返すのも嫌になるくらいには地獄の様相。コキュートス程の地獄の奥底とは言わないまでも、賽の河原で天高く積み上げた石の山がいつ蹴り崩されるかも分からない危うさの上でずっと続けておりましたからね。
 まぁ不味いのは分かっていた上で、何とかしようにも何とも扱いづらいCheatEngineスクリプトの仕様の上で騙し騙しずっとやってきていた訳で。
 具体的に言えば、xmlファイル一つに全てまとめられた何十個ものスクリプトのバックアップと履歴管理とかもうやってらんない。保存・適用の度にダイアログが閉じられて次にまた開いて何行目までスクロール戻してだとかもう本当マジでやってらんない。よくもまぁこんなんで軽く千行越えのluaとアセンブラをせこせこ書いてバグ取りしてたよな、と過去の自分に呆れたくもなる。

 そこからluaだけでも外出しにして、今回cea(アセンブラ)部分も晴れて個別のファイル管理に持って行ったという顛末。言葉にすると単純な話なんですけどね。なかなかそう上手くも行かない事情があるからこそ、ここまで対処も棚上げになっていた訳で。(やればやるで、次第に何でこんな事までこっちでやらなきゃイカンのかという逆ギレ展開に、、)
 もっとも拙い知識と理解でやっている所はあるので、まだまだそれはそれでボロの出る危うさの上で動かしてる面はあるけれども。基本的には問題ないんじゃないかな、随所でまだ注意は必要だけど、元が元だしみたいな、、。

 でもこれで大分、何より気分的にラクにはなってきまして。ようやく真っ当なスタートラインに立てるんじゃないかなみたいな感じですよ。そもそもたかが改造ツールの上でここまでやるなよ案件ですからね、、。頭おかしい

 まぁ昔なんて今とは比べものにならないショボい開発環境でしたからね、その頃を思えば。
 ちょっと20年くらい前の企業内製の貧弱開発ツールの上で渋々仕事をしていた時代に戻るだけの話なんですよ。因みに30年くらい前はテキストエディタに単発UNDO機能(履歴一回こっきり)が付いただけで感動しておりました(遠い目)。

 、、、あ、うん、ここはちょろっと書く序文の筈だったんですけど。
 あまりにも溜まりに溜まったストレスゲージの長さが物凄すぎて勝手に漏れ出たという感じです、はい。

 さてと、順序的には前後してるところはあるんですが、ここの所はまたプログラム改良を進めておりまして。
 とうとうまた高速化を果たしましたよ。またか!なんだけど、そうだよまただよ。
 というか目の前に界王拳の奥義が見えたともなれば会得しに行くでしょうがよ。
 今回はそんなくらいの大成果ですよ。これを語れずに居られますかってなもんですわ。

●描画効率化(セルシェーディング)
 でもその前に、まずはソロでもうちょっとだけでも速度を稼げないかと足掻いた時の話。

 以前の高速化過去記事、これは内部的には分かれているパーツ処理をひとまとめにして効率化するという話。
 ここでテクスチャポリゴンの方はその分割すらまとめて最大1処理にまで落とす事が出来ていた一方、セルシェーディング(トゥーンレンダリング)用の輪郭色付け用ポリゴンの処理はまだ多い時は10パーツくらいあったので、これもまとめる事は出来まいかと。
 もっとも何十パーツにも分かれていたものをぐっと減らした時点で、この先はそれ程大きなインパクトに繋がる訳でもないとは思っていたのだけれど。ただ元々実ポリゴンよりもセルシェーディングの処理の方がxenia(エミュ)の負荷になっている部分だったので、少しでも改善に繋がらないかという期待も込めて。
(たぶん実ポリゴンとセルシェード用ポリゴンを一個一個交互に重ねる処理順序が良くないのかなと。だからセルシェード未使用の背景(ステージ)は、パーツもめっちゃ分かれてるけどまとめなくても大差ない模様)

 でも今回はテクスチャ側のように元の仕組みのままとは行かず、自分でDirectXの描画命令をブチ込む荒技にもなりましたけれども、何とか上手く行った感じ、多分行けたかな。まぁ問題あればすぐ外せるような作りに。
 果たして結果としては色分けの多い制服モデルで目測だけれど0.5ms程の短縮。蒸着に要する時間の僅か1/100!(ぉぉぅ)。(ここで0.05秒は3フレーム云々でふざけようと思ったけれども割愛)
 とはいえデュエット・トリオや二画面描画の負荷を少しでも下げるためには決して無駄には出来ない数字。

 などとここまではまだ、裏で進めるレベルの涙ぐましい努力の話でしかなかったんですけどね。


●分割描画の負荷
 前回幾つか録った二画面同時録画が微妙に口惜しい案配で、その為にもソロ描画の負荷から下げられないかと考えたのが先の話。流石にそこまで劇的な結果は出せず、そうなると後は二画面描画の効率を考え直していくしかない。

 そこでふと見直してみたのが画面描画の際の分割処理の部分。
 バッファサイズの問題だとは思うけれども、ドリクラでは実に画面を4つに分けて描画しておりまして、二画面描画で左右別々に描画させる際にここをもっと上手く制御できまいかと考えたのが始まり。というか気になってはいたけれども、以前はまだ理解不足で上手くまとめられずにバカ正直な描画の繰り返ししか出来ていなかったのが実情。

 今回改めてそこを掘り返していた所で気付いた事実、「分割数を落としたらめっちゃ負荷下がるんですけど!?」
img
 デバッグ表示の赤いバーの塊が描画計算の負荷、その横に伸びる緑バー(Stall)が60fpsインターバルの余力部分。
 これを二分割に変えるとそのまま単純に赤い塊が半分になる。
img
 個々の塊の長さ=描画負荷が増すでもなく、ただ単純に速くなってるやんけコレ!っていう。
 処理が半分になれば倍の速さに。これこそ界王拳って奴でしょうよ。

 ここはてっきり最終的に出力するピクセル数は同じだからさして変わるまいと考えていたんですが、エミュなので元々ハードでやっていた物をソフトで肩代わりする部分に大きな違いがあるという所だろうか。分割で4枚描画するに当たってそれぞれの前処理?で4回分の負荷がもろに掛かっていたという。

 うーん、何なんだろうこれは。あまりも極々単純な話なのでxeniaの設計不備なんて事はあるまいし、だったらもっと大々的に劇的高速化手段として検討されてる部分。
 これもおそらくはまたドリクラ側の実装方法がxeniaに合わなかったという話だろうか(他にもドリクラ固有っぽい問題はちょこちょこあるので)。よもや実機でも言える話とかじゃないよなぁ。多分ハードが上手くやるから問題なかった部分が表面化したケースなんだろうと思います、はい。

 でもってこの分割数の変更、元々ドリクラ側で任意に変更できるようプログラムされている部分でして、ちょっと設定値を弄るだけでプログラムが切り替わってくれるのですね。めっちゃお手軽界王拳。界王星の修行など必要なかった。

 とはいえ発動にはちょっと制約もありまして。そりゃ元々実機でも上手く行かないから分割処理していた訳であって、エミュでもバッファ不足でおかしくなる部分はある。この点、過去に見た時は当時のPCスペックと、あとxeniaのバージョンもあると思う、その違いで当時は「バグって使えない」の一言で深く掘り下げできていなかったのが実情。
 ただ今は前よりは動くようになっていて、2分割+アンチエイリアスOFFにすれば問題なく動く。

 もっともアンチエイリアスを切れば当然ジャギーは出てしまうけど、代わりにxenia側でNVIDIAのアンチエイリアスオプション(FXAA)を使えば割と代用できる。(因みにアンチエイリアスON/OFFではxenia側の負荷には目に見える差は出ません、あとはGPU)
 これはオリジナルの描画に対して後処理でアンチエイリアスを掛けるものなので、本来のマルチサンプリングの描画とは若干異なる。参考:MSAAとFXAA)
 元々の解像度が足りないとどうしてももやっとしてしまうので、xbox標準解像度だと中遠距離の描画が微妙にぼやけて見えがち(具体的には全身が映るくらいの距離での顔)。特に輪郭がパリッとしたアニメモデルには影響が出やすい。
 ただ自分は録画の際には倍解像度に上げて録るので、その解像度であればこの後付けアンチエイリアス機能だけでも十分遜色の無い結果は得られる。というかざっくり見た分には違いは分からないくらい。これは行ける!と。実質界王拳2倍。
 ただ普段の改造作業で標準解像度の時はぼやけた絵を見るのも寂しいので、元のアンチエイリアスONのまませめて3分割にして少し負荷を下げるくらい。界王拳1.33倍です。

 界王拳4倍だ~、って言えればむっちゃ格好良かったんですけどねぇ。(なお3倍はない)
 競泳水着のような軽いモデルだと計算上300fpsくらい出てるので、「速度を追い求めた結果がこれだよ」みたいなね。
 でも残念ながら、この通り下部分の描画が切れてしまう。
img
 これはどうも深度バッファがおかしくなっているようで、キャラがカメラに近付くとそこだけ描かれるケースも出てくるという。(xeniaのバージョンで少し変わる)

 ただよく分からないのが、設定によっては二分割で片方はちゃんと描かれるといったこともあって、バッファ足りてるんじゃん? 内部処理の不具合(考慮漏れ)に過ぎないのだろうか、と。少し処理も追ってみようとしたけれど、この辺アセンブラで内部ワークの値を追っていく作業は頭がおかしくなりそうというかなるので流石に途中で断念。
 あるいはxenia側の単純なバグだったりするのだろうか。日本ローカルのゲームだからなぁ。

 まあ今は界王拳2倍でも十分な成果は出せますので。
 そりゃ元々「あと1,2割くらい欲しいよね」と思ってた所に2倍ものパワーを出せば、ナッパくらいなら指先一つで何とやらってな物ですよ(混ぜるな危険)。

 実際、倍解像度でトリオで3人制服フルモデル化と負荷を掛けまくった結果がこれ。
img
 ここまでやって60fpsフルフレーム行けるようになりましたよ。(緑のStall部分にまだ余力がある)
 後はアクセサリを全身にゴテゴテ付けると塵も積もればで苦しくはなるかもだけれど、コーディネートセンスは無いのでイヤリングと帽子くらいしか使わないし、、。

 元々は二画面化が何とかなればくらいに思っていたけれどここまでの結果を出せようとは。
 尚この事情に即して、且つ内部制御方法も見直したので、二画面描画もかなりの効率化・高速化を果たしております。前回くっそ重くて諦めた透過ナイトドレスも余裕で二画面60fps行けるようになりましたよ。大勝利。

#あ、因みにこれくらいはということでマジックナンバーで 0x18282B400 のメモリアドレス。ここのモード値の書き換え(0xC→0x2とか)で周囲の設定値が諸々切り替わります。例のモデル高速化(効率化)改造を行わなくても、マシンパワーでぶん殴って60fps出せるくらいになってました。もし4倍界王拳の問題が解決すればバックダンサーHGでも60fps行けるくらいに。(分割なしはプログラムを弄らないと一部クラッシュ注意ですが)


●音声ノイズ問題
 で、ですね、思いの外ここまでデュエット・バックダンサー(トリオ)が実用的なラインに乗ってきますとね、以前に判明した音声ノイズ問題過去記事が再浮上して参りましてね。

 実はやっぱりソロでも時折発生していて、尚且つデュエット・トリオに至っては高確率に発生しまくりなもんでフ○ッキンガム宮殿とでも申しましょうか、流石にそろそろ何とかしたいと。
 今この辺に当たっておりまして、おそらくはという原因と対策が見えてきたところ。
(多分テクスチャキャッシュ問題(F5で都度クリアが必要)と同じ事が音声にも起きてるんじゃないかなぁ。ドリクラのメモリの使い方が特殊なのか)

 ただそこから練り込んで行かないといけないので、この辺で一旦小休止といったところです。

 などとこんな話に限ってダラダラと書いてしまいますけども。
 これに限らず見えないところで細々とした修正作業を繰り返す日々ではあって、せめて結果は出せているからまだいいんですが、やっている事と見返りのバランスを考えると正直苦しくもなってくる、「我に返る」トラップカードの発動対象。

 まぁせめてこれだけでも、ここを解決してみたらと、つい目の前の戦いに手を染めてしまう訳で。そうやって何百万年も延々と戦いを繰り返してきたのがセイバートロン星(サイバトロン星)の面々なんだなと痛感させられますね。そりゃWFCのウルトラマグナスも講和を申し出に動きたくもなるってものですよ(なお結果)。

 という訳で別に繋げる意味も必要もないけれど勝手に話が繋がるこの頃だということで(前回記事)。