Unity を検索

データ指向設計の座談会:あなたの質問にお答えします

2024年2月28日 カテゴリ: Engine & platform | 9 分 で読めます
DOTS webinar questions
DOTS webinar questions
取り上げているトピック
シェア

Is this article helpful for you?

Thank you for your feedback!

12月、当社は Stunlock Studios(『V Rising』)および Sunblink Entertainment(『HEROish』『Hello Kitty Island Adventure』)と共に、DOTS の手法についてのクリエイター座談会を開催しました。Data-Oriented Technology Stack(DOTS)を早期導入したこれらの企業に、DOTS を使用した経験を共有していただき、データ指向プログラミングが持つどのような機能や特性が自社のゲームに活かされ、また最新のエンティティコンポーネントシステム(ECS)の技術をどのように Unity 2022 LTS に活用してるのかを教えていただきました。

ウェビナーの質疑応答は大いに盛り上がり、視聴者からは、ライブ中には答えられないほど多くの有意義な質問がなされました。フォローアップとして、Unity のディレクター兼ソフトウェアエンジニアである Joe Valenzuela および Stunlock Studios のテクニカルディレクターである Rasmus Höök 氏に、セッションで寄せられたいくつかの質問に答えていただきました。こちらの質問および回答を、以下に掲載しています。また「データ指向設計でゲームの可能性を最大限引き出す」ウェビナーは、こちらからオンデマンドでご覧いただけます。

V Rising by Stunlock Studios
Stunlock Studios による『V Rising』

「DOTS を使用してすぐに新規プロジェクトを開始する方がよいのでしょうか、それとも通常のゲームオブジェクトを使用し、その後 ECS(単一またはハイブリッド)に移行することでパフォーマンスを最適化する方がよいのでしょうか?」

JOE VALENZUELA: ECS、DOTS、およびデータ指向設計(DOD)はパフォーマンスを改善させるだけではありません。オブジェクト指向プログラミング(OOP)を使用して問題をモデル化する際の特有の複雑さを避けることもできます。

マルチプレイヤーゲーム、特に認証サーバーとクライアントサイド予測を採用するゲームの制作を予定している方は、DOTS のから始めるのを真剣に検討することをお勧めします。Netcode for Entities は、スケールアップでき、わかりやすいゲームプレイコードを書ける、非常に堅牢で強力なシステムを提供しています。

マルチプレイヤーゲームの制作を予定していない、またはプロトタイプを作成して新しいアイデアを素早く試したいだけの場合は、MonoBehaviour/ゲームオブジェクトの使用を検討するとよいでしょう。

「完全に DOTS システムのみを使用してゲームを作成することは可能ですか?あるいは DOTS が対応しているのはゲームオブジェクトシステムのみですか?」

JOE VALENZUELA: DOTS システムのみではできません。おそらくどこかの段階でいくつかのゲームオブジェクトが必要になるでしょう。これは私たちが取り組んでいる課題のひとつです。

「DOTS のデメリット、または開発者が DOTS を使用すべきではないケースはどんな場合ですか?」

JOE VALENZUELA: 私はその質問の回答者として相応しくないかもしれません。というのも、私には Unity で DOTS 以外を使用したいと思う場面がないんです!強いて言うなら、従来の MonoBehaviour/ゲームオブジェクトベースのプロジェクトは、プロトタイプを作成する上で非常に優れていると思います。頻繁な変更が想定される場合、ベイカーの作成やデータ設計に多くの時間を費やすのは得策ではありませんよね。これは、DOTS で将来的に合理化したいと思っている分野です。

「HÖÖK さん、データ指向プログラミングに強いエンジニアを育成するために何かアドバイスはありますか?」

RASMUS HÖÖK: まずは、実際に抱えている問題を解決するための、できるだけわかりやすく単純なコードを書くことから始めるといいと思います。初心者プログラマーになったつもりで、結果重視のコードを書いてみるのです。目標は、コードに実行させたいことをさせることです。最初の目標は、再利用できるコードを書くことでも、抽象化させることでもありません。

ECS の使用を開始する際は、考えすぎたり、設計を過度に複雑にしないようにしましょう。細かく細分化するのではなく、むしろ最初はより大きなコンポーネントや大きなシステムを使うのです。これにより、コードを追いやすくなります。細分化は、必要な場合に後から行いましょう。私たちも早い段階でこの間違いをしました。

データ指向プログラミングを実践するのに最適なのは、何かを最適化する必要があるときです。そうすれば、実際の問題でいろいろと試し、結果を測定することができます。また、データについて考えることがいかに重要かもわかるでしょう。

「スケールアップやより野心的なゲームの構築に DOTS を使用するという話をよく聞きますが、スケールダウンに対するメリットはありますか?つまり、小規模のプロジェクトで、ローエンドのシステムをターゲットにする場合などです。」

