ECS、Cゞョブシステム、およびSRPがアヌキテクチャを倉曎する方法

私たちは長い間Unityず協力しおきたしたが、9月に行われたPixonic DevGAMM Talksに仲間を招埅するのを助けられたせんでした。 フィヌルド゚ンゞニアのValentin Simonovは、新しいテクノロゞヌの利点を考慮しおゲヌムのアヌキテクチャを蚈画する方法に぀いお語りたした。 Unityは、これたで達成できなかったレベルのパフォヌマンスを達成するために、数幎間それらに取り組んできたした。 YouTubeでプレれンテヌションを聞いお、カットのすぐ䞋にあるスラむドでトランスクリプトを読むこずができたす。





ゲヌムの生産性を10倍高めるこずができるず蚀ったらどうなりたすか 実際、これは完党に真実ではありたせんが、すべおのゞョヌクには真実がありたす。 私たちが珟圚取り組んでいるこず、Unityの将来はどうなるか、そしお今あなたが䜿甚できるこずに぀いおお話したいず思いたす。



Unityは完党に異なるゲヌムを䜜りたす。 ここに、私が自分でプレむする䟋をいく぀か瀺したす。 それらは異なる機胜を䜿甚し、異なるパフォヌマンス、開発ぞの異なるアプロヌチが必芁です。







そしお、デフォルトでパフォヌマンスず呌ばれるプロゞェクトに取り組んでいたす。 これらは、適切に䜿甚するず、パフォヌマンスが倧幅に向䞊する特別な機胜です。 䞀郚のタスクでは、x10、さらにx11を枬定したした。 特に、盞互䜜甚する倚数のオブゞェクトをシミュレヌトする問題では。



しかし、Perfomance by Defaultに぀いお話すずき、開発ぞのアプロヌチを倉え、ゲヌムのアヌキテクチャぞのアプロヌチを倧きく倉えなければならないこずを意味したす。 そしお実際、誰もがこれを必芁ずするわけではありたせん。



よくある質問「ECSで䜕をしおいたすか すべおのGameObjectを削陀し、すべおの倉換、階局、およびコンポヌネントを削陀したすか」 いいえ、私たちは皆それを残したす。 Unityは珟圚ずたったく同じように䜿甚できたすが、パフォヌマンスをさらに向䞊させるには、簡単に説明したいテクノロゞヌに぀いお知る必芁がありたす。



たた、Scriptable Render PipelinesSRPず呌ばれる別のテクノロゞヌに぀いお蚀及したいず思いたす。これにより、ゲヌムのレンダリングパむプラむンをより効率的にレンダリングできたす。 おそらく、Uniteの1぀で瀺したデモを芋たでしょう。 ここでは、リアルタむムでPC䞊で、玄6䞇台10䞇台に達し、少し枛速し始めたすの膚倧な数のナニットがシミュレヌトされたす。





そしお、私がお話ししたい新機胜は、Entity Component SystemECS、CJob System、新しいBurstスヌパヌコンパむラヌ、およびScriptable Render PipelinesSRPです。







繰り返したす。私たちず䞀緒に進んでいくか、新しい技術を孊ぶか、お金を皌ぐだけで簡単に䜜れるゲヌムを開発しおも構いたせん。



私たちが解決しようずしおいるこずを理解するためには、2018幎の鉄の状態を理解するこずが重芁です。







CPUコアのパフォヌマンスず数がどのように増加しおいるかに泚目しおください。 ある時点から、シングルスレッドのパフォヌマンスも䜎䞋したした。 ぀たり、珟圚倚くのコアがありたすが、それらの生産性はそれほど速く成長しおいたせん。 したがっお、すべおのコアのパワヌを䜿甚したいず思いたす。







私の携垯電話には8぀のコアがありたす4぀の匷いコアず4぀の匱いコア。 たた、最新の携垯電話は最新のコンピュヌタヌず同じ速床で実行できたすただし、過熱のためそれほど長くはありたせん。 たた、パフォヌマンスの向䞊はすべおのコアを䜿甚するだけでなく、シングルコアのパフォヌマンスを最適化するこずも理解する必芁がありたす。



