デトロむトの移怍プレむステヌション4からPCぞの人間化

前曞き



この䞀連の投皿では 、PlayStation 4からPCぞのDetroit BecomeHumanの移怍に぀いお説明したす。



デトロむトBecome Humanは、2018幎5月にPlayStation4でリリヌスされたした。2018幎7月にPC版の開発を開始し、2019幎12月にリリヌスしたした。これは、3人のプレむ可胜なキャラクタヌず倚くのストヌリヌを備えたアドベンチャヌゲヌムです。それは非垞に高品質のグラフィックスを持っおおり、グラフィックス技術のほずんどはQuanticDream自身によっお開発されたした。



3D゚ンゞンには優れた機胜がありたす。



  • 文字のリアルなレンダリング。
  • PBR照明。
  • Depth of FieldDOF、モヌションブラヌなどの高品質の埌凊理。
  • 䞀時的なアンチ゚むリアシング。






デトロむト人間になる



圓初から、ゲヌムの3D゚ンゞンはPlayStation専甚に蚭蚈されおおり、埌で他のプラットフォヌムをサポヌトするこずになるずは思っおいたせんでした。したがっお、PCバヌゞョンは私たちにずっお挑戊でした。



  • 3D゚ンゞンのリヌドロヌナンMarshalotず3D゚ンゞンは、ニコラスViseriリヌドずゞョナサンSiretのQuanticの倢を移怍されたゲヌムのレンダリングの偎面を説明したす。PlayStation 4からPCにシヌムレスに転送できる最適化ず、プラットフォヌム間の違いによっお盎面した問題に぀いお説明したす。
  • Lou Kramerは、AMDの技術開発゚ンゞニアです。圌女は私たちがゲヌムを最適化するのを手䌝っおくれたので、PC、特にAMDカヌドでのリ゜ヌスの異皮むンデックスに぀いお詳しく説明したす。


グラフィックAPIの遞択



開発ツヌルで䜿甚したOpenGLバヌゞョンの゚ンゞンがすでにありたした。



しかし、OpenGLでゲヌムをリリヌスしたくありたせんでした。



  • すべおのGPUメヌカヌに公開されおいない独自の拡匵機胜がたくさんありたした。
  • ゚ンゞンはOpenGLで非垞に䜎いパフォヌマンスでしたが、もちろん最適化できたした。
  • OpenGLでは、さたざたな偎面を実装する方法がたくさんあるため、すべおのプラットフォヌムでさたざたな偎面を正しく実装するこずは悪倢でした。
  • OpenGL . , , .


無関係なリ゜ヌスを倚甚しおいるため、ゲヌムをDirectX11に移怍できたせんでした。十分なリ゜ヌススロットがないため、䜿甚するリ゜ヌスを枛らすためにシェヌダヌをやり盎す必芁がある堎合、適切なパフォヌマンスを実珟するこずは非垞に困難です。



非垞によく䌌た機胜セットを持぀DirectX12ずVulkanのどちらかを遞択したした。 VulkanはさらにLinuxず携垯電話のサポヌトを提䟛できるようにし、DirectX12はMicrosoftXboxのサポヌトを提䟛したす。最終的には䞡方のAPIのサポヌトを実装する必芁があるこずはわかっおいたしたが、ポヌトが1぀のAPIのみに焊点を合わせる方が理にかなっおいたす。



VulkanはWindows7ずWindows8をサポヌトしおいたす。デトロむトを䜜りたかったので人間になるできるだけ倚くのプレむダヌがアクセスできるため、これは非垞に匷力な議論になっおいたす。ただし、移怍には1幎かかりたした。珟圚、Windows 10が広く䜿甚されおいるため、この議論はすでに重芁ではありたせん。



さたざたなグラフィックAPIの抂念



OpenGLおよび叀いDirectXバヌゞョンには、非垞に単玔なGPU制埡モデルがありたす。これらのAPIは理解しやすく、孊習に非垞に適しおいたす。圌らは、開発者から隠されおいる倚くの䜜業を行うようにドラむバヌに指瀺したす。したがっお、それらの䞭で完党に機胜する3D゚ンゞンを最適化するこずは非垞に困難です。



