../flux-zatsurikai

Protoflu(x)の実行と値の同期に関するメモ

この記事は筆者の雑な理解で構成されています!! “正しい“情報が必要な方はResonite Wikiの Impulses の項などを参照してください。

Resoniteとは

ソーシャルVR(VRがなくてもできる)。ゲームの中でいろいろな物を作れることが特徴。Protofluxというノードベースのプログラミング言語でいろいろできる。 また、P2Pでそれぞれのセッション(VRCでいうインスタンス)にはHostがいる。

Impulsesについて

Protofluxには、Impulsesという概念がある。これは命令的なプログラミングをするためのもので、ノード間を伝わる信号のような概念。Impulsesが来たノードはそのタイミングで実行(例えば、値を書き込むなど)される。 Impulsesはそれを発火した人(例えばボタンを押した人)のコンピューターで1ゲームティックの内に実行される。複数のゲームティックをまたいだ処理を作るにはAsyncを使う必要がある。 Resoniteでなにかしら処理を行なった後にアウトプットをするには、なにかしら(例えば、変数など)に値を書き込む必要がある(HTTP RequestをしたりWebSocketを使う場合は別)。Impulsesを使う場合、そのために Write ノードを使う。これについてはもう少し詳しく扱う。

Impulsesを使わずに宣言的なプログラムを作ることもできる。+ などのオペレーターはImpulsesを受け取らない。この場合も、Fire on True などで、Impulsesを発生させられる。 Impulsesを使わない場合、アウトプットにはDriveという機能を使う。これは決まった実行タイミングがある訳ではなく、常に値を書き込み続ける。常に書き込み続けるのでDriveは排他的で、Driveされているフィールドは他の場所でWriteなどによって書き込むことはできない。

通常、両者を組み合わせて使う。

同期について

基本的に同期は1つのImpulse(Contextともいわれる)が終了したタイミングで行なわれる(つまり、一つのImpulseで複数回Writeしても送信されるのは最後の値だけ)。なので、Driveは同期されずユーザーによって値が異なることがある。

変数の種類特徴同期されるか
フィールドコンポーネントやスロットに関連付けられた値Drive以外ははい
LocalひとつのImpulseごとに初期化されて、終了すると破棄されるいいえ
StoreImpulseをまたいで、ユーザーごとに初期化されるいいえ
DataModelStoreImpulseとネットワークをまたぐはい
Dynamic Variablesパス(変数名)を変えることで動的に変数を作成できる。Impulseをまたぐはい
Cloud Variablesワールドやアイテムに関連付けられるのではなくユーザーやグループに関連付けられるはい

Tags /Resonite/