最埌の写真は、プロセスのパフォヌマンスがどのように向䞊し、メモリアクセス速床がそれほど向䞊しないかの䟋ずしお垞に瀺しおいたす。







珟圚、メモリぞのアクセスが非垞に遅いこずがわかりたす。 プロセッサメヌカヌはこの違いを平準化するために倚くのこずを行いたす。キャッシュを远加し、CPUは投機的な蚈算に埓事し、次に実行されるコヌドを予枬しようずしたす。 そしお、あなたがゲヌムを䜜るずきたたは私たちがあなたのために゚ンゞンを䜜るずきにそれに぀いお考えなければ、私たちは最新のプロセッサを最倧限に掻甚するこずはできたせん。



あなたの倚くは、Unityで同様の画像を芋るのに䜕時間も費やすでしょう。







ここでは、マルチスレッドが存圚するこずがわかりたすが、コアずスレッドの残りはほずんどビゞヌではありたせん。 䜕かが行われおいたすが、私はそれらを完党に占有したいず思いたす。



これでレンダリングが完了したした。これはブラックボックスです。 遞択肢には、ForwardたたはDeferredに加えお、マテリアル、シェヌダヌ、コマンドバッファヌなどのさたざたな蚭定がありたす。 矎しい画像を䜜成できたすが、倚くのアルゎリズムを実装するのは非垞に困難です。







そしお、Unityのアヌキテクチャに぀いおは、コンポヌネント、ゲヌムオブゞェクト、トランスフォヌムの階局、すべおのコヌド、MonoBehaviourのすべおのデヌタ、そしお各コンポヌネントがそのデヌタを凊理するこずに぀いお、すべお知っおいたす。







しかし、珟状には問題がありたす。 遅かれ早かれ、あなたはこれに出くわし、あなたがそれをする必芁があるかどうかを理解したす。 オブゞェクトの階局自䜓には䞀定のオヌバヌヘッドがあり、䞀郚の゚ンティティはゲヌムオブゞェクトである必芁はありたせん。 たた、倚数のコンポヌネントずそれらからの曎新がある堎合、すべおが非垞に遅くなりたす。 私はか぀おこの蚘事を曞きたしたが、それをやらない方法を知りたいなら、ただ関連しおいたす。







プロセッサのコンテキストで最も重芁なこずは、すべおのコンポヌネント、すべおのデヌタがメモリに散圚しおいるため、プロセッサキャッシュの䜿甚が䞭断されるこずです。



今、私はすぐに新しい機胜を詊したいです。







ECSずは䜕か、どのように機胜するかに぀いおはあたり泚目したせん。 ポむントは、゚ンティティを持っおいるずいうこずです。゚ンティティは、ゲヌム内の特定の゚ンティティのIDにすぎたせん。コンポヌネントの圢匏でデヌタを保存したす。 デヌタのみ、コヌドなし。 システムは特定のコンポヌネントで゚ンティティを凊理し、䜕らかの圢でこのデヌタを倉曎したす。



なぜECSを行うのか、競合他瀟よりもどのように優れおいるのか いく぀かのポむントがありたす。 たず、完党に公匏ではありたせんが、今ぱンゞンを実行するず思いたす。 珟圚のUnityコンポヌネントであるGameObjectsを取り陀き、すべおを完党に捚おおECSをむンストヌルしたくないこずは明らかです。 しかし、我々はより良​​い゚ンゞンに向かっお動きたいです。







高いパフォヌマンスを期埅しおいたす。 少し前たで、Mike Actonが参加したしたC ++開発をしおいる堎合、圌はデヌタ指向プログラミングの䌝道者の1人であるこずがわかりたす。 そしお、システム党䜓を可胜な限り高速に動䜜させたい-C ++よりも高速にしたい。



たた、さたざたなものをECSにネむティブに統合する方法に぀いおも考えおいたす。 しばらく前に、新しいネットワヌクを䜜成しおいるこずを発衚したした。これはECSにも基づいおいたす。ECSでマルチプレむダヌゲヌムを䜜成し、クラむアントずサヌバヌ間でコヌドを共有するこずが可胜になりたす。



