🐉

2024年の思い出コーナー

2024/12/30に公開

総評

本業の方は新製品が発売になったり色々仕事したんですが、なかなか手元のプロジェクトを面白い形にまとめる時間が取れない。。

いや自分はめっちゃ楽しんでるんですが、その楽しさを伝えてこそ価値がある...と思うんですよね。。一応ゲーム業してるので。。

プロジェクト進捗

今年はWasmLinuxの周辺プロジェクトへの投資が多く、あんまりWasmLinux自体を進められませんでした。まぁ既存のプログラムをWeb上で活用するならエミュレーターを挟んだ方がたぶん筋が良いしなぁ...

WasmLinux

WasmLinuxはLinuxカーネルとユーザーランドをWebAssembly上で実現する企画です。今年の初めにBusyBoxが動作するデモと記事を公開しました。

https://wasmlinux-demo.pages.dev/

https://zenn.dev/okuoku/articles/89a96bcee4cc93

Hacker newsに載ったわけでもないのに海外からの反響が結構あって、特に教育系やツールチェイン系からロードマップを尋かれることが多かったです。意外なところに需要があるもんですね。

ただ、直近の良い目標が無く停滞中。実用的なプログラムを動かすにはどうしても mmap のサポートが必須で、これはWebAssembly上にWebAssembly VMを実装する以外の良い解が無いのでどうしたものか。。対応策を考える間はemscripten2nativeとか仮想化関連の別プロジェクトを進めている状況です。WasmLinuxがベースにしているLKLには今週 mmap をサポートするためのパッチが投稿されました:

https://github.com/lkl/linux/pull/551

これは今のところ64bit限定ですがWasm64 → Wasm32へのpolyfillは簡単なので一歩目としては単純に採用してしまっても良いかも。つってもWasm的なメモリをmmapに置き換えられるWasm処理系があんまり選択肢がない。。

あと、もっと真剣なLinuxカーネルのWebAssembly移植が出現したりしていてWebAssemblyによるローレベルプログラミング界隈(?)が盛り上っているのは感じています。

https://github.com/tombl/linux

