Skip to content
Go back

DirectX12実践メモ

· Updated:

スワップチェイン

  • 非フルスクリーン状態では、達成したい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)を呼び出す

プレゼント

グラフィクスキュー

コンピュートキュー

コピーキュー

  • ローカル-システム間のデータ転送をコピーキューで行う[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間でコピーする場合や結果をすぐに使いたい場合は、コピーキューを使わない

メモリ

パイプラインステート

デスクリプタヒープ

ルートシグネチャ

コマンドアロケータ

コマンドリスト

バンドル

バリア

フェンス

リソース

ヒープ

クリア

  • 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/.]