䞀方、PlayStation 4 APIは非垞に軜量で、ハヌドりェアに非垞に近いです。



バルカンは真ん䞭のどこかにありたす。たた、さたざたなGPUで実行されるため抜象化されおいたすが、開発者はより詳现に制埡できたす。メモリ管理たたはシェヌダヌキャッシュを実装するタスクがあるずしたしょう。ドラむバヌに残された䜜業が少ないので、やらなければなりたせんただし、PlayStationでプロゞェクトを開発したので、すべおを制埡できる方が䟿利です。



難しさ



PlayStation 4 CPUは、8コアのAMDゞャガヌです。明らかに、新しいPCハヌドりェアよりも䜎速です。ただし、PlayStation 4には重芁な利点がありたす。特に、ハヌドりェアぞのアクセスが非垞に高速です。 PlayStation 4グラフィックスAPIは、PC䞊のすべおのAPIよりもはるかに効率的であるず確信しおいたす。圌は非垞に率盎で、リ゜ヌスをほずんど浪費しおいたせん。これは、フレヌムごずに倚数の描画呌び出しを実行できるこずを意味したす。䜎速のPCでは、高ドロヌコヌルが問題になる可胜性があるこずはわかっおいたした。



もう1぀の重芁な利点は、PlayStation 4のすべおのシェヌダヌを事前にコンパむルできるこずでした。぀たり、ほが瞬時にロヌドされたした。PCでは、ドラむバヌは起動時にシェヌダヌをコンパむルする必芁がありたす。サポヌトされおいるGPUずドラむバヌの構成が倚数あるため、このプロセスを事前に実行するこずはできたせん。PlayStation 4



でDetroitBecome Humanの開発䞭に、アヌティストはすべおの玠材に独自のシェヌダヌツリヌを䜜成するこずができたした。これにより、非垞に倚くの頂点シェヌダヌずピクセルシェヌダヌが生成されたため、ポヌトの最初から、これが倧きな問題になるこずがわかっおいたした。



シェヌダヌパむプラむン



OpenGL゚ンゞンからわかるように、シェヌダヌのコンパむルはPCで時間がかかる堎合がありたす。ゲヌムの制䜜䞭に、ワヌクステヌションのGPUモデルに基づいおシェヌダヌキャッシュを生成したした。Detroitの完党なシェヌダヌキャッシュの生成Become Humanは䞀晩かかりたしたすべおの埓業員は、午前䞭にこのシェヌダヌキャッシュにアクセスできたした。しかし、ドラむバヌがこのコヌドをGPUシェヌダヌのネむティブアセンブラヌコヌドに倉換する必芁があったため、ゲヌムは䟝然ずしお遅くなりたした。



Vulkanはこの問題をOpenGLよりもはるかにうたく凊理するこずが刀明したした。



たず、VulkanはHLSLのような高レベルのシェヌダヌ蚀語を盎接䜿甚せず、代わりにSPIR-Vず呌ばれる䞭間のシェヌダヌ蚀語を䜿甚したす。 SPIR-Vは、シェヌダヌのコンパむルを高速化し、ドラむバヌシェヌダヌコンパむラヌの最適化を容易にしたす。実際、パフォヌマンスの点では、OpenGLシェヌダヌキャッシュシステムに匹敵したす。



Vulkanでは、シェヌダヌをリンクしおフォヌムを䜜成する必芁がありたすVkPipeline。たずえばVkPipeline、頂点シェヌダヌずピクセルシェヌダヌから䜜成できたす。たた、レンダリング状態深床テスト、ステンシル、ブレンディングなどおよびレンダリングタヌゲット圢匏に関する情報も含たれおいたす。この情報は、シェヌダヌを可胜な限り効率的にコンパむルできるようにするために、ドラむバヌにずっお重芁です。



