こんばんは。きさらぎです。
この記事はNeosVR(その2) Advent Calendar 2022の5日めです。
昨日の記事はLettuceFryさんの「今年作ったものリスト」でした。
私
NeosVR1とツイッターをやっています。GitHubではKisaragiEffective
として活動しています。ただまあまあ識別子が長いので、この界隈ではkisaragiと名乗っています。よくLinuxのペンギンアイコンが珍しいと言われます2。
早速振り返りをはじめていきたいと思います。
今年作ったツール
NeosInventoryManagement
これは何?
NeosVRにはインベントリという、モデルやアバターやワールド(以下、本稿ではまとめて「アセット」と呼ぶ)を保存するストレージがあります。ストレージには容量の上限はありますが、個数制限はありません。
そのインベントリをWindowsのエクスプローラーのように管理できるようにするためのツールになる予定です。
経緯
NeosVRを始めて3から1日目[要出典] の2022年7月29日4。kazuさんと話していた中で、次のようなやりとりがありました(敬称略)。
kazu「あれもこれもと保存していくと、フォルダーの中身がひどいことになるんですよね」
kisaragi「みなさんそれどうしているんですか」
kazu「大晦日に『インベントリ整理大会』を開いて出しては入れてを繰り返していました」
kisaragi「うわぁ…」
kisaragi「インベントリ操作用のAPIとかないんですか?」
kazu「ありますよ、ドキュメント見ますか?」
そうしてドキュメントやkazuさん手製の内部資料が手渡されました。
それから数日で大概の機能は実装し終わりました。途中オプションで有効化することができるTOTP5を追加したりなどもして、0.1.8
までバージョン番号を駆け抜けました。
今後の展望
将来的にはNeosVRのAPIに対する操作を別のクレート6に分離し、そのクレートをOSSライセンスで公開したり、FUSEを使ったNeosFSを作ろうと考えています。また、アセットのコピーや削除、ディレクトリの移動7・作成もコマンドラインから行えることが望ましいと思うので、今後もおそらくコミットし続けることでしょう。
NoPulseFromDisplayImpulse
これは何?
NeosVRにはLogiXというノードを連結してプログラミングをする要素があります。LogiXのDisplayノードにImpulseという「発火したもの」を出力すると、出力のたびにエヴァンゲリオンのATフィールドのような八角形のエフェクトが出てきます。それを抑制するMODです。
なぜ?
そのエフェクトが高頻度で発火するとセッション8がクラッシュすることがあるためです。
今後の展望
MODリストとかに登録する、とかでしょうか?まだ具体的なビジョンが浮かんでいません。
EnableSitModeOnLaunch
これは何?
以下のツイートを見て「できそうだな」と思ったので作ったMODです。
NeosVRの着席モードってVrchatみたいに固定できないもんかな?起動毎にスイッチ押すぐらい面倒くさがるなと言われればそうだけど。
― https://twitter.com/maid_doll/status/1584217788528218112
なぜ?
簡単そうだと思ったからです。
今後の展望
このMODは少なくとも期待したように動作していないのは事実ですが、それがMODのせいか、NeosVRの仕様なのかがはっきりしないのでそこを解明した上で修正したいです。
neosvr-launcher-wrapper
これは何?
NeosVRはコマンドラインから起動することもできます。NeosVRのコマンドライン引数は割と複雑な上、なにかおかしなことがあっても黙って引数を「食べて」しまいます。このプログラムをターミナル9から起動することで、予め不正な引数の組み合わせなどを検知し弾くために作成しました。
今後の展望
- オープンソース化
- マニアックな引数に対応していないのでゆるやかに増やしたい
nikka-leaps
これは何?
nvmlを介してNVIDIA製GPUのVRAMの使用量を監視するプログラムです。
なぜ?
NeosVRにおいてVideoPlayerなどにテクスチャが割り当てられないことがある原因を調査するために作りました1011。
将来の展望
- ターミナルで動かすことを想定しているが、ターミナル環境であってもGUIのような「華やかさ」をもたせたい
- 折れ線グラフの出力
来年の野望
来年の話をすると鬼が笑うと言いますが、来年の野望を表明しておきたいと思います。
LogiXをテキストで管理できるようにする
LogiXは、ノードやコンポーネントのデータの流れを考えると有向グラフとみなせるので、どうにか押し込めればテキストで管理できるようになりそうという直感があります。実際、ほとんどの目にするアイテムは*.7zbson
という拡張子で保存されており、その中身はBSONというJSONのコンパクト版を、GZipで圧縮したファイル形式です。よって、機械可読ではあります。
ただし、JSONでプログラミングするのはオブジェクトのキーの名前や構造に気を自分で気を遣ってやる必要があり、とてもだるいので、*.7zbson
と完全に互換なプログラミング言語を作ろうとしています。
ただし、そこに至るまであまりに知識が足りなさすぎて全く追いついていないのが現状。
- コンポーネントの数が多すぎる
- ノードの数も多すぎる
- どのノードがどのノードの型の組み合わせ (オーバーロード) を受け付けるのかわかってない
- サブタイピングが入ったプログラミング言語の設計の経験がない
- LogiXを完全に理解しているわけではないのでエッジケースの振る舞いがわからない
- どのようにLogiXを「より理想的な形」で再定義できるか考えがまとまっていない
- その性質上インタプリタを構築するのが難しい
ただ、実現すれば世界を変えることになるかも知れないので、早いところ完成させたいと思います。
NeosVRのMODに対する継続的インテグレーション
NeosVRのMODというのは、人によってインストールしている場所が異なることもあり、*.csproj
が完全に自己完結というわけではありません。GitHubのPull requestでビルドを走らせようと思っても、まずはNeosVRのクライアントをインストールせねばならず一苦労です。
そこで、将来的にはGitHub Actionsか何らかの形で、NeosVRのクライアントとNeosModLoaderをインストールした上で、手動ではなくGitHubのサーバーでビルドできるかどうかを確かめる環境づくりをしたいです。
あとがき
今日はものすごく急いで書いたので文が乱れていると思いますが、読んでいただきありがとうございました。
明日の記事はきさらぎの「私とNeosVRの関係性について振り返り」です。引き続きお付き合いください。
注釈
-
ユーザーID:
U-kisaragi-marine
↩ -
日本におけるデスクトップパソコンで、Linuxのシェアは1%未満であることから、NeosVRもおそらく似たような状況なのでしょう。 ↩
-
どうして始めたのかは明日書きます。 ↩
-
https://github.com/KisaragiEffective/neosvr-inventory-management/commit/8b0831cb24bc39a4c106b2f545f1da92fd769e3a ↩
-
Rustにおけるクレートとは、C#のdllのような「まとまり」のことを指します。詳しくは https://doc.rust-jp.rs/book-ja/ch07-01-packages-and-crates.html を見てください。 ↩
-
過去のリリースで壊れていることが発覚し、実装力の不足により直ちに実装できないと判断したため、ディレクトリの移動を行うことを一時的に禁止しました。 ↩
-
NeosVRでは、VRChatにおけるインスタンスのことを「セッション」と呼びます。 ↩
-
cmd.exe
(コマンドプロンプト) みたいな黒地に白い字のウィンドウが出る なんかハッカーっぽい あいつです。 ↩ -
おそらく素直にGPUを新調したほうが良い気はしています。 ↩
-
VRAM以前の問題として、NeosVideoPlayerFixを入れた上で
youtube-dl
を入れていないなどのミスも過去には起こしていました。 ↩