Link from legend of zelda in a fighting pose
Photo by Sun Cathuria on Unsplash

Nintendo Switch 2向け『ゼルダの伝説 時のオカリナ』リメイクが、発売から数日でAndroidスマートフォン上でも動作しました。Snapdragon 8 Eliteを搭載したPOCO F7 Ultraでは、映像の中間フレームを補う「フレーム生成」と専用のGPUドライバーを使い、25〜30fpsの表示に達しています。一方、負荷の大きい場面転換ではRAM使用量が12GBを超え、RAMが16GB未満の端末でクラッシュする事例も出ています。

POCO F7 Ultraで動作、描画の乱れや発熱も

動作に使われたBanana Nativeは、Switch 2用ゲームをAndroidで実行するための非公式ソフトウェアです。RedditユーザーのBottleCautious3346がPOCO F7 Ultraでの動作映像を公開し、フレーム生成と標準以外のGPUドライバーを組み合わせた実行例を示しました。

初期のテストでは、草木が表示されない、照明が白飛びするといった描画の不具合が発生しています。起動直後には、光や表面の見え方などを処理するシェーダーのコンパイルによって、映像が長くカクつく現象も生じています。発熱とメモリ使用量の両面で、高性能端末にも大きな負荷がかかる状況です。

Switch 2上の本作は60fpsで安定して動作し、細かなテクスチャーや草花、雨や霧を伴う風景を描きます。Polygonは、こうした映像表現をSwitch 2の性能を生かした技術的な見せ場と評価しています。

ARM64コードを直接実行し、OSと描画の違いを変換

Androidでは、本作に先立ってが登場していました。Banana Nativeもその一つで、CPUの動作をソフトウェアで再現する代わりに、ゲーム自身のARM64コードをスマートフォンのCPUで直接動かす方式を採っています。

ARM64は64ビットのARM命令を使う仕組みで、Switch 2のCPUも64ビットのARM命令セットに対応しています。Banana Nativeでは、このコードを端末で直接実行するため、CPU命令そのものを別の命令へ置き換える処理を省けます。

ただし、AndroidのOSやGPUに合わせる処理は必要です。Banana Nativeから派生したSwap2-Nativeでは、Androidのカーネルに合わせて必要な箇所だけコードを書き換え、Switch 2のシステム呼び出しやサービスにはホスト側の処理が応答します。ゲームが求めるOS機能をAndroid側で受け持つ構成です。

描画では、Switch 2のNVN系グラフィックス命令を、Android側の描画APIであるVulkan上で実行できる形に変換します。シェーダーもSPIR-Vという形式へ変換し、準備処理はコンピューターまたは端末自身で行います。

フレーム生成は描画済みの映像から中間の画像を作成

POCO F7 Ultraでの実行例には、フレーム生成が使われています。この技術は、ゲームが描いたフレームの間に、計算で作った中間フレームを差し込んで映像の動きを滑らかにするものです。生成した画像でプレイヤーの入力やゲーム処理を新たに計算する仕組みではなく、操作への反応は主に生成前の描画速度に左右されます。

本作の実行例では、ゲーム側の描画は約15fpsで、フレーム生成によって約30fpsの表示に補間されています。Banana Nativeのフレーム生成にはLossless Scalingの技術が使われ、利用には自身で用意したLossless.dllが必要です。

フレーム生成では中間画像を作る処理が加わり、入力遅延が増える場合があります。また、元の描画速度が低いほどフレーム間の動きが大きくなり、速いカメラ移動などで残像や輪郭の乱れが生じやすくなります。

AndroidではシステムやほかのアプリもRAMを使用

本作のAndroidでの実行では、場面転換時にRAM使用量が12GBを超えることが、動作を制約する要因になっています。Switch 2は12GBのメモリを搭載し、このうち3GBをシステム用に確保して、ゲーム開発者が使える容量は9GBです。

Androidでは、CPUとGPUが同じRAMにアクセスし、システムの重要なプロセスと複数のアプリの間でメモリを配分します。終了したアプリも素早く切り替えられるようメモリ上に保持するため、利用状況に応じて空き容量が変動します。

メモリが不足すると、Androidは不要なデータの回収やRAM内での圧縮を行い、それでも足りない場合にはプロセスを終了します。使用中のアプリも終了対象になり得る仕組みです。

Banana Nativeは非公式の実験的なプロジェクトで、開発側のテストは1台の端末で行われています。端末の温度や電力モードによって動作速度が変わり、発熱による速度低下やクラッシュも既知の問題に含まれています。