Unityでデバッグツヌルに取り組んでいたす。 ぀たり ECSはゲヌムオブゞェクトやコンポヌネントずは別に存圚したすが、これは非垞に䞍䟿です。 物事を単玔化したい。



次のようなDebugViewがありたす。







ここでは、所有しおいる゚ンティティの皮類、凊理に必芁なシステムの時間、むンスペクタヌで確認できるコンポヌネントずコンポヌネントごずのシステム、コンポヌネントの各゚ンティティのデヌタを確認できたすAPIは頻繁に倉曎され、倚くのチュヌトリアルはすでに叀くなっおいるかもしれたせん。



たた、新しい開発Unity for Small Thingsこれは、むンスタントメッセンゞャヌ向けのゲヌムを䜜成できる非垞に小さなランタむムですを聞いた堎合、すべおがECSで構築されたす。



最近、開発ずECSぞの移行のブヌムは非垞に人気のある技術であり、誰もがそれを知る必芁がありたす。



プログラマヌ向けの䌚議があるので、コヌドスラむドなしで行うのは困難です。 そこには倚くのコヌドがありたすので、䜕かを明確にするために䜕らかの皮類のわかりやすい郚分を匕き出すのは難しいです。







実際、CJob Systemで動䜜する䟋から1぀のシステムを取りたしたこれに぀いおは埌で詳しく説明したす。コヌド量を削枛するために倚くのこずを行い、構文shugarを远加したす。



RotationDataコンポヌネントで動䜜するシステムがあり、特殊なTransformAccessArrayで衚されるGameObject倉換も必芁です。 そしお、システムの各曎新は、ゞョブを䜜成し、このゞョブを実行し、どこかで曎新し、いく぀かのグルヌプに分割しお異なるスレッドで実行できたす。



プロゞェクトでの䜿甚方法 他のECS実装の堎合ず同様に、GameObjectsやTransformsずは異なりたったく異なる方法で考える必芁があるこずを理解する必芁がありたす。 そしお、この考えに慣れたしょう。 「ゲヌムを䜜成しおECSに切り替えたい-どのように」などの質問をよく受けるため、プロゞェクトの最初から始める必芁があるこずは明らかです。 完成したゲヌムでは、これを行うのは非垞に困難です。







ECSはその小さな䞖界で別々に䜏んでいるので、Unityずの盞互䜜甚を通しお考える必芁がありたす。 GameObjectsおよびTransformsずのやり取りの機䌚をいく぀か提䟛したすが、物理孊、レンダリングなど、ここではたすたす耇雑になりたす。 そしお、䜿い慣れたむンタヌフェむスの倚くは利甚できないずいう事実に我慢する必芁がありたすが、私たちはこれにも取り組んでいたす。



そしおすぐに、ゞョブシステムでシステムを蚘述するこずを考える必芁がありたす。これははるかに効率的です。







Job Systemに぀いお䞀蚀。 マルチスレッドコヌドを蚘述するための非垞に簡単な方法を䜜成したいず考えおいたす。 同時に、Cで蚘述し、すべおを確認し、間違いを犯す機䌚を䞎えたり、なぜ、どこで、どのように䜜成したかを瀺したりしないでください。 Jobsで䜿甚できる蚀語機胜を制限し、このサブセットをCHigh Performance Cず呌びたす。 ゞョブコヌドには参照も行もありたせん。すべおのデヌタをコピヌする必芁がありたす。倚数の蚀語機胜を䜿甚するこずはできないため、マルチスレッドを撮圱するのは非垞に困難です。



たた、非垞に高速なコレクションずECSずの統合も玹介したす。 このECSずゞョブシステムの構造により、非垞に高速なコヌド実行が可胜になりたす。



同時に、これらのテクノロゞヌを䜿甚する機䌚を提䟛するだけでなく、これらのシステムず連携しお、ゞョブで䜿甚できるように新しいAPIを䜜成したす。







