Dolphin Emulatorが最後の無敗のGameCubeゲームをどのように破ったか







Dolphin 5.0では、 少なくとも GameCubeから任意のゲームをダウンロードできました 。 1つを除きます。 PowerPC Star Wars:The Clone Warsでメモリ管理ユニットを使用する複雑な方法は、最近までDolphinでのプレイを許可していませんでした。 しかし、 Dolphinバージョン5.0-540では、この問題は最終的に解決されました。エミュレータは、公式コンソールライブラリからすべてのGameCubeゲームをダウンロードすることを学びました。





スター・ウォーズ:ドルフィンで開始されたクローン・ウォーズ



なぜスターウォーズ:クローンウォーズはそんなに特別になったのですか? これが何であるかを本当に理解するには、PowerPCプロセッサがメモリ管理実行する方法 、このプロセスがDolphinでどのようにエミュレートされるかについて少し学ぶ必要があります。



エミュレーションメモリ管理ユニット



メモリ管理ユニット(MMU)は、データとコードへの迅速なアクセスをゲームに提供する責任があります。 使用可能なRAMに直接アクセスする代わりに、ゲームは仮想メモリを使用します。仮想メモリは、MMUを使用して物理メモリに変換されます。 このプロセスは、2つの方法で実行できます。メモリの大きなブロックの場合はブロックアドレスの変換(Block Address Translations、BAT)、小さなボリュームを表示する場合はページのテーブルです。



ゲームは、いくつかの理由で実際のメモリではなく仮想メモリにアクセスします。 まず、プロセッサーにアクセス操作をキャッシュする機能を提供し、頻繁に使用される値へのアクセス効率を大幅に向上させます。 第二に、GameCubeには4GBのアドレス空間に24MB(およびいくつかの特殊な領域)のRAMしかありません。 これは、ほとんどのメモリアドレスに対応するRAMがないことを意味します! ゲームが実際に物理メモリを持たない実際のメモリアドレスにアクセスしようとすると、データとしてガベージを受け取るか、単にクラッシュします! 仮想メモリを使用することで、MMUは例外をスローし、ゲームにこの状況を処理したり、発生したエラーに関する有用な情報を開発者に提供する機会を与えることができます。



Dolphinは、ゲームの動作に関する理論に基づいて、ある程度の精度でMMUをエミュレートできます。









MMUはGameCubeプロセッサの一部です。 ウィキメディアからの写真



理論1:ソフトウェアは実メモリにのみ書き込む



ゲームが実際のメモリにしか書き込むことができない場合、Dolphinはこれに問題はありません。 ほとんどのゲームは標準のGameCube / Wii BATマッピングを使用し、それ以上のメモリにアクセスしようとはしていませんが、必要なことは適切な場所へのアクセスを提供することだけです。









標準マッピングには、すべての物理メモリを変換する1つのブロックアドレス変換(BAT)があります。 BATはページテーブルよりも高速であるため、ほとんどのゲームはBATのみを使用します。



Dolphinのアプローチは、このブロックアドレス(BAT)の変換を仮想メモリからハードコーディングし、アドレスを物理メモリに変換することです。 簡単に言えば、ゲームはメモリ内の1つのアドレスを要求しますが、コンソール(したがってDolphin)は実際のメモリから別のアドレスを渡します。



この記事でカバーされていない他の重要な部分もあります。 最も重要なものの1つは、メモリ入出力(メモリマップド入力/出力、MMIO)です。これにより、プロセッサはさまざまなデバイス(ディスクドライブ、メモリカードなど)と対話します。 また、特別なブートセクターについても言及する必要がありますが、ゲームはアクセスできませんので、まだ説明する必要はありません。



エミュレータのMMUオフモードは、MMUエミュレーションによるゲームのロードのみを許可する、切り捨てられたMMU機能です。 ゲームに作業用のメモリ領域を提供するだけで、ゲームがルールに違反しないことを前提としています。 驚くべきことに、ほとんどのGameCubeゲームとほとんどすべてのWiiゲームは実際にメモリで正しく動作します。



ルールに違反するほとんどのGameCubeゲームでは、完全なMMUエミュレーション必要でしたが、cなエミュレーター開発者は、MMU Speedhackを使用してパフォーマンスを犠牲にすることなくこれらのゲームをtrickすことができました。



