土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

#UEFN #Verse 3/28の"Ask Epic: Verse"で面白かった回答ピックアップ(その3)

第3回です。これまでもマニアックな質問が多かったかもしれませんが、ここからは更に多くなっていきます。

SubscribeとAwait(内部スタッフの好みはどっち?)

https://forums.unrealengine.com/t/ask-epic-verse-march-28-10-00-am-et/1765393/96?u=t.tutiya

Q:SubscribeAwaitのどちらを使うべきでしょうか?これらはどういう時に使うのが良いですか?また、Subscribeを通して他のパラメータを効率的に渡すためのサポートはあるのでしょうか?

A:私自身は、強力な構造化された並行性の展開機能を持つコルーチン(つまりサスペンド効果を持つ関数)を極力使います。これには、現状ではラムダ式がないために Subscribeを記述することが難しいからもあります。ラムダ式が利用できるようになれば、Subscribe を通してパラメータを渡すことは、より少ないコードで済むようになります(ただし、直接書いた場合と効率は変わらないでしょう)。

土屋解説

非同期処理はSubscribe()Await()のどっちを使った方がいいのかの話*1。「構造化された平行処理の展開機能(the structured concurrency macros)」はAwaitの事を指します*2

ラムダ式と言うのは「匿名関数」とも呼ばれる記述形式で、式として記述できる関数の事を言います。例えば、function型を引数に取る関数を呼び出す時に、引数にデリゲート関数ではなくラムダ式を直接書くことができます。

ラムダ式はモダン言語では大抵用意されていますが、Verseにはまだありません。そのためSubscribe()に関数を渡す為に、毎回デリゲート用の関数を用意する必要があります。

回答では、ラムダ式が使えるようになれば今よりSubscribe()をシンプルに書けるようになる(これは本当)が、処理効率は変わらない(これも本当*3)とのこと。

なお土屋個人はAwait派です。ただ、Verseだとサンプルコードが少なくてさっと使う感じにはまだならないですね……。

タスクのキャンセルが無い理由

https://forums.unrealengine.com/t/ask-epic-verse-march-28-10-00-am-et/1765393/76?u=t.tutiya

Q:なぜVerseではタスクをキャンセルできないのでしょうか?

A:Cancelメソッドが公開されれば、セルフキャンセルが可能になりますが、そのセマンティクスはまだ適切に実装されていません(※なので公開していない)。しかし、その予定はあります。現状可能なのは、コードをrace/rush/branchを使うコードに書き直す事だけです(後者2つは、関数が戻った時点で残りのタスクをキャンセルします)。

土屋解説

タスクというのは並行処理中のそれぞれのスレッドで行われている処理を指す言葉です。一般的な非同期処理では、実行中のタスクを外部から終了(キャンセル)させるメソッドが用意されているのですが、現時点のVerseにはありません(つまり、外部からキャンセル出来ない)。実装予定ではあるが、現時点ではなんらかの非同期式を使って欲しいとの事。

配列ソートが無い理由

https://forums.unrealengine.com/t/ask-epic-verse-march-28-10-00-am-et/1765393/88?u=t.tutiya

Q:標準で配列のSortメソッドがないのはなぜですか?

A:Less述語が無い(※引数が無い)Sortメソッドが無いのは、現在のVerseが、順序をユーザー定義するための記述手段を持っていないためです。Less述語を取るSortメソッドについては、Less-less Sortを満足させる言語メカニズムが確立されれば、このバージョンの必要性がなくなるかもしれない。

土屋つかさ

 すみませんこれどうにも上手く訳せないので後半はほぼ直訳です。関数型言語の配列は巡回での取得時にソートしながら取得できる物が多いのに、なぜVerseにはその機能が標準で用意されていないのかという質問。回答はソートに必要な記述手段(Less述語)についての言語設計上の位置づけが定まっていないからという事のようです。

後半に書いてある事はよくわからない……。Less-less Sortというのはコンパイラ技術用語なのかな?(知らない)。ご存知の方がいたらコメント頂けると嬉しいです。

3項演算子はないの?

https://forums.unrealengine.com/t/ask-epic-verse-march-28-10-00-am-et/1765393/67?u=t.tutiya

Q:三項演算子は使えるようになりますか?

A:ifは式として使え、これは他の言語での三項演算子の動作と一致します。ドキュメントのifを参照してください。

土屋解説

三項演算子とはC系言語では基本的に用意されている以下の様な式の事です。

bool X = a < b ? true : false

