Open3
em2native: 残件整理の会
em2native(Yuniframe)の目標
- C言語で書いた単一のゲームをWebとAndroidとiOSとtvOSとXboxとPCでそのまま動かす
- アプリアイコンの貼り込みやパッケージングもCMakeベースのビルドシステムでサポート
- DirectX 9(= WebGL1)程度のグラフィックス表現
- Unity WebGL その他EmscriptenのWebGLアプリからの変換に対応
直近のToDo
- 画面サイズAPI
- テストを書く
- 実機テスト環境の構築 -- 週1回XboxとAppleTVの電源を入れてテスト廻す
近い将来
- JavaScript側のWASM化
- WebGPU描画バックエンド? -- Vulkanと迷い中、ANGLEは中間層としてちょっとでかいがVulkanは良いDirectX上の実装が無い
- WASMインタプリタ -- wasm2cはちょっと遅すぎなので
- Webのネイティブプレイヤー -- 全体をWeb Workerに載せ、WebGL描画のみを転送して描画
- サブセット版 -- 2Dスプライト版や旧世代GPU版を用意してESP32あたりに組込みをしたい
- アプリをストアサブミッションする -- ネタが無い、ミニゲームでも作る。。?
将来(R&D)
- TAS(Tool-Assisted Speedrun)に耐えるセーブ/ロードと再現性
- 再現性のあるマルチスレッドサポート -- 専用のJobシステム。。?
- 非同期ファイルシステム
- ROM化 -- 圧縮テクスチャや各プラットフォーム向け事前生成シェーダー等
- マイグレーション(テレポーテーション) -- プレイ中のゲームを他のプラットフォームでプレイ再開する
- ステートシェア -- 入力のみの共有で同一ゲームを2箇所で同時にプレイする
- 3D Object Audio
- 筆圧ペン対応
- HDR
- VRR
- VRアプリに対応(WebXR相当のC APIを設計する) -- 動作プラットフォームはWebXRとARKit iOSを想定
- エキゾチックなプラットフォーム -- 2D版 + BD-J ? Classic MacOS ?
やらない(鋼の意思)
- WebGL2 -- 売り物なら良いけど。。RaspberryPiのような強力なdesign winが無いし対応できるころにはUnityがWebGPUになってそう
- Unityからの直接エクスポート
完全なWASM化
今は描画APIはJavaScriptインタプリタから呼ばせている。つまり、WASM内部のポインタと実際のポインタの変換はEmscriptenのランタイムが行う形になっている。
YuniframeのAPIは、このようなポインタ変換を実装しやすいように意図的に設計している。
構造体がない 。このため、構造体のためのアクセサを生成する必要は無い。
ポインタと領域サイズを常にセットにしている 。このため、WASMメモリからアプリケーションのメモリにコピーするサイズを専用ロジックを用いて計算しなければならないシチュエーションを極力減らしている。
完全なWASM化を行うことで、WASMメモリの保存復帰さえ実装すればアプリケーションの動作状態をシリアライズできるようになる。(現実のアプリとしてはWebGLの状態の保存・復帰も必要だが。。)
画面
むずかしい。現在は720p固定だが、以下のようなバリエーションを事前(アプリのビルド時)に宣言する形にすることを考えている。
- TVGame: 16:9、描画解像度はアプリケーションが指定、システムが拡大、(原則)動作中の変更なし
- FlexibleGame: 横専用、アスペクト比は自由、フルスクリーン指向
- App: 縦横自由、画面サイズはシステムが決定、動作中の変更あり、ユーザ変更も許可
できればiOSやAndroidの2画面アプリケーションをサポートしたいが。。
2K ←→ 4K のTV差し替えとかをどう考えるかも悩ましい。(実際の差し替えというより、上記のR&Dに挙げたテレポーテーションの都合が大きい)