JOE VALENZUELA: 性能の低いシステムでの効率的な操作は、実行できるシミュレーションコードの品質を向上させます。これは、バッテリー駆動デバイスのバッテリー要件を緩和し、稼働時間の延長とシステム全体の健全化にもつながります。

V Rising by Stunlock Studios
Stunlock Studios による『V Rising』

「SystemBase から ISystem に切り替える際、マネージコードへの呼び出しはどのように処理しますか?」

JOE VALENZUELA: 技術的には、ISystem を使用するためにマネージコードを取り除く必要はありません。マネージコードは ISystem から呼び出し可能です。マネージデータは ISystem に直接格納することはできません。そのため、マネージコンポーネントデータを使用するのがよいでしょう。

ただ、「Burst を使用してコードから最高のパフォーマンスを引き出すために、ISystem からのマネージコードへの呼び出しを除外するにはどうすればよいか?」という質問であれば、その答えは場合により異なります。 

.NET コンテナを使用しているなら、com.unity.collections で適切な代替手段が見つかるかもしれません。マネージ Unity API と連動していて、アンマネージの代替手段がない場合は、作業を「データ取得」フェーズと「処理」フェーズに分けると便利でしょう。「処理」では ISystem ベースの処理を行います。

「ECS は複数シーンのアーキテクチャと互換性がないとドキュメントで読みました。では、ECS を使用して複数シーンのアーキテクチャを実現するにはどうすればいいですか?」

JOE VALENZUELA: ECS には、複数の Unity シーンを追加的にロードすることを防ぐものはありません。しかし、これらのシーンには ECS のデータは含まれず、MonoBehaviour を持つゲームオブジェクトのみが含まれます。

サブシーンはいくつでもオーサリングでき、それぞれがオーサリングしたゲームオブジェクトと MonoBehaviour データを、ランタイム時にロードできるコンパクトなエンティティデータとコンポーネントデータにベイクします。サブシーンはさらに細かいセクションに細分化でき、各セクションは必要に応じてストリームインまたはストリームアウトできます。

「MonoBehaviour/DOTS のハイブリッドを使用することは、プロジェクトの決定論性にどの程度影響を与えますか?」

JOE VALENZUELA: 決定論性とは「0 か 1 か」ではなく、すべての実行の詳細が実行間で同一になるとは限りません。一般的に、ハイブリッドの相互運用性は、パーティクルシステムやオーディオのような、フレームごとの完全な再現が必要でない表現の詳細で必要となることがあります。

予測ゲームプレイのような機能では、ECS でシミュレートすることが望ましいでしょう。

「どのように何百ものシステムを管理しているのですか?すべてが常時稼働していて、クエリにエンティティがないときはロジックを実行しないだけということでしょうか?または、ゲームのステートに応じてシステムを起動させるのですか?」

JOE VALENZUELA: 開発を容易にするため、システムはデフォルトで更新されるようになっています。パフォーマンスにおける差異は大きくありませんが、実際に何百ものシステムがある場合は、RequireForUpdate を呼び出すか、RequireMatchingQueriesForUpdate 属性を使用して遅延更新を行うとよいでしょう。

その場合は、関連するシステムに RequireForUpdate<Foo>() を追加し、それらのシステムの更新をオンにする一種のフラグとして Foo IComponentData をシーンの中で使用します。

「DOTS がランタイム中やゲームプレイ中(聞いたところでは特にレンダリング中)に大量のデータを処理する点でパフォーマンスを向上させることはわかっています。しかし、DOTS は必要なリファクタリングを容易にする点でも本番環境のパフォーマンスを向上させると聞きました。DOTS がどのようにリファクタリングに役立つかについて少しお話しいただけますか?」

JOE VALENZUELA: 私が思う DOTS、ECS、そして DoD 全般の大きな魅力とは、シミュレーションのステートをより多く可視化し、検証可能にすることです。OOP ライブラリのテストを追加しようとした経験があれば、「単純」なインスタンスメソッドの呼び出しに必要なステートを複製するため、膨大な量の機能をモック化またはインスタンス化しなければならないという問題にぶつかったことがあるかもしれません。DoD スタイルのシステムでは、ほとんどの場合、ある値型を別の値型に変換する独立した関数として、変換カーネルを表現できます。

これは、推論、テスト、並列化も非常に簡単にできます。

「私の(アマチュアの)経験から言うと、DoD はデータとアーキテクチャの間に密な結合を生み出し、データ構造に変更が起こるため、大きなリファクタリング作業が発生します。同じような経験はありますか?どのような方法でこの問題に対応または回避しましたか。」

