Out-of-core precompute: Enlighten 3.10 supports development for massive world

Out-of-core precompute: Enlighten 3.10 supports development for massive world

Share

イントロダクション

2019年11月、Enlightenチームは最新SDKとしてバージョン3.10をリリースしました。シリコンスタジオに移ってから初めてのリリースであり、開発には長い期間を要しましたが、その甲斐あって単なるバグフィックスだけではなく様々な有益な機能の追加も行うことができました。各種アップデートの詳細についてはリリースノート(SDK/UE4)を確認していただきたいのですが、本記事ではその中でも目玉機能の一つであるUE4での『Out-of-core precompute』についてご紹介していきたいと思います。

はじめにこの機能がなぜ必要なのかという点について簡単に説明をして、それからこの機能の技術的な詳細について少し掘り下げてお話したいと思います。そこから実際のスクリーンショットを交えながらどのようにこの機能を使用するのかをお見せいたします。

背景

昨今ではマシンパワーの増大などもあり、ゲームの中で多様な体験ができるようになりました。AAAクラスのゲームでは、よりリッチな体験や高い没入感を実現するため、プレイヤーが動き回ることのできるシーンの規模はますます大きくなっています。広大な世界を構築しようとすると、開発者は数多くの困難に直面します。その中でもアセットの準備にかかる工数というのは頭の痛い問題ではないでしょうか。アーティストがモデリングなどで手を動かす時間が増えるのは言うまでもなく、そこから最終的にゲームで必要となるデータを構築するためにそれぞれのアセットに対して様々な処理を行う必要があるため、実際の物量の増加は想像以上になることがほとんどです。

サードパーティ製のミドルウェアやツールなどを使っていたらアセットに対して実行する必要のある処理は更に多くなります。Enlightenも例外ではなく、ランタイムで効率よくグローバルイルミネーションを計算するために、事前にシーンを処理する必要があります(Precompute)。当然ではありますが、EnlightenのPrecomputeはシーンが広くなればなるほど、処理にかかる時間は増えてしまいます。Incredibuildを活用しビルドファームをスケールすることによって問題を軽減することは可能ですが、シーンの規模が著しく大きい場合、計算に膨大なメモリが必要となり各タスク自体に時間が非常にかかってしまうようになります。そうなるとEnlightenのPrecomputeが大きなボトルネックとなってしまい開発のワークフローが正常に機能しなくなってしまいます。先に述べたようにゲーム空間がどんどん大きくなっている今、大規模なシーンを構築する場合でも効率的に作業ができるようにEnlightenを改良する必要がありました。

そこで私たちはEnlighten 3.10において、Out-of-core precomputeを導入することでこの問題の解決に取り組みました。この機能によってEnlightenは広大なシーンを効率的に処理できるようになったのです。

技術詳細

広大なシーンの管理について

このセクションでは一般的なレベルのストリーミングについて簡単に説明します。既にこのトピックについて詳しい人は読み飛ばして、次に進んでいただいて構いません。

ゲームで広大なシーンを扱うとき、そこに存在するすべてのオブジェクトを常に取り扱えるようにしておくことはできません。なぜなら大量のメモリや膨大な処理が必要となり、現在のハードウェアではすぐにリソースを使い切ってしまうからです。通常、このようなケースではシーンを細かい単位に分割し、ゲームの実行中に必要に応じてその一部を読み込んだり破棄したりすることで問題を回避します。一般的にこの手法をレベルストリーミングといいます。

※図はWorld Composition User Guideより引用

この手法の基本的な考え方としては、プレイヤー座標から一定範囲内に存在するレベルのみを読み込むといったものになります。例えば、下図①のように座標Aにプレイヤーがいる場合は、その周囲のレベルが読み込まれています。そこから座標Bに向かって移動を行うと、進行方向にあるレベルが新しくレベルが読み込まれる一方、後方にあるレベルが破棄されます。移動が完了すると最終的に下図③のような状態になります。このようにプレイヤーの移動に合わせて適宜レベルの読み替えを行い、必要最小限のデータのみを処理するのです。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です