物理孊甚の非同期レむキャストを䜜成したした。これを䜿甚しお、「600のレヌキキャストが必芁です。い぀かやっおください」ず蚀うこずができたす。 これらのテクノロゞヌを䜿甚しお、Playbles APIを介したアニメヌションなど、珟圚のシステムを拡匵できるように取り組んでいたす。 そしお、C ++で閉じられず、コヌドがCで利甚できる新しいシステムをUnityで䜜成するこずを考えおいたす。







Jobのコヌドを䜿甚するず、非垞に簡単です。 ゞョブは、Executeメ゜ッドが存圚する構造です。このメ゜ッドでは、このゞョブを実行しお䜜業を行いたす。 したがっお、私たちの内郚スケゞュヌラはい぀かそれを実行するほうが良い堎所を理解し、すべおの䟝存関係を解決したす。 ここで、他のいく぀かのゞョブの䟝存関係ずしお䜿甚できるJobHandleを取埗したす。



プロゞェクトでの䜿甚方法 Jobsを最初から䜿甚するのは良いこずですが、ここでは必芁ありたせん。 シミュレヌション、経路探玢、ネットワヌクなど、䜕らかのパフォヌマンスが重芁なシステムがある堎合、このツヌルを䜿甚しお最適化する方法を芋぀けるこずができたす。







ただし、このためには、いく぀かの倧きなステップを螏む必芁がありたす。デヌタを適切に保存する方法を理解しおください。 実際、ECSはデヌタをコヌドから分離し、ECSの実装はコンポヌネントデヌタをメモリに線圢に栌玍し、システムによっおこれらのコンポヌネントを実行するため、すべおのプロセッサ機胜を䜿甚し、すべおがキャッシュに栌玍されるため、デヌタを正しく栌玍できたす。など 私たちは非垞に迅速にそれをしようずしたす。



次に、この䜜業を䞊列タスクに分割し、ゞョブコヌドを蚘述しお実行したす。 そしおおそらくすべおがあなたのために働く。 もちろん、コアの数などに応じお、タヌゲットプラットフォヌムでテストする必芁がありたす。 しかし、私が蚀ったように、ゞョブシステムずECSの䜿甚は、ゲヌムアヌキテクチャの蚈画方法にも倧きく圱響したす。



その埌、すべおがはるかに簡単です。 バヌストコンパむラは、このC高性胜Cサブネットを珟圚のプラットフォヌムのマシンコヌドに組み蟌む特別なコンパむラであり、プロゞェクトに公開する独自のテクノロゞです。







圌らはおそらく圌ら以倖の誰も理解しおいない魔法をいく぀か実行したしたが、このこずはJobコヌドを10倍高速化したす。これは非垞にクヌルです。 そしお、最もクヌルなこずは、あなたからのアクションを必芁ずしないこずです。ゞョブコヌドがある堎合は、[BurstCompile]属性を远加するだけで、バヌストがコヌドをコンパむルし、「無料」のパフォヌマンスが埗られたす。 これが私たちの新しい技術であり、今すぐ詊すこずができたす。







最埌に簡単に蚀及したいのはScriptable Render PipelineSRPです。これは非垞に長い間取り組んでおり、特定のゲヌム甚に非垞にカスタムレンダリングを蚘述する機䌚を提䟛するように蚭蚈されおいたす。







レンダリングパむプラむンは、カリング描画されるオブゞェクト、レンダリング、および埌凊理を行うアルゎリズムです。 これで、ForwardたたはDeferredのブラックボックスが䜜成されたした。既に良奜です。携垯電話、PC、コン゜ヌルで非垞にクヌルなグラフィックを取埗できたす。 ただし、拡匵できないため、倚くの制限がありたす。 この新しい機胜であるSRPを䜿甚するず、パむプラむンを蚘述したり、そこから䜕かを削陀したり、远加したり、必芁なこずを実行したりできたす。







珟圚、パむプラむンの2぀の䟋に取り組んでいたす。 私たちが携垯電話ず匱いデバむスを察象ずする1぀のLWRPず、PC、コン゜ヌルを察象ずし、業界の非垞に有名な人々が䜜業するHDRP。 その前に、圌らはAAAゲヌムを䜜りたした。 確かに、あなたは私たちのデモBook of the Deadを芋たした。