理論2:ゲームによる無効なメモリ使用量を予測できます



MMU Speedhackは、まだ深刻なMMUエミュレーションを実行しないため、「MMU Off +」と呼ぶことができます。 GameCubeが必要とするよりも多くのRAMを表示し、ゲームが実際に何をするかを心配することなく、すべてが機能しているとゲームに考えさせます。









ゲームはこれらのアドレスを拡張RAMとして使用するため、実際のメモリとして表示するだけで機能します! しかし、おそらくこれらのゲームが一般に無効なメモリにアクセスしようとしている理由を理解していないでしょうか?



これは、任天堂がゲームで拡張RAMとして16 MBの追加GameCube RAMを利用できるライブラリを作成したためです。 この追加RAMはデジタルシグナルプロセッサ(DSP)に接続されているため、オーディオメモリとしてより頻繁に使用されますが、技術的にはほとんどすべてに使用できます。 ハードウェア機能がないため、プロセッサはアドレス空間に追加のRAMを直接表示できないため、ゲームは例外ハンドラを呼び出すために無効なメモリアドレスを読み書きする必要があります。 この例外ハンドラは、ダイレクトメモリアクセス(DMA)を使用して、追加のRAMから物理メモリのゲームに割り当てられたキャッシュにデータを移動します。 次に、彼はページテーブルにコマンドを与えて、以前無効だったメモリのアドレスがこのキャッシュの場所を示していることを通知します。これにより、ゲームは「クラッシュ」せずに動作できます。



どういうわけか、Dolphinエミュレータのハックは、拡張メモリとして追加のRAMを使用するほとんどすべてのゲームで機能します。 湾曲しているにもかかわらず、このハックは驚くほど効率的で高速です。



理論3:無効なメモリへのアクセスは予測不可能です



MMU Speedhackは高いパフォーマンスを発揮しますが、メモリ使用アルゴリズムが一般的で一般的であるためDolphinに統合されたゲームでのみ機能します。 このタフな動作により、Dolphinエミュレーターは、ゲームがどこから読み取っているのかを推測し、アクセスされているメモリの有効性を保証することを気にしません。 MMU Speedhackを使用したゲームは非常に標準化されているため、非常に単純なルールに従いますが、これらのルールには制限があります。



一部のゲームは独自の例外ハンドラを使用し、メモリアドレスを非標準的な方法で使用し、MMU Speedhackの動作を混乱させました。 これらの場合、Dolphinはメモリアドレスの有効性を確認および保証し、その後で命令またはデータをエミュレートされたプロセッサに転送する必要があります。 これは、すべてのアドレスを有効なものとして単に取るよりもはるかに遅いです。



Fioraや他の開発者がJITおよびMMUエミュレーションを最適化しようとする以前は、 Enabled MMUモードはゲームプロセスの死刑判決でした。









21種類の既知のゲームがあり、動作するにはMMU Speedhack以外のものも必要です。



メモリチェック(memcheck)の処理は、fastmemのパフォーマンスの最適化に干渉するため、遅くなります。 Fastmemは、コンピューターのメモリにGameCube / Wiiアドレス空間を表示し、コンピューターのエミュレートされた無効なメモリ全体を割り当て済みとしてマークします。 これにより、Dolphinエミュレーターはコンピュータープロセッサの例外ハンドラーを使用して、例外をキャッチする汚い作業を行うことができます。 例外をキャッチすると、エミュレータはアドレスを処理するためにfastmem(高速)からslowmem(低速メモリ)に切り替える必要があり、これはパフォーマンスにとって非常に大きな問題になる可能性があります。









メモリチェックはMMU Enabledの基本機能であり、これがMMUをオンにしたゲームがDolphinで非常に遅い主な理由です。 一部の状況では、fastmemで動作しないインタープリターに戻る必要がありました。 同時に、コンソールへの通常のアクセスよりもメモリへのアクセスがさらに遅くなりました!



頻繁に使用できないにもかかわらず、ほとんどすべてのアクセスに常に fastmemを使用するようにしてください。 fastmemダウンロード領域には2つの命令しか保存されておらず、slowmemを使用した同じアクセスには最大1000の命令が必要です! ポインタが実際のメモリ内にあるかどうかはわからないので、機能する場合はパフォーマンスが大きく異なるため、常にfastmemを使用しようとします。