if文の式バージョンで、then/elseの結果を戻り値にできるので、場合によって記述をシンプルにできます。

回答は、「Verseではそもそもifが式なので、三項演算子と同じ形式で書けるよ」というのが回答でした。

Recharge : int = if(ShieldLevel < 50) then GetMaxRecharge() else GetMinRecharge()

仰る通り。

島全体の永続化データについて(1)

https://forums.unrealengine.com/t/ask-epic-verse-march-28-10-00-am-et/1765393/84?u=t.tutiya

Q:グローバルデータ永続化システムのような物は、いつごろ可能になりますか?

A:MaxVerseの要求との互換性を保ちつつ、どのような物にするか設計している最中です。

土屋解説

現在Verseにもっとも求められている機能の1つが島単位で恒久的に保持される永続化データの機能です。現在のVerseではラウンド単位、あるいはプレイヤー単位でしか永続化データを保持できないので、例えばハイスコアの保存とかが出来ないんですね*4

MaxVerseは、次期VerseVMの実装を指す場合と、もっと未来のVerse言語の仕様を指す場合があります。今回がどっちなのかわかりません(多分後者)が、なんにせよまだ設計段階という事なので、しばらくUEFNに実装されることは無さそうです。

島全体の永続化データについて(2)

https://forums.unrealengine.com/t/ask-epic-verse-march-28-10-00-am-et/1765393/85?u=t.tutiya

Q:MaxVerse版の永続化機能はどのような物ですか?

A:MaxVerseにおける永続化機能は、ほぼ暗黙的なものになります。モジュール空間にあるvar変数はいずれもグローバルに公開され、かつ、どのような型でも使えるようになります。

土屋解説

1つ前の質問の続きです。「「MaxVerseの永続化との互換性を検証してる」って言うけど、その「MaxVerseの永続化」ってどういう物なの?」という質問に対する回答。MaxVerseでは、モジュール空間に任意の型のvar変数を記述できて、それらは暗黙的に永続化データとして機能するようです(ホントにい?)。

ティム・スウィーニーからのメッセージ(1)

https://forums.unrealengine.com/t/ask-epic-verse-march-28-10-00-am-et/1765393/68?u=t.tutiya

Q:何故Verseが最初に導入されたのは、多数の開発者が最初に登場すると期待していたUnreal Engineではなく、UEFNだったのでしょうか?(この方針が決まった背景に興味があります)

A:Timに尋ねました。「私たちは、(これまでより)シンプルな新しいAPI群を新規開発する必要がありました。Unreal Engineのライセンス利用者(彼らにはより複雑なニーズがあり、かつ既にC++で幅広く対応しています)のためにC++と並行してVerseを追加するよりも、Fortniteの上にVerseを追加することで、沢山の牽引力を得られると考えました」

土屋解説

「Tim」は、Epic GamesのCEO、ティム・スウィーニーの事です。「Epic Gamesがゲーム開発に特化した新しい言語を作っている」という話は英語圏では何年も前から話題になっていて、多くの人は(当然ながら)まずUnreal Engineで採用されると考えていたようです。

ティム・スウィーニーからのメッセージ(2)

https://forums.unrealengine.com/t/ask-epic-verse-march-28-10-00-am-et/1765393/62?u=t.tutiya

Q:Unreal Engineの開発者がVerseを使えるようになる予定はありますか。もしあれば教えてください。

A:Tim Sweeneyによれば、実現はするが、今年では無いとの事でした。

土屋解説

UEへのVerse搭載については、ティム・スウィーニーはXでも言及しています(以下訳)。

https://x.com/TimSweeneyEpic/status/1770780043637088385

「スタンドアローンのUnreal EngineとUEFNの完全な連携は、何年か後におけるUnreal Engine 6での目標です。それまでは、両者間で多数のアセットの利用はできますが、ゲームプレイのコードは別々に(UEではC++、UEFNではVerse)管理する必要があります」

UEでVerseが使えるようになるのは当面先のようです。

おわりに

第3回はここまで。次回で最終回の予定です。最後は型システム関連の質問がメインで、実開発ではあまり関係しない物が多いと思います。

宣伝

Verse言語の言語仕様解説同人誌をPDFで頒布しています。よろしければどうぞ。

s-games.booth.pm


*1:非同期処理については過去ログを参照。

*2:その筈。通常、Awaitは内部的にステートマシンのロジックとしてマクロ展開されるため。

*3:ラムダ式は単なるシンタックスシュガーのため

*4:リーダーボードを採用している島は、作者が手作業でデータを更新しています