RASMUS HÖÖK: 私たちの経験では、データを変更する場合、ECS を使用する前でも、通常はそのデータを使用するコードを変更する必要があります。そのため、普段からよく直面する以上の苦悩を抱えることはありません!

JOE VALENZUELA: 私は、これが DoD、ましてや ECS の根本的な問題だとは思えません。少なくとも、これらはこれまで進化してきたのですから。

一例を挙げると、OOP における密な結合を解消する従来の方法として、一般的にインスタンス指向の関数やクラス階層を作ることがあります。理論上はよいのですが、そのような抽象化はパフォーマンスプログラミングでは最初に取り除かれるものです。

ECS でユーティリティ関数を書くことを阻むものは何もありません。私たちの ECS では、特定のクエリのためにデータコントラクトを変更する場合、システムを見直す必要があるのは事実ですが、それはデータをばらばらにクエリしている可能性の兆候かもしれません。コンポーネントデータの変換を繰り返していませんか?フレームあたりの変更回数を減らすように書き換えることはできますか?コンポーネントデータの読み込みを繰り返していませんか?もしかしたら、フレームの早い段階で不変なデータ構造にすることができるかもしれません。

最後に、DoD また少なくとも ECS は、より多くの問題の状態を明確にしていると言ってよいでしょう。それはマイナスなことではなく、別のトレードオフです。私は、リファクタリング中は、緩やかな結合や暗示的な結合よりも、密な結合を推論する方をより好みます。

「ECS と OOP はモバイルゲームに適していますか?また、モバイルゲームのプロジェクトにこのアプローチを推奨できますか?リスクや検討事項はありますか?」

JOE VALENZUELA: 複数のクライアントが、ECS のモバイルゲームでの使用に成功しています。こちらの GDC での講演を視聴して、Sunblink Entertainment がどのように『HEROish』に ECS を使用したかをご覧ください。

このコンテンツはサードパーティのプロバイダーによってホストされており、Targeting Cookiesを使用することに同意しない限り動画の視聴が許可されません。これらのプロバイダーの動画の視聴を希望する場合は、Targeting Cookiesのクッキーの設定をオンにしてください。

Harnessing the power of ECS for Unity | Unity at GDC 2023

「『V Rising』のネットワーキングはどのように進められたのですか?Netcode for Entities を使いましたか、それとも他のフレームワークを使いましたか?」

RASMUS HÖÖK: 独自のフレームワークを開発しました。そのリスクを認識しながら、かなり早い時期から DOTS を本番環境に使い始めました。最大限リスクを排除するため、できるだけパッケージには頼らず、可能な限り自前で対応しました。私たちは常にマルチプレイヤーゲームを作成し、独自のソリューションを使用してきたので、自前での対応には慣れていました。

「ECS は本番環境において十分に安定していますか?この数か月間、プロトタイプと格闘してきましたが、それが成長段階の苦悩なのか、それともECS のみの本番プロジェクトを実施するための準備がまだ整っていないのかがわかりません。」

RASMUS HÖÖK: ECS は本番環境で十分に安定していると言えますが、多くのゲーム開発者が当然のように使っているかもしれない機能が不足しています。『V Rising』のゲームプレイコードには ECS のみを使用していますが、アニメーション付きキャラクター、パーティクルエフェクト、UI などの表現に関するものにはすべてゲームオブジェクトを使用しています。現実的には、今からプロジェクトを開始しようと考えているほとんどのチームにとっては、ハイブリッドのアプローチが最適と言えるでしょう。

私たちは、一方行のアプローチを使用して『V Rising』を生み出しました。つまり、ECS のみを使用し、データをゲームオブジェクトにプッシュするだけで、その逆は決して行っていません。例えば、キャラクターのステート(入力、速度など)を ECS データで保持し、それによってロコモーションのステートや、どのアニメーションをどの時間とスピードでアクティベートするかを決定します。そして、ゲームオブジェクトのアニメーターがそのステートにあることを確認します。アニメーターがどんなステートであろうと、ゲームプレイに影響を与えることはありません。この分離によりゲームを全体的に単純化できると思います。

JOE VALENZUELA: ECS は本番環境に対応しており、世界中の顧客が使用していますが、私たちが望むようなシームレスな体験を提供できるまでには、まだ長い道のりがあります。今後の開発にご期待ください。そして、DOTS をご利用いただきありがとうございます!

スケーラブルで高性能なゲームと忘れられない体験を可能にする DOTS で、野心的なゲームを実現させましょう。Unity 2022 LTS で最新機能をお試しください。

2024年2月28日 カテゴリ: Engine & platform | 9 分 で読めます

Is this article helpful for you?

Thank you for your feedback!

取り上げているトピック
関連する投稿