前述のように、実際には、slowmemが少し速くなり、実際に使用できるようになりました。 これは主に、メモリチェックがFioraのFar Code Cacheコードキャッシュに移動したためです。 メモリチェックの処理と、MMUを使用したゲーム内のすべての命令とデータの常時可用性を最適化することにより、生産性が大幅に向上しました。 最大の効果は目立ったRogue Squadron 3であり、その速度は悲惨な4秒からほぼ45フレーム/秒に跳ね上がりました!



通常、Far Code Cacheは、他のJIT最適化とともに、MMU Enabledを必要とするすべてのゲームで平均してほぼ2倍のパフォーマンスの向上をもたらしました。 MMUを有効にしました。



理論3.5:因子5-爬虫類



もちろん、ほとんどのユーザーは、Far Code Cacheの実装前にStar Wars Rogue Squadron 3がどれだけ遅いかさえ知らなかった 。 少なくとも、NTSCバージョンの場合はそうでした。 PALバージョンは何らかの形でロードされ 、それから、Far Code Cacheが登場する前に速度特性が取得されました。









何も壊さずにゲームを開始できたとしても、重要なデータが複数のページに保存されていると、事態が突然悪化する可能性があります。



Rebel Strikeは、最後から2番目にNTSCがロードされたゲームでした。その理由の1つは、MMUで厄介な小さなトリックがあり、10年以上にわたってエミュレーションが推進されたことです。 Rogue Squadron 3では、複数のページにデータを保存できます。 長時間読み取りまたは書き込みを行うと、Rebel Strikeによって例外が発生し、プロセス内で文字通り有効なアドレスから無効なアドレスに切り替わります。 以前は、Dolphinは読み取りの開始時に誤って例外を設定していましたが、例外が実際に発生した場所に設定する必要がありました。



DolphinにアップロードされたGameCubeを使用した最後のゲームがFactor 5 (翻訳者:Star Wars Rogue Squadron III:Rebel Strikeの開発者から)だったらいいのですが、まだありました。 そして今回はささいな間違いではありませんでした。



理論4:ゲームは自身の本当の記憶を決定する



さて、ついにスターウォーズ:クローンウォーズに移ります。 BATおよびページテーブルを可能な限り効率的に処理するためにDolphin開発者が行ったすべての作業の後、このゲームは最も基本的なDolphinの仮定の1つである静的BATをウィンドウから除外することにしました。



イルカは何をしていますか?



Dolphinは、実際のBATエミュレーションが必要になる状況に完全に備えていませんでした。 どのような設定を使用しても、明確に定義された仮定のおかげで、すべてがひどく終わりました。



MMU Speedhack / MMU Off-この組み合わせでは事態は非常に悪くなりました。 Dolphinは実際にはMMUをエミュレートしないため、彼は開始し、0x00000000にあるゴミをプロセッサに転送することにしました。 それは非常に愚かな行動であるため、ゲームは自然に「倒れた」。



MMU Enabled-この記事の前にリリースされたバージョンを使用する場合、MMU Enabledモードでは、プロセスはもう少し先に進みます。 Dolphinは例外をエミュレートしてエラーハンドラーを読み込むことができますが、エミュレーターは次に何が起こるかを処理できません。 Clone Warsは、例外処理中にBATを無効にすることを利用して、メモリ管理をさらに制御します。 次に、標準のBATとページテーブルでは不十分であると報告し、独自のBATとページテーブルを作成しようとします。 ドルフィンはBATを強く設定します。 それらは変更可能ではありません。 したがって、エラーハンドラーがゲームにコントロールを返すと、もちろん「クラッシュ」します。 ただし、少なくともDolphin自体は機能し続けるため、ゲームを終了して別のゲームをプレイできます。



「このゲーム用に特別にハードコードされたBATを作成しないのはなぜですか」という質問をすることができます。 しかし、実際には、これは機能しません。 ゲームは、ミッション中およびマルチプレイヤーモードでBATを何度も変更します。 これは、 適切な BATエミュレーションが必要であることを意味します



イルカがすべきこと