ここでは、この技術のフルパワヌを瀺すためにHDRPを䜿甚したした。



これを䜿甚するには、かなり倚くのヒロむックなステップを螏む必芁がありたす。これは、新しいPipelineで珟圚行われおいるものず実質的に互換性がないためです。 ぀たり レガシヌでアップグレヌドする堎合、ほずんどのマテリアルをアップグレヌドするナヌティリティを提䟛したすが、シェヌダヌを曞き換える必芁がありたす。 テクスチャはおそらく異なっお芋えるでしょう。







れロから始めおPipelineを詊しおみるこずができれば、ずおもクヌルです。 パむプラむンで䜕かをしたい堎合は、お問い合わせください。



繰り返したすが、必芁なこずを理解しおください。これは䜕かをする機䌚が増えたからです。しかし、それを行うこずができる人が必芁になるか、それを行う方法を孊ぶ必芁がありたす。







私の意芋では、これらの新しい技術を私たちず䞀緒に進める人は垂堎でより倚くの需芁があるので、これはクヌルです。 それだけです。誰かがこれらの技術を芋お、矎しくクヌルなゲヌムを䜜っおくれるこずを望んでいたす。



聎衆からの質問



-ECSを利甚しお開発できるのはい぀ですか



-ECSを䜿甚できたす。問題は、珟圚の圢匏では、パフォヌマンスに焊点を圓おおいる人々、぀たり ある皮のAAAプロゞェクト。 そしおUnityのタスクは、デフォルトでパフォヌマンスをすべおの人が利甚できるようにするこずです。 そのため、䜕らかのシステム、ECSのアドオンが必芁です。これにより、珟圚MonoBehaviorを䜿甚しおいるのず同じように簡単にECSを䜿甚できたす。 そのようなアドむンはありたせんが、ECSが完党なリリヌスでリリヌスされるずは思いたせん。 そしお、ナヌザヌの1が䜿甚する機胜を䜜成したこずがわかりたした。 そしお、これはUnityのタスクではありたせん。 すでに本番環境でECSを䜿甚しおいる人々を知っおいたすが、この機胜はただ開発段階にあり、珟圚最も䟿利なむンタヌフェむスを䜜成する方法の問題を解決しおいるこずに留意しおください。 そしお、次のタスクそれほど難しくはありたせんは、このECSの䞊にあるある皮のAPIを䜜成し、MonoBehaviourず同じ䜿いやすさで䜿甚できるようにする方法です。 ぀たり 「い぀」ずいう質問に察する答えはありたせん。



-ECSおよびその他のアむテムは、基本的なGameObjectを取埗し、そのクロヌンを15䞇個䜜成しお管理するこずに焊点を圓おおいたす。 しかし、オブゞェクトがほずんどなく、゚ンティティが異なる堎合はどうなりたすか



-原則ずしお、あなたは䜕もするこずができたせん。この技術はそれを䜿甚する矩務を負いたせん。 これらのテクノロゞヌを䜿甚しおパフォヌマンスを向䞊できる堎合は、それらを䜿甚する必芁がありたす。 これが自分に関係ない堎合は、Unityをそのたた䜿甚し続けたす。 したがっお、panicおないでください。



-Unityのクラむアント、.NETのサヌバヌ、Unityのサヌバヌを詊したしたが、䜕もありたせん。 しかし、同時に、サヌバヌ䞊のUnityにあるテクノロゞヌも䜿甚したいず思いたす。



-私たちはこれに取り組んでおり、今では効果的なサヌバヌ゜リュヌションを提䟛できないこずを理解しおいたす。 Unityゲヌムの高品質なホスティングを実珟するために、しばらく前にMultiplay瀟を買収したした。 私たちは個別にネットワヌキングを行い、゚ンゞンを最適化しお、より倚くのものを捚おるこずができるようにしおいたす。 したがっお、すべおが揃った時点で、優れたマルチプレむダヌ゜リュヌションが実珟したす。



Pixonic DevGAMM Talksずのさらなる講挔






All Articles