来年はせめて最新版のLKLへのキャッチアップと他Wasm処理系への対応の検討を進めたい所。。ただ、 setjmp / longjmp の実現に必要なExceptionのサポートすら依然対応状況が悪い(https://webassembly.org/features/ の "Exception Handling with exnref" または "Legacy Exception") 状態で、何か上手い抽象化レイヤ -- ブラウザではLegacy Exceptionを使いつつ、他のWasm処理系ではAsyncifyを使うような -- を考える必要があります。

emscripten2native(yuniframe)

Emscripten2nativeはEmscriptenでビルドされたWebGLアプリをネイティブアプリにAOTコンパイルする企画です。ゲーム開発者から見ると単一納品になって便利なんじゃないかなと。デバッグが苦行すぎるのでダメですが。

とりあえずUnityがWebGL2必須になっちゃったので、C-WebGL(WebGLのC言語バインディング)も頑張ってWebGL2.0の語彙だけ載せました。Vulkan側の対応は後日。。

来年はGodotとかPyxelのようなOSS系のゲームエンジンの Web → ネイティブ変換に対応したいですね。。Pyxelとか(構造上本物のマルウェアとどうしても似てしまうので)アンチウイルスに良くあたっちゃう問題があったりして緩和策として実は有用なんではないか説。

ビルドトレース(repomeme, reposoup)

これは近日中に記事に纏めるつもりなので今年は省略。。ビルドプロセスのトレースを行い、 誰が何バイト最終的なプログラムに貢献したか というレベルで証跡の追跡を行える精度を目指します。

qemuをわざわざDockerでビルドしたのも、実はこれで分析するためだったりします。

https://zenn.dev/okuoku/articles/227043abe241a8

Scheme処理系(MoshとYuni)

Clang19で正常にビルドできないというのがFreeBSDからレポートされたので対応しました。

https://zenn.dev/okuoku/scraps/4996ae93d98ed8

https://github.com/higepon/mosh/issues/263

Upstreamしたいけど古いコードを整理したりも必要なのでなかなか大変。。

Yuniは共通FFI仕様NCCC(Normalized C Calling Convention)を中心とした動的言語向けのアプリケーションフレームワークで、Chez SchemeとNode.jsで同じFFIプラグインを呼ぶ実験をしたりしました。Scheme処理系はどんな動的言語でも簡単に実装できる[要出典]ので、Schemeで一度書いてwrite once run anywhereを狙いたいところ。

https://zenn.dev/okuoku/scraps/164730a000cecb

https://zenn.dev/okuoku/scraps/839d0b250468a2

どちらもemscripten2nativeで開発したC-WebGLを呼んでいます。なのでWebGLでできることはどちらの処理系でもできる。。ようになるはず。

Bluetooth LE 活用おもちゃ

なかなか企画が固まらない。。実世界連動のおもちゃをBLEを活用しつつ作りましょうという企画。色々とコンディションを変えながらGPS(GNSS)ログデータの収集は続けていて、今年は ついに日本海に到達!

https://x.com/okuoku/status/1807012142782255190

https://zenn.dev/okuoku/scraps/9eb9d3ef4388fb

... リプレイを見ながら、どういうUXが良いか色々考えてる所です。。関東一円を歩きまわって得たログデータはGPS座標と精度が1秒間隔で記録されているので、地図ベースのsuggestionとかキャラクターとの掛け合いなどをその場でシミュレーションできます。

たまごっちUniemojam のようなクラウド(AWS)連動おもちゃのリリースが続いていることを考えると目の付けどころは間違ってはいないと思うんですが、Wi-Fiを必須にしてしまうと値段が。。

来年

2年連続で埼玉の夜道で車避けて転んでるので、とにかくケガを無くさないと。。どちらも車のライトが目に入ったあとの順応の間に歩道の縁石を踏んでいる(と見られる)ので、ライト常備で防止できるんじゃないかなと。。

Zennの方は年に2記事は流石に少いので何とかしたいんですが。。

C-WebGLのマルチキューとCompute対応

C-WebGL上にWebGPUやVulkanを実装できないか考え中です。WebGPUにはOpenGL ES3.1レベルの機能性で実装できるサブセットが企画されていて、これを実装するのに必要充分なものがあれば良いんじゃないかなと。

https://github.com/gpuweb/gpuweb/issues/4266

あと営業上の理由で非同期コンピュートが必要なので、WebGLを独自拡張してコンピュート対応を考えたい所。認識系のタスクはどうしてもコンピュートが都合が良い & ミドルウェアにコンピュートキューだけあげる方式がユーザー的には嬉しいんです。。

Vulkanのサブセット(Portability Initiative)は全く動きがなく今後の進捗もあまり期待できないので、残念ながら自前のサブセットを用意するしか無いかなと。。さすがにゼロからやりたくないので誰かがWebGPU上のサブセットを作ってくれるの待ちです。

まずはemscripten2native上で、dawnのような既存のWebGPU実装を直接使ってWebGPUプログラムが動く環境を用意するのが目標になると思います。

オーディオ関連

とりあえずAndroid XRの発表でXRプラットフォームは出揃ったかなというところなのでオーディオ関連もemscripten2nativeに実装していきたいと考えています。結局、Apple以外はいわゆる3Dパンニング以上の機能性を提供しなかったので、古のOpenALをベースにしたAPI + 簡単な部屋モデル(shoebox程度)で充分対応できると判断しました。

https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/3035

Pipewireのissueも1年以上動きがないし。。結局、デスクトップ用途ではゲームが大きなアプリケーションになるはずですがゲーム側がミキシングするのが普通の実装なのでユースケースが無いんですよね。。CP2077のように、ちゃんと(主にDolby Atmos対応のために)Windows側の3Dオーディオスタックを使う実装もたまには有りますが。

直近では。。Unityのオーディオ出力が機能するレベルのWebAudio実装を用意するところから始めようかなと。ただ、そのためにはWebGL2の対応が先ですね。。(今のUnityでは必須なので)

ビルドトレース

ビルドトレースは一旦リリースまで進めようということで難易度の高い侵襲的なトレーシングを分けて、パッシブな情報取得を先に取り組む方向に転換しました。

侵襲的なトレース は、Bear https://github.com/rizsotto/Bear のようなツールを仕掛けてビルドを再実行して結果を得る方法で、特にWindowsで打率がイマイチなのであとまわしにしました。WasmLinuxにおけるLinux自体くらいしか手元のプロジェクトでMakefileプロジェクトって無いんですよね。。

パッシブなトレース は、CMakeやmesonのようなNinjaジェネレーターの出力から compile_commands.json を生成します。Ninjaは 1.12 以降 compdb ツールで全ダンプできるようになった ので、これを活用できないかなと。

(CMakeには CMAKE_EXPORT_COMPILE_COMMANDS で直接 compile_commands.json を出力できますが、ソースコード間の関連を見い出すためには、これでエクスポートされないリンクのコマンドが必須なので自前のものを用意する必要があります。)

というわけで、しばらくパッシブなトレースをemscripten2nativeで運用したあと、Linuxカーネルだけは侵襲的にトレースして機能検証を進める方向で考えています。

Discussion