正しいBATエミュレーションは、Dolphinが、自分が望むものの仮定ではなく、ゲームのアクションに基づいてBATを有効または無効にできることを意味します。 これにより問題が発生します。DolphinでのMMUの効果的なエミュレーションは、実際の仮想メモリの場所を認識し、この基盤を破壊するとDolphinが完全に破壊されるという事実に基づいています。



スターウォーズ:クローンウォーズは、表示された4つのBAT命令とBATデータを使用して独自のメモリディスプレイを作成する唯一の既知のゲームです。 このゲームをエミュレートするには、Dolphin MMUエミュレーションコードを完全に書き直す必要があります。 この場合、すべてが非常に複雑です:fastmem、メモリチェック、およびその間にあるもの。



MMU対応で動作する他のゲームのネイティブ例外ハンドラーとは異なり、クローンウォーズ例外ハンドラーは実際にメモリを再構築します。 アドレス空間から標準BATを切断し、ゲーム中に独自のBATを何度も作成します。 前の画像では、BATがますます複雑になり、エミュレーションがより完全になっていることがわかりましたが、クローンウォーズはこのすべての作業をゴミ箱に捨てます!











今回、Dolphinは仮定を立てることができません。 この最悪のシナリオを処理できるのは、BAT Dolphinエミュレーションコアの完全なリメイクのみです。 ダイナミックBAT(ダイナミックBAT)は完全なBATエミュレーションで、ゲームが要求することを実行して情報を正しく表示できます。 この膨大な量のコードの書き換えにより、MMU Dolphinエミュレーションのハードセットの前提条件のほとんどを取り除く必要がありました。



ページテーブルの反転



(翻訳者から:タイトルで、著者は表反転のミームを破りました、ページ表の「反転」についての話はありません)



Dolphinの開発者は、Star Wars:The Clone Warsをダウンロードするのに必要なことを数年間知っています。 古代(バージョン3.0の時代)には、インタープリターを使用してThe Clone Warsをロードできるブランチがありました。 これは不当に遅く、MMUを使用しないゲームのパフォーマンスに影響しました。 その時代、パフォーマンスは非常につらい問題でした。



1年以上の間、現在の実装(動的BAT)はプルリクエストとして「ハング」し、その時点ですでにクローンウォーズをロードできていました。 彼女は他の開発者がそれを取り上げるほど長い間彼女の時間を待っていました!



この関数の実装に非常に長い時間がかかったのは他のすべて作業を台無しにすることなく実装することが不可能だったためです。 これらすべてを念頭に置いて、マグマグ開発者の実装は素晴らしいものでした。









ご覧のとおり、大量のMMUコードが書き直されているにもかかわらず、Dolphinの速度を維持することに大きな注意が払われました。 MMU Enabledを使用せず、MMU Speedhackを使用するゲームでは、パフォーマンスが1%未満低下します。 これは、MMU Enabledを使用しないゲームの場合、MMUエミュレーションがオフになっている場合でもドロップが30%を超えるはずだった元の計画との大きな違いです!



ダイナミックBAT実装の重要な機能の1つは、実際のメモリを移動する機能の明らかな複雑さにもかかわらず、fastmemで動作することです。 一方、MMUを使用したゲームは少し遅くなります。 8%-15%の減少は重要ですが、さらなる最適化の助けを借りてそれを取り除くことができます。 精度を大幅に改善することは、パフォーマンスの低下に見合う価値があると考えました。



ハードコードされたBATコードの書き換えの副作用



MMUのより正確なエミュレーションにより、ゲームの頻繁に発生する奇妙な動作がよりよくエミュレートされるようになりました。 もちろん、ダイナミックBATは1つのゲームだけが動作するために本当に必要ですが、他のゲームもメモリチェックのためのより速いアクセスの利点を得ています。



ユーザーはゲームが失敗したときにそれを気に入っていますよね? プレイヤーが予期しないアクションを実行すると、コンソールでクラッシュを引き起こすWii用のゲームがかなりあります。 時々、これらの手順はDolphinをクラッシュさせることさえあります! メモリチェックへのアクセスの簡素化により、DolphinはDolphinのクラッシュを引き起こすことなく、ゲーム内の既知のグリッチを正確にエミュレートできます! スーパーマリオギャラクシーまたはトワイライトプリンセスが抱える問題をエミュレートして、コンソールと同じ誤動作を引き起こすことができますが、パフォーマンスに影響はありません!





