ドリクラエミュ高速化

 旧PCに幸い引き取り手が現れて譲ったところ、どうやらマザーBIOSの問題で最新グラボに対応していない問題が発覚。(曰く付きのマザーなので正規で最新BIOSを手に入れる手段が無くなりアップデートは出来ていなかった)
 起動時のBeepエラーで怒られてからは確かに正確な原因は追わないまま、「計算上明らかに電源容量不足」だと足早に物事を進めてしまったけれど、きちんと対処出来ていれば(どちらにせよカツカツで使い続けるのは無理だったとはいえ)色々試しながら新PCのパーツ選びにせよもう少し考える余裕もあったのかもしれない。
 当時の自分にそんな冷静な判断を求めようも、物事をはやる気持ちを抑えられようもなかったけれど(笑)。

 そんなこんながあった箱○エミュのパフォーマンス問題ですが、まだやるのかよと思いつつ、それと言うのもあの後また新展開がありまして。とうとう重くなってる大きな原因を見付けてしまったと。

 結局何が悪かったと言えばまぁ根本的にはデータという事にはなるかな。モデルデータが必ずしも最適化されておらず、内部の描画処理が多数積み重なって飛躍的に負荷を掛けてしまっていた。それでも実機ではハード任せで大きな問題にはなっていなかったものが、それを逐一肩代わりして再現するエミュレータでは一気に表面化してしまったということだと思う。
 モデルデータは実際にはいわゆるレイヤー分けのようにパーツが分かれていて、シェーダ・テクスチャごとに描画処理へ流すのでその分処理が増えるのは道理なのだろうけど、困った時には例えば髪の毛の房ごとに細かくレイヤー分けされたままになっているケースもあった(ゲーム用にパッケージングする際に結合調整してないというか担当者毎の癖だろうか)。例えば亜麻音ちんならリボン含めて僅か4パーツで、アイリはちょっと多くて11パーツ(結合不足)なのに、受付さんは何とまさかの116パーツ。

 これによってどれくらい違うかというと、実にこれくらい。左側が改造前。(ドリームクラブ入店時)
img
 いやまぁこんなもの見せられても何のこっちゃなんですが。それぞれ見えている数字が1描画サイクル毎の色々な処理の所要時間(の内、処理待ちを起こしている部分)(msec)で、一番上に見えているのが所要時間トータル。つまり60fpsならここが16.6msとなるのが理想型。
 しかしこれがゲーム内の入り口画面でいきなりの30ms強の重さですからね、これだけマシンスペックを注ぎ込んだにも関わらず。そりゃ凹みもするし何でだよという話もなる訳で。このシーンはまだ背景も床の反射表現の為にモデル二重化+透過なんてこともやってるから重いのだろうかと考えていたけれども、なんと「重かったのは受付さん(の髪)だった」という。

 まぁ一部にしか出ないサブキャラなので製作側もそれほど注視していなかったのもあろうけど。今回はエミュ弄りで何が出来るかと色々とファイルを差し替えたりして試す内に、受付さんの髪データが物凄く重いよ…となってしまい。しかしファイルサイズも小さいのに何だこれはと詳細を追ったらこの実情。まさか髪の一節一節が1パーツになっているなんて。
 そこでこれは流石にデータをまとめられるんじゃね?と試しにバイナリを弄ってみたら割と何とかなってしまいまして。勿論その作業中にも紆余曲折はあって、よく分からないから保留していた部分が問題点そのものだったというケースを二度繰り返したりもしたけれど(流石に二度目は学習してすぐに当たりを付けた)
 そしてその改修結果が上記。これだけで実に16msecの差、つまりは丸々1フレーム分の高速化ですよ。いやもうびっくり。背景の重さは関係無くて余裕の60fps達成。とうとう受付さんの動きが正しくヌルヌルになりましたよ、万々歳。
 因みに画像では検証用に60fpsサイクルの壁を取っ払っており、実際の1フレーム処理に要する時間が概ね15msecと出ている状態だということで。(こういうデバッグ改造が今やあちこちに(笑))

 尚、パーツデータをまとめてしまう上で気にしたのはボーンやパーツ干渉なのだけれど、そこはパッと見は特に問題は無いのかな?という感じ。アイリ(ちゃん)は思い切って青髪を全部くっつけて、+謎デバイスの僅か2パーツの構成に。これだけでも1-2msecの軽量化。16ms中のこれは決して馬鹿にならない数字。
 そして元々デザイン上パーツが多くてどうしても重くなる制服も、まとめられそうなパーツを見繕って総数45から23くらいへと半分ちょいにまでスリム化。
 これで少なくとも多分見た目特に気にならないかなって感じでまとめた結果がこちら、(カラオケ中:アイリのデフォルト制服)
