スワップチェイン
- 非フルスクリーン状態では、達成したいFPSやレイテンシによってMax Frame Latencyを設定する[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- Present処理はMax Frame Latencyの分だけキューに入れられ、VSYNCが来ると1つが完了する
- キューが満杯だとPresentは次のVSYNCまでブロックされる
- これにより、最大FPSは(Max Frame Latency - 1) * リフレッシュレートになる
- 非フルスクリーン状態では、FPS上限を取り払うにはスワップチェインのWaitable Objectを使う[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- Waitable Objectがシグナル状態であれば、バックバッファに書き込んだりブロックされずにPresentしたりできる
- Waitable Objectがシグナル状態でない場合にレンダリング結果を破棄することで無制限のFPSを達成する
- バッファ数をMax Latency + 1にすると、常にバックバッファにレンダリング可能になる
- フルスクリーンにするときは流儀に従う[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- FLIPモードで生成し、ウィンドウをボーダーレスにして、SetFullScreenState(TRUE)を呼び出す
プレゼント
- Presentを行う専用のDIRECTキューを作る[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
グラフィクスキュー
- 避けられる無駄な処理をきちんと回避する[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- 必要のないジオメトリをカリングする
- 避けられるオーバーヘッドをきちんと回避する[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- パイプラインで描画をソートする
- さらに、パイプライン内のピクセルシェーダでもソートする
- 前から後にレンダリングする
- パイプラインで描画をソートする
- まとめられるものはまとめる[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- NVIDIAでは、以下の場合にピクセルシェーダを使う[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- shared memoryを使わない
- スレッドの完了が同時
- 定数バッファに高頻度でアクセスする
- 2Dバッファに格納する
- NVIDIAでは、以下の場合にコンピュータシェーダを使う[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- group shared memoryを使う
- 順不同でスレッドが完了する
- レジストリ使用が多い
- 1Dや3Dのバッファに格納する
- AMDでは、以下の場合にピクセルシェーダを使う[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- 深度やステンシルによるrejectionが上手くハマる
- グラフィクスパイプラインが必要
- 色の圧縮を活用したい
- AMDでは、以下の場合にコンピュータシェーダを使う[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- ピクセルシェーダを使う理由がないとき
コンピュートキュー
- グラフィクスに対してボトルネックを補うような処理を行う[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- ポストプロセスCS(帯域)とZバッファレンダリング(IO)
- フレームをまたいで同期する仕組みが欲しい
- ポストプロセスCS(帯域)とZバッファレンダリング(IO)
- 組み合わさるタスクを制御するためにフェンスで囲う[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; Hodes and Dunn 2017Hodes, S. and Dunn, A. 2017. Deep Dive: Asynchronous Compute. Game Developers Conference. https://gpuopen.com/download/GDC2017-Asynchronous-Compute-Deep-Dive.pdf.; NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- 開始と終了でシグナルを出して同期させる
- タスクの重なりを予測できるようにしたほうがなにかと制御しやすい
- 非同期コンピュート[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
コピーキュー
- ローカル-システム間のデータ転送をコピーキューで行う[Thomas 2017Thomas, G. 2017. D3D12 & Vulkan Done Right. Game Developers Conference. https://gdcvault.com/play/1024732/Advanced-Graphics-Tech-D3D12-and.]
- PCIeを介するので、ローカル-ローカル間転送には向かない
- レンダリングの裏で何フレームかかけてコピーを行いたい場合にも使える
- ローカルメモリのデフラグなど
- PCIeを介してメモリを移動させるときに使う[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- グラフィクスなどの他のキューと独立して機能する
- 一方、GPU間でコピーする場合や結果をすぐに使いたい場合は、コピーキューを使わない
メモリ
- Windowsが提示するメモリ予算をきちんと守る[Thomas 2017Thomas, G. 2017. D3D12 & Vulkan Done Right. Game Developers Conference. https://gdcvault.com/play/1024732/Advanced-Graphics-Tech-D3D12-and.; Sawicki 2018Sawicki, A. 2018. Memory Management in Vulkan and DX12. Game Developers Conference. https://www.gdcvault.com/play/1025458/Advanced-Graphics-Techniques-Tutorial-New.; NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- IDXGIAdapter3::QueryVideoMemoryInfo()で取得する
- 予算は動的に変化するので、見逃さずきちんと対処すること
- 優先度の低いデータをシステムメモリに移して、ローカルメモリを解放する
- 上位MIPを解放すると、見た目を完全に損なわずにメモリを節約できる
- メモリ管理機構をテストするには、同じアプリを2つ立ち上げてフォーカスを切り替えてみると良い
IDXGIAdapter3::RegisterVideoMemoryBudgetChangeNotificationEventを使ってOSから予算変更の通知を受けるID3D12Device1::SetResidencyPriorityで残しておきたいメモリをOSに知らせる
- 各オプションで必要なメモリ予算を予め決めておく[Thomas 2017Thomas, G. 2017. D3D12 & Vulkan Done Right. Game Developers Conference. https://gdcvault.com/play/1024732/Advanced-Graphics-Tech-D3D12-and.; Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- IDXGIAdapter3::SetVideoMemoryReservationで必要なメモリ量をOSに伝える[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.; Sawicki 2018Sawicki, A. 2018. Memory Management in Vulkan and DX12. Game Developers Conference. https://www.gdcvault.com/play/1025458/Advanced-Graphics-Techniques-Tutorial-New.]
- MakeResidentは重たい処理であることに注意する[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.; NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- 処理が完了するまでブロックされる
- できるだけバッチすること
- 呼び出しは前もって行い、その間にデータをシステムメモリにロードしておいて、終わり次第コピーする
- 大きく確保して小分けにして配る[Sawicki 2018Sawicki, A. 2018. Memory Management in Vulkan and DX12. Game Developers Conference. https://www.gdcvault.com/play/1025458/Advanced-Graphics-Techniques-Tutorial-New.]
- アロケーションの最大数が割と小さかったり、割当・解放が遅かったり
- 専用のものを割り当てたほうがいい場合もある
- ドライバが最適化してくれたり
- マップしたままでもOK[Sawicki 2018Sawicki, A. 2018. Memory Management in Vulkan and DX12. Game Developers Conference. https://www.gdcvault.com/play/1025458/Advanced-Graphics-Techniques-Tutorial-New.]
パイプラインステート
- 似通ったPSOは同じスレッドでコンパイルする[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- パラメータが少し違うだけ、など
- シェーダのコンパイル結果を再利用できるため
- PSO生成はストールする[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- 生成を非同期に行い、実行時コンパイルを避ける
- PSO間のステート変更を少なくする[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- 内部でのステート変更を少なくするため
- 必要のないステートを既定値でまとめると良い
- できれば
D3DCOMPILE_ALL_RESOURCES_BOUNDでコンパイルする[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.] - 必要以上の重たいステート切り替えを避ける[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- 同一キュー内でのコンピュート-グラフィクスの切り替え
- テッセレーションのオン・オフ
- Pipeline Libraryを使う[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
デスクリプタヒープ
- ヒープはひとつにまとめる[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.; NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- 静的なサンプラを使う[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- NVIDIAでは、デスクリプタの総数をドライバが用意する数より小さくする[Hodes and Dunn 2017Hodes, S. and Dunn, A. 2017. Deep Dive: Asynchronous Compute. Game Developers Conference. https://gpuopen.com/download/GDC2017-Asynchronous-Compute-Deep-Dive.pdf.]
ルートシグネチャ
- できるだけ小さくする[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- 十分に小さければレジスタだけでコピーできる
- 13 DWORDs以下にする
- デスクリプタテーブルとルート定数は1 DWORD
- ルートデスクリプタは2 DWORD
- 変更頻度の高いものを前に置く[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- リソース可視性は最低限のステージだけにする[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- フラグを立てたステージごとにオーバーヘッドが発生するため
- AMDでは、定数および頻繁に変更するCBVをルートに置く[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- 変更するCBVが複数あるならテーブルにまとめても良いかも
- NVIDIAでは、定数およびCBVをすべてルートに置く[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- ピクセルシェーダを大幅に高速化できる
- SRVとUAVは、大量アクセスする場合を除いて、ルートに置かない
- dirtyな領域のみを更新するなどして、変更を最小限にする[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- Tier 1やTier 2では不要なデスクリプタをバインドしたままにしてはいけない[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- Tier 3ならそのままでOK
- ルートデスクリプタやdynamic buffersは最小限にする[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- 範囲外にアクセスするとハングする可能性がある
- 描画はルートシグネチャ順に並べる[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- SHADER_VISIBLEのデスクリプタヒープはコピー元としないほうが良い[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
CopyDescriptorsSimpleのほうがキャッシュヒット率が高くなるのでおすすめ[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
コマンドアロケータ
- (スレッド数 * バッファリングするフレーム数 + バンドル用)の分だけ用意する[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.; Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; Chajdas 2016Chajdas, M. G. 2016. D3D12 and Vulkan: Lessons learned. Game Developers Conference. https://gpuopen.com/download/d3d12_vulkan_lessons_learned.pdf.]
- できれば記録されるコマンドの長さごとにアロケータを分ける[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; Chajdas 2016Chajdas, M. G. 2016. D3D12 and Vulkan: Lessons learned. Game Developers Conference. https://gpuopen.com/download/d3d12_vulkan_lessons_learned.pdf.]
- アロケータはリサイズされず、伸びた分は伸びっぱなしなので
- ちゃんとリセットしよう[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
コマンドリスト
- 処理を分割しすぎない[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- 1フレームあたりの目安として、15~30個のコマンドリストを5~10回のExecuteCommandListsで行う
- RDNA2では、1つのCLあたり10描画以上を基準として考えると良い[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- 処理をまとめすぎない[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- ひとつのスレッドに負荷が偏って、CPUを活用できなくなる
- GPU処理を送り出すのが遅くれて、GPUを活用できなくなる
- 適量をバッチして送り出す[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- ExecuteCommandListsのCPUオーバーヘッドをOSのスケジューリングで償却する
- GPUを遊ばせないように、フレームの途中にも適宜送り出す[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- セカンダリコマンドリストはGPUパフォーマンスに影響し得る[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- 稼げるのはCPUパフォーマンスだけ
- ExecuteIndirectが最速になるのはコマンドシグネチャが描画1つ分のときだけ[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- それ以外になにか足すとオーバーヘッドが発生する
バンドル
- TODO[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- 再利用性を高めるため、適量のドローコールを記録する[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- 12個くらいが丁度いい
- BundleはGPUパフォーマンスに影響し得る[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- 稼げるのはCPUパフォーマンスだけ
- ステート継承は最小限にする[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
バリア
- Usageフラグは最小限にする[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; DirectX-Specs 20202020. D3D12 CPU Efficiency. DirectX-Specs. https://microsoft.github.io/DirectX-Specs/d3d/CPUEfficiency.html.]
- 冗長なフラグを立てると、冗長なflushや待機が発生する可能性がある
- read-to-readバリアはやらない[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- write-to-readの際に以降の読み込みすべてに対応するフラグを付ける
- 可能ならsplit barriersを使う[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.; DirectX-Specs 20202020. D3D12 CPU Efficiency. DirectX-Specs. https://microsoft.github.io/DirectX-Specs/d3d/CPUEfficiency.html.]
- 大抵のリソースではread-to-writeとwrite-to-readの2つだけで十分足りる[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- できるだけバッチする[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.; DirectX-Specs 20202020. D3D12 CPU Efficiency. DirectX-Specs. https://microsoft.github.io/DirectX-Specs/d3d/CPUEfficiency.html.]
- 軽い方の遷移コストが償却できる場合がある
- ステート遷移は割と重めの処理を行うこともある[Hodes et al. 2016Hodes, S., Baker, D. and Oldcorn, D. 2016. Right on Queue. Game Developers Conference. https://gpuopen.com/download/GDC_2016_D3D12_Right_On_Queue_final.pdf.]
- キャッシュのフラッシュ、RTVやDSVのdecompression、など
- 必要のない処理のためにフラグを足さない
- いつやるかわからないCOPY、とりあえずCOMMON、など
- 全体に対して行うときは
D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCESを使う[DirectX-Specs 20202020. D3D12 CPU Efficiency. DirectX-Specs. https://microsoft.github.io/DirectX-Specs/d3d/CPUEfficiency.html.; Chajdas 2016Chajdas, M. G. 2016. D3D12 and Vulkan: Lessons learned. Game Developers Conference. https://gpuopen.com/download/d3d12_vulkan_lessons_learned.pdf.]
フェンス
- ExecuteCommandListsと同じくらいのCPU・GPUコストがかかる[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- ExecuteCommandLists1回につき1度以上に細かくシグナルするとは思わないこと[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- 同じキューにサブミットされる場合はフェンスで同期する必要はない[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- サブミット順で実行されるので、バリアで十分
- 異なるキュー間の同期は、サブミット境界でフェンスを設置する
リソース
- Placedリソースのレンダターゲットはclear stateで生成する[Chajdas 2016Chajdas, M. G. 2016. D3D12 and Vulkan: Lessons learned. Game Developers Conference. https://gpuopen.com/download/d3d12_vulkan_lessons_learned.pdf.]
- レンダターゲットは使用前に必ずクリアする必要がある
- 頻繁に使うリソースはCommittedにする方が良い[Chajdas 2016Chajdas, M. G. 2016. D3D12 and Vulkan: Lessons learned. Game Developers Conference. https://gpuopen.com/download/d3d12_vulkan_lessons_learned.pdf.]
- LAYOUT_ROW_MAJORはバッファとのコピーを行う場合以外で使用しない
- Residency[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- RTVやDSVのリソースはComittedの方がドライバ的に好ましい[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- NVIDIAでは、読み込みがコヒーレントならCBVの方を使う[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.]
- 必要でないならLAYOUT_ROW_MAJORを使わない[Sawicki 2018Sawicki, A. 2018. Memory Management in Vulkan and DX12. Game Developers Conference. https://www.gdcvault.com/play/1025458/Advanced-Graphics-Techniques-Tutorial-New.]
- Tierごとにいろいろと個数制限がある[NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- UAVはステージ全体で最大8とか64とか
- CBVはステージあたり14とか
- サンプラはステージあたり16とか
- NVIDIAでは、DepthStencilのDepthだけコピーしようとするときに低速パスに入ることがあるので注意[Thomas and Dunn 2016Thomas, G. and Dunn, A. 2016. Practical DirectX 12 - Programming Model and Hardware Capabilities. Game Developers Conference. https://gpuopen.com/download/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf.; NVIDIA Developer 20162016. DX12 Do's and Don'ts. NVIDIA Developer. https://developer.nvidia.com/dx12-dos-and-donts.]
- PlacedリソースやTiledリソースの更新は2MB単位に揃えると良い[Allan 2021Allan, A. 2021. Advanced API Performance: Memory and Resources. NVIDIA Technical Blog. https://developer.nvidia.com/blog/advanced-api-performance-memory-and-resources/.]
- リソースエイリアシングをする場合は、圧縮するかどうかでグループ分けすると良い[Allan 2021Allan, A. 2021. Advanced API Performance: Memory and Resources. NVIDIA Technical Blog. https://developer.nvidia.com/blog/advanced-api-performance-memory-and-resources/.]
- 圧縮なし:
- 512x512以下のリソース
- ブロック圧縮されるリソース
- 圧縮の要件に合わないその他のテクスチャおよびUAV
- 圧縮あり:
- デプスバッファ
- 512x512以上のレンダーターゲット
- 512x512以上のテクスチャおよびUAV
- arithmetic compressionをネイティブ対応しているフォーマット(8-8-8-8とか16-16とか)
- 圧縮なし:
- エイリアシングをする場合は、Committedリソースは圧縮なしリソースで使う方が良い[Allan 2021Allan, A. 2021. Advanced API Performance: Memory and Resources. NVIDIA Technical Blog. https://developer.nvidia.com/blog/advanced-api-performance-memory-and-resources/.]
- This removes the CPU cost of tracking these resources in case of any alignment with compressed resources.
- それができなければ、圧縮なしテクスチャはすべて各々のヒープにおいたほうが良い
- ReservedリソースやTiledリソースでは、UpdateTileMappingの呼び出しを非同期コピーキューで行う[Allan 2021Allan, A. 2021. Advanced API Performance: Memory and Resources. NVIDIA Technical Blog. https://developer.nvidia.com/blog/advanced-api-performance-memory-and-resources/.]
- Tiledリソースの更新は2MB単位に揃えると最適な圧縮が行われて良い[Allan 2021Allan, A. 2021. Advanced API Performance: Memory and Resources. NVIDIA Technical Blog. https://developer.nvidia.com/blog/advanced-api-performance-memory-and-resources/.]
- AMD的にはTiledリソースは非推奨[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- CPU的にもGPU的にもパフォーマンス上よろしくないので
- 代わりに、suballocationやコピーキューによるデフラグを使う
- リソース単位ではなくヒープ単位でMakeResidentを呼び出す[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- CommittedリソースよりPlacedリソースをおすすめ[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- メモリ使用量をより上手に制御できるので
- レンダーターゲットをUAVとして使わない[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- GCN3世代までの旧GPUでは色の圧縮が機能しなくなる
- 画像データのコピーはバッファを介して行う[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- レンダーターゲットのミップマップ付き配列は圧縮による最適化を行わない[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- AMD GPUでは24ビット深度は32ビットと同じコストになるので32ビットの方を使おう[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- VBの切り替えにはCPUコストが発生し得る[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- 描画ごとにオフセット調整する
- SRVに頂点データを格納してフェッチすることも可能
ヒープ
- 各タイプの特性はこちらを参照
- TYPE_DEFAULTはGPUで読み書きするときに使う[Sawicki 2018Sawicki, A. 2018. Memory Management in Vulkan and DX12. Game Developers Conference. https://www.gdcvault.com/play/1025458/Advanced-Graphics-Techniques-Tutorial-New.]
- GPUから高速にアクセスできる
- CPUからアクセスできない
- TYPE_UPLOADはCPU→GPUの転送に使う[Sawicki 2018Sawicki, A. 2018. Memory Management in Vulkan and DX12. Game Developers Conference. https://www.gdcvault.com/play/1025458/Advanced-Graphics-Techniques-Tutorial-New.]
- CPUのアクセスはキャッシュされない
- CPUからの書き込みがまとめて行われる(write-combined)可能性がある
- GPUからアクセスできるがPCIeバスを通る
- TYPE_READBACKはGPU→CPUの転送に使う[Sawicki 2018Sawicki, A. 2018. Memory Management in Vulkan and DX12. Game Developers Conference. https://www.gdcvault.com/play/1025458/Advanced-Graphics-Techniques-Tutorial-New.]
- CPUのアクセスがキャッシュされる
- GPUからもアクセスできるがPCIeバスを通る
- 加えて、CPUのキャッシュを見に行くのでさらに遅くなる
- TYPE_CUSTOMは上記以外で特性を詳細に指定するときに使う
- 統合型CPUではどのタイプでもシステムメモリを割り当てるのでアクセス速度に違いはない[Sawicki 2018Sawicki, A. 2018. Memory Management in Vulkan and DX12. Game Developers Conference. https://www.gdcvault.com/play/1025458/Advanced-Graphics-Techniques-Tutorial-New.]
クリア
- AMD GPUでは、特定の条件を満たすと高速なクリア処理を行う[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]
- 全体をクリアする
- レンダーターゲットの場合、クリア色がRGBAで(0,0,0,0)、(0,0,0,1)、(1,1,1,0)、(1,1,1,1)のいずれか
- デプスの場合、0.fまたは1.f。ステンシルは0
- デプスの配列はすべてのスライスを一度にクリアする場合のみ有効
- クリアを省略するDiscardを利用して依存関係を切ることも大事[GPUOpen 20232023. RDNA Performance Guide. GPUOpen. https://gpuopen.com/learn/rdna-performance-guide/.]