トワイライトプリンセスの交通標識のバグ



繰り返しますが、ほとんどのプレイヤーゲームが失敗したときに気に入らないでしょう 。 この観点から、 レイマンレイビングラビッツテレビパーティー (およびラビッツパーティーコレクション )は、ミニゲームをロードするときに「フォールアウト」しなくなりました。 おそらくこれは、キャッシュ管理の小さな変更が原因で発生したか、ハードコードされたBAT /ページテーブルに「バグ」があった可能性が高いです。 誰も修正できなかった失敗は、コードを書き直した後に消えただけです-これは嬉しい驚きでした。



プロセッサエミュレーション全体の改善により、さらに2つのゲームが動作するようになりました。 ゴルフが大好き! マリオゴルフの開発者が作成したレベルをロードしようとすると「クラッシュ」しました。 Summer Athletics 2009は、単に何らかのデバッグ情報を読み込んで表示しませんでした。 これらのゲームは、ダイナミックBATの実装による影響を受けませんでした。 不可解な方法で、両方のゲームの動作は、ブランチをマージするプロセスでコード自体をクリーニングすることで修正されました。 これらのゲームの問題について知られている情報によると、それはおそらく命令とデータキャッシュエラーの問題でした。



もう1つの嬉しい驚きは、ドルフィンにあるRomhaksの束の作業の改善です。 WiimmのマリオカートWii More Fun Romhakiが正しく(まあ、ほぼ)トラック選択画面をロードします!



すべてうまくいくことは非常に幸運です。 このハックはicacheをクリアしません。 代わりに、icacheのリリースとリセットを制御するためにPowerPCプロセッサに依存しているため、パフォーマンスの大幅な低下なしではDolphinでエミュレートできないと考えられていました。 しかし、BATを変更すると、Dolphinはicacheをクリアします。 残念ながら、トラック間では、プレーヤーはメインメニューに戻る必要があります。 これを修正したい場合は、それについて説明する必要はありません。 Dolphinは、命令キャッシュとデータのエミュレーションをエミュレートする必要があることに注意してください。これにより、一般的にプロセッサをエミュレートするためのリソース要件が14倍になります。 筋金入りのゲーマーや野心的なゲーマーはすべてをエミュレートしたいのですが、他の誰も完全で正確なキャッシュエミュレーションを実際に必要とませ



romhackersがまだDolphinでゲームを動作させたい場合は、残念ながら、PowerPCプロセッサによるicache / dcacheの処理に依存しないよう依頼する必要があります。 たとえば、プロジェクトMの作成者は、最終リリースの前にicache / dcacheの使用を修正したため、Dolphinで正しく動作するはずです。 しかし、Dolphinユーザーにromhackを起動させたくない場合は、(少なくとも今のところ)これから身を守る方法を知っています。



結論として



コードを書き直した後、Dolphinはエンジンの精度をさらに飛躍させました。いくつかのランダムなクラッシュが修正されました(ただし、ほとんどのプレイヤーは違いに気付かないでしょう)。 苦い後味はあるものの、これは勝利です。最後のゲームをGameCubeで起動することを強制しましたが、未解決の秘密はまだたくさんあります。 もちろん、一部のゲームはまだ「抜け落ち」ており、解決する必要がある多くの問題がありますが、完全に機能しないゲームはなくなりました。



現時点では、DolphinのMMUエミュレーションは既知のゲームを処理できます。 これを変更できるのはファクター5だけですが、Wii向けのゲームを1つも作成していないようです...





スターウォーズ:Wiiのローグリーダー



しかし、Wii には別のRogue Squadronゲームがあることが判明しました。 Factor 5で開発されたため、以前はゲームのようにコンソールを操作できませんでした。 しかし問題は、ゲームがリリースされなかったため、Dolphinで開くことができないことです。 まだ存在しますが; 誰かがDolphinで実行しようとするかもしれません。 たぶん彼女は「出発」を見て、それが必然的に引き起こすだろう。 それとも、それが開始され、少なくとも1つのスクリーンショットを作成することが判明しますか? (まあ、お願いします!)



まあ。 少なくとも、新しい会社に既にあるFactor 5の主要メンバーによって開発されたNetflixチャンネルがあります。 そして、おそらく既に推測されているように、Dolphinでは実行されません。



All Articles