img
 大体5msくらいは稼げるようになった。元々60fpsカツカツだったところ、更にその横で録画をしようと思えばもっと余裕を持たせなければならない所だった訳で、そこにこれだけ余裕が出来たのは大きい。
 ついでに言うとカラオケ用の簡略化モデルを標準モデルに戻す改造こちら。スカート部分が差し替わっている)で1,2msは食うので60fpsは割ってしまっていたけれど、これで心置きなく適用出来るように。

 もっともこれはあくまで「重いデータのネックを軽減する」という性格のものなので、元々負荷の掛かる二人三人モードを60fpsに引き上げるなんて事にまでは決してならず。(まぁデュエットならコスチュームを選べば恐らくいいところまでは)
 この先は、より一層の高スペックマシンの調達、あるいはエミュレータ自身の大幅アップグレードで高速化の機会が訪れるかどうか。何にせよ当分先の話とはなるところですね。

 ただこれで現状、手元でも実機相当あるいはそれ以上のパフォーマンスを出せる状況になったとは言っていい。(後は重いデータを見定めて適宜修正する作業は待っている)
 実際ソロカラオケなら確実に60fps+内部に余裕もある状態なので、後は録画する時はそちらの問題ですねというところには落ち着いたと。過去の動画は割と酷いので今後は何とかしていきたいなぁと。(過去分も撮り直したいくらいだけど、差し替えは出来ない仕様なので)

 そんなこんなで、個人的には一言で言えば「大勝利!」と。
 こうすっきり勝利と言える結果にまで行けたのは何だか久しぶりになってしまうかもしれない。それくらいこのパフォーマンス問題は長く暗い影を落とし続けていた。これに限らず今まで何度も色々掘ってたんですよ。まぁ省きますけども。

 大体こんな話を長々と書いた所でって話なんですけれど。ただこの、諦めの悪さのパラメータ値だけはクソ高い人間の足掻きを見よ!と。その実証みたいなもんですね。何やってんですかね。「そんなことはわかっている」と。

 というか何をやるにしても「このままではなぁ」というネックがあったから。その憂いが取れたのは本当に非常に大きい。
 ここからはまたやろうと思った事に戻れますねと。戻って行きたいと。
 ただこれまでちょっとかなり時間を使いすぎたので、そろそろ他の事もやっていかないと、、。あまりにも目の前の事に捕らわれすぎてしまった(苦笑)。

※追記:後日、更に高速化を掛けました。

 という訳で、久々にアイリちゃんリハビリで。いや手は動かしてたんですけどね、アイリちゃんは何だか久しぶりになっていた。
img
(自信も無いので模写すげ替えコンバート、、、で済ますつもりだったけれど流石に芸がなさすぎるなと急遽一から起こしたのでうんまぁ。ここから似る似てないの壁は勿論、ユガンデール大渓谷の対岸を目指す長い旅が始まってしまいますので以下省略。)
 今年は四半期ノルマを完成させられればとは思っていたんですけどね。ちょっと思わぬ事態に足というか手を取られすぎましたね。
 まぁやりたいことと出来ることのバランスを取って心の安寧を取り戻さないとねってのはありますから、はい。