OpenGLでは、シェヌダヌのコンパむルはシェヌダヌの䜿甚状況を認識しおいたせん。ドラむバヌは、GPUバむナリを生成するために描画呌び出しを埅機する必芁がありたす。そのため、新しいシェヌダヌを䜿甚した最初の描画呌び出しは、CPUで長い時間がかかる可胜性がありたす。



Vulkanでは、パむプラむンVkPipelineが䜿甚コンテキストを提䟛するため、ドラむバヌはGPUバむナリを生成するために必芁なすべおの情報を持っおおり、最初の描画呌び出しはリ゜ヌスを浪費したせん。たた、VkPipelineCache䜜成時に曎新するこずもできVkPipelineたす。



最初は、VkPipelines初めお必芁になったずきに䜜成しようずしたした。これにより、OpenGLドラむバヌの堎合ず同様の速床䜎䞋が発生したした。その埌、VkPipelineCache曎新され、次のドロヌコヌルたでブレヌキが消えたした。



次にVkPipelines、起動時に䜜成できるず予枬したしたVkPipelineCacheが、関係がない堎合は非垞に遅く、バックグラりンドでロヌドするための戊略を実装できたせんでした。



最終的VkPipelineに、ゲヌムの最初の起動時にすべおを生成するこずにしたした。これによりブレヌキの問題は完党に解消されたしたが、今では新たな困難に盎面しおVkPipelineCacheいたす。生成には非垞に長い時間がかかりたした。



デトロむトBecome Humanには玄99,500が含たれおいたすVkPipelineゲヌムはフォワヌドレンダリングを䜿甚するため、マテリアルシェヌダヌにはすべおの照明コヌドが含たれおいたす。したがっお、各シェヌダヌのコンパむルには長い時間がかかる堎合がありたす。



プロセスを最適化するためのいく぀かのアむデアを思い぀きたした。



  • , SPIR-V.
  • SPIR-V SPIR-V.
  • , CPU 100% VkPipeline.


たた、重芁な最適化がNVIDIAのJeff Boltzによっお提案され、私たちの堎合、それは非垞に効果的であるこずがわかりたした。



倚くはVkPipeline非垞に䌌おいたす。たずえばVkPipeline、同じ頂点シェヌダヌずピクセルシェヌダヌがあり、ステンシルパラメヌタヌなどのいく぀かのレンダリング状態のみが異なる堎合がありたす。この堎合、ドラむバヌはそれらを1぀のパむプラむンずしお扱うこずができたす。ただし、それらを同時に䜜成するず、䞀方のスレッドは単にアむドル状態になり、もう䞀方のスレッドがタスクを完了するのを埅ちたす。その性質䞊、私たちのプロセスはすべおの類䌌したものVkPipelineを同時に送信したした。この問題を解決するために、゜ヌト順を倉曎したしたVkPipeline。 「クロヌン」は最埌に配眮され、その結果、䜜成にかかる時間が倧幅に短瞮されたした。



クリ゚ヌションパフォヌマンスVkPipelines倚様性のある。特に、䜿甚可胜なハヌドりェアスレッドの数に倧きく䟝存したす。64個のハヌドりェアスレッドを備えたAMDRyzen Threadripperでは、わずか2分で完了したす。しかし、匱いPCでは、残念ながら、このプロセスには20分以䞊かかる堎合がありたす。



埌者は私たちには長すぎたした。残念ながら、この時間をさらに短瞮する唯䞀の方法は、シェヌダヌの数を枛らすこずでした。できるだけ倚くの資料が共有されるように、資料の䜜成方法を倉曎する必芁がありたす。以䞋のためにデトロむト、人間になろアヌティストはすべおの材料をやり盎す必芁があるため、これは䞍可胜でした。次のゲヌムで適切なマテリアルむンスタンス化を実装する予定ですが、Detroit BecomeHumanには遅すぎたした。



むンデックス蚘述子



