ニュースについて簡単に説明します。
DirectX 11.2で行われた作業の大部分は、主にパフォーマンスと効率に関連しており、プログラマーに直接影響することはありません。 アプリケーションの実行速度が速くなり、必要なリソースが少なくなります。 ただし、Direct3D 11.2 APIにはいくつかの新しいAPIが含まれています。
- ハードウェアオーバーレイのサポート :興味深いシナリオを備えた動的スケーリングツール。
- 実行時の HLSL シェーダーのコンパイルとリンク :Windowsストアアプリケーションを含め、実行時にシェーダーを構築できる機能。
- メモリに マップされ た バッファ : GPUとデータを交換するときに追加のデータコピー操作の必要性を排除する 機能
- 入力遅延 を 減らす ためのAPI :ユーザー入力と画面への出力の間の遅延時間を大幅に削減できるメカニズム。
- タイル リソース :テクスチャマップを使用したレンダリングの品質の向上。
ハードウェアオーバーレイのサポート。
ほとんどの最新のグラフィックアクセラレータの機能の1つは、グラフィックのスケーリング手順が非常に安価な操作であることです。 この点で、リソースが不足している場合やレンダリング速度が低下している場合に使用すると興味深いシナリオがいくつかあります。
画像から既に明らかなように、ハードウェアオーバーレイにより、低解像度でバッファにレンダリングし、この画像を必要なサイズに拡大し、アルファマスクを介して追加のバッファと混合できます。 ゲームは最初のオーバーレイで3Dシーンを低品質で表示できますが、HUDまたはアプリケーションの他のグラフィック要素は高品質で表示できます。
同時に、ハードウェアオーバーレイを使用するための2つの主要なシナリオ、静的と動的がサポートされています。
静的オーバーレイ。
このタイプのオーバーレイは、バッファを初期化するときにズームレベルを受け入れるだけで、将来その値を変更しません。 初期化するには、DXGI_SCALING_STRETCHフラグを指定するだけです:
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; swapChainDesc.Width = screenWidth / 1.5f; swapChainDesc.Height = screenHeight / 1.5f; swapChainDesc.Scaling = DXGI_SCALING_STRETCH; ... dxgiFactory->CreateSwapChainForCoreWindow( m_d3dDevice.Get(), reinterpret_cast<IUnknown*>(m_window.Get()), &swapChainDesc, nullptr, &swapChain );
この方法の適用範囲は、ズームレベルが事前にわかっている場合に限られます。
動的オーバーレイ。
より興味深いオプション。バッファを再初期化せずにズームレベルをオンザフライで変更できます(スワップチェーン)。 各レンダリングの前にSetSourceSize関数を呼び出すだけです。
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; swapChainDesc.Width = screenWidth; swapChainDesc.Height = screenHeight; swapChainDesc.Scaling = DXGI_SCALING_STRETCH; dxgiFactory->CreateSwapChainForCoreWindow( ... ); ... if (fps_low == true) { swapChain->SetSourceSize(screenWidth * 0.8f, screenHeight * 0.8f); } // . ... swapChain->Present(1, 0);
ダイナミックオーバーレイにより、ハードウェアリソースの現在の負荷に応じて、FPSを犠牲にすることなく即座に画質を変更できます。 最終画像の解像度が10%低下しても、レンダリング手順が数倍高速化されることがあり、動的にロードされるシーンにプラスの影響を与えます。 画面に表示されるオブジェクトが多すぎる場合、プレイヤーは「ブレーキ」の感覚を失います。
シェーダーのコンパイルとリンク。
シェーダーの動的コンパイルは、アプリケーションの実行中に非常に便利な最適化ツールです。 残念ながら、Windows 8.0では、この機能はWindowsストアアプリケーションでは使用できず、開発者はシェーダー用のバイナリBLOBを事前に作成する必要がありました。 Windows 8.1のリリースで、この機能はWindowsストアアプリに戻りました。
これに加えて、シェーダー「lib_5_0」をコンパイルするオプションが登場しました。これにより、シェーダーコンピューティングユニットをコンパイルし、プログラム実行中にシェーダーをコンパイルせず、既製のライブラリーからのみコンパイルできます。 この機能により、シェーダーの接続時間が大幅に増加し、アプリケーション実行中の高価なコンパイル操作が不要になります。
マッピングされたバッファ。
Windows 8.0では、計算シェーダーのGPUと通信するには補助バッファーが必要です。 これには多少のコストがかかり、計算シェーダーでも同じことが高価になる可能性があります。
Windows 8.1およびDirectX 11.2を使用している場合、CPU_ACCESSフラグを使用して2つの補助操作を削除できます。 次に、画像は次のようになります。
したがって、シェーダーの計算のパフォーマンスを向上させることができます。 これまでのところ、この機能はデータバッファーに対してのみ機能し、テクスチャ(Texture1D / 2D / 3D)では機能しないことに注意してください。 いずれにせよ、開発者は簡単に直接チェックしたり作業したり、補助バッファーを使用したりできます。
D3D11_FEATURE_DATA_D3D11_OPTIONS1 featureOptions; m_deviceResources->GetD3DDevice()->CheckFeatureSupport( D3D11_FEATURE_D3D11_OPTIONS1, &featureOptions, sizeof(featureOptions) ); ... If (featureOptions.MapDefaultBuffers) { deviceContext->Map(defaultBuffer, ...); } else { deviceContext->CopyResource(stagingBuffer, defaultBuffer); deviceContext->Map(stagingBuffer, ...); }
入力遅延を減らすためのAPI
入力に対する反応と画面上の結果の実際の表示の間の時間は、多くのアプリケーション、特にゲームにとって重要です。 この時間が長すぎると、プレイヤーは「ブレーキ」と不快感を感じます。 この時間の最適化は骨の折れるプロセスですが、DirectX 11.2のリリースとともに、プログラマーはこのタスクを大幅に促進する追加のメカニズムを備えています。 新しいAPI IDXGISwapChain2 :: GetFrameLatencyWaitableObjectがあります。これにより、WAIT HANDLEを取得し、WaitForMultipleObjectExを使用して、最も成功したレンダリングの瞬間を待つことができます。
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; ... swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT; dxgiFactory->CreateSwapChainForCoreWindow( ... ); HANDLE frameLatencyWaitableObject = swapChain->GetFrameLatencyWaitableObject(); while (m_windowVisible) { WaitForSingleObjectEx( frameLatencyWaitableObject, INFINITE, true ); Render(); swapChain->Present(1, 0); }
たとえば、このAPIを使用すると、Surfaceなどのデバイスでのレイテンシが46ミリ秒から20ミリ秒に半分以上短縮されます。
タイルリソース
現代のゲームでは、テクスチャ用など、より多くのビデオメモリが必要です。 最終画像の品質は、テクスチャの品質とその解像度に直接依存します。 使用するビデオメモリを最適化する方法の1つは、タイルリソースのDirect X 11.2(タイルリソース)メカニズムです。 それが何であるかを理解するには、ビルド全体レポートから 3分間のビデオを見るのが良いでしょう。