PCでの描画呌び出しの速床を最適化するために、拡匵子を䜿甚した蚘述子のむンデックス付けを䜿甚したしたVK_EXT_descriptor_indexing。その原理は単玔です。フレヌムで䜿甚されるすべおのバッファヌずテクスチャヌを含む蚘述子のセットを䜜成できたす。次に、むンデックスを介しおバッファずテクスチャにアクセスできたす。これの䞻な利点は、耇数の描画呌び出しで䜿甚されおいる堎合でも、リ゜ヌスがフレヌムごずに1回だけバむンドされるこずです。これは、OpenGLでバむンドされおいないリ゜ヌスを䜿甚するのず非垞によく䌌おいたす。



䜿甚するすべおのタむプのリ゜ヌスのリ゜ヌス配列を䜜成したす。



  • すべおの2Dテクスチャに1぀のアレむ。
  • すべおの3Dテクスチャに1぀のアレむ。
  • すべおの立方䜓テクスチャに1぀の配列。
  • すべおのマテリアルバッファに1぀のアレむ。


必芁なマテリアルバッファず必芁なマトリックスを参照する蚘述子むンデックスを含む、描画呌び出し間で倉化するメむンバッファ埪環バッファずしお実装のみがありたす。各マテリアルバッファには、䜿甚されるテクスチャのむンデックスが含たれおいたす。





この戊略のおかげで、すべおの描画呌び出しに共通で、フレヌムの描画に必芁なすべおの情報を含む少数の蚘述子セットを維持するこずができたした。



蚘述子セットの曎新の最適化



蚘述子セットの数が少ない堎合でも、それらを曎新するこずは䟝然ずしおボトルネックでした。蚘述子セットに倚くのリ゜ヌスが含たれおいる堎合、蚘述子セットの曎新には非垞にコストがかかる可胜性がありたす。たずえば、1぀のDetroitBecome Humanフレヌムでは、4000を超えるテクスチャが存圚する可胜性がありたす。



珟圚のフレヌムで衚瀺および非衚瀺になるリ゜ヌスを远跡しながら、蚘述子セットに増分曎新を実装したした。さらに、珟時点で衚瀺されおいるリ゜ヌスを凊理するのに十分な容量があるため、蚘述子配列のサむズが制限されたす。可芖性の远跡は、亀差点の蚈算にコストのかかるアルゎリズムを䜿甚しないため、リ゜ヌスをほずんど浪費したせん。O(n.log(n))..。代わりに、珟圚のフレヌム甚ず前のフレヌム甚の2぀のリストを䜿甚したす。残りの可芖リ゜ヌスをあるリストから別のリストに移動し、最初のリストの残りのリ゜ヌスを調べるず、可芖のピラミッドに出入りするリ゜ヌスを刀別するのに圹立ちたす。



これらの蚈算䞭に取埗されたデルタは4フレヌムで保存されたす。トリプルバッファリングを䜿甚し、スキニングのあるオブゞェクトのモヌションベクトルを蚈算するには、もう1぀のフレヌムが必芁です。蚘述子セットは、GPUにずっお匕き続き有甚である可胜性があるため、再床倉曎する前に、少なくずも4フレヌムの間倉曎しないでおく必芁がありたす。したがっお、4぀のフレヌムのグルヌプにデルタを適甚したす。



最終的に、この最適化により、蚘述子セットの曎新時間が1〜2桁短瞮されたした。



ブッチングプリミティブ



蚘述子のむンデックスを䜿甚するず、を䜿甚しお1回の描画呌び出しで耇数のプリミティブをバッチバッチ凊理できたすvkCmdDrawIndexedIndirect。gl_InstanceIDメむンバッファ内の目的のむンデックスにアクセスするために䜿甚したす。プリミティブの蚘述子のセット、シェヌダヌパむプラむン、頂点バッファヌが同じである堎合、プリミティブをバッチにグルヌプ化できたす。これは、特に深床パスずシャドりパスの堎合に非垞に効果的です。ドロヌコヌルの総数は60削枛されたす。



これで、䞀連の蚘事の最初の郚分は終わりです。第2郚では、テクノロゞヌ゚ンゞニアのLou Kramerが、特にPCずAMDカヌドでの異皮リ゜ヌスのむンデックス䜜成に぀いお説明したす。



All Articles