変数のリフレッシュ レートの表示
可変リフレッシュ レートの表示では 、破棄を 有効にする必要があります。これは "vsync-off" サポートとも呼ばれます。
可変リフレッシュ レートの表示/Vsync オフ
スワップ チェーンの作成時と表示時に特定のフラグを設定することで、可変リフレッシュ レート表示のサポートが実現されます。
この機能を使用するには、アプリ ユーザーが KB3156421 または Anniversary Update がインストールされているWindows 10 システム上にある必要があります。 この機能は、 DXGI_SWAP_EFFECT_FLIP_* スワップ効果を使用して Direct3D 11 と 12 のすべてのバージョンで機能します。
アプリに vsync-off サポートを追加するには、Direct3D 12、D3D12Fullscreen の完全な実行中のサンプルを参照してください (「作業サンプル」を参照してください)。 また、サンプル コードでは明示的に呼び出されない点がいくつかありますが、注意する必要があります。
- ResizeBuffers (または ResizeBuffers1) には、 Present (または Present1) と同じスワップ チェーン作成フラグ (DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) が渡されている必要があります。
- DXGI_PRESENT_ALLOW_TEARINGは、同期間隔 0 でのみ使用できます。 CheckFeatureSupport がティアリングがサポートされ、アプリがウィンドウ モード (罫線のない全画面表示モードを含む) であることを報告する場合は、同期間隔 0 を使用する場合は、常にこのティアリング フラグを渡すようにお勧めします。 詳細については、 DXGI_PRESENT 定数を参照してください。
- vsync を無効にしても、フレーム レートが必ずしも取り消されるとは限りません。開発者は、 Present 呼び出しが他のタイミング イベント (XAML ベースのアプリのイベントなど
CompositionTarget::Rendering
) によって調整されていないことも確認する必要があります。
次のコードでは、アプリに追加する必要があるいくつかの重要な部分を要約します。
//--------------------------------------------------------------------------------------------------------
// Check Tearing Support
//--------------------------------------------------------------------------------------------------------
// Determines whether tearing support is available for fullscreen borderless windows.
void DXSample::CheckTearingSupport()
{
// Rather than create the 1.5 factory interface directly, we create the 1.4
// interface and query for the 1.5 interface. This will enable the graphics
// debugging tools which might not support the 1.5 factory interface.
ComPtr<IDXGIFactory4> factory4;
HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory4));
BOOL allowTearing = FALSE;
if (SUCCEEDED(hr))
{
ComPtr<IDXGIFactory5> factory5;
hr = factory4.As(&factory5);
if (SUCCEEDED(hr))
{
hr = factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing));
}
}
m_tearingSupport = SUCCEEDED(hr) && allowTearing;
}
//--------------------------------------------------------------------------------------------------------
// Set up swapchain properly
//--------------------------------------------------------------------------------------------------------
// It is recommended to always use the tearing flag when it is supported.
swapChainDesc.Flags = m_tearingSupport ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
//--------------------------------------------------------------------------------------------------------
// Present
//--------------------------------------------------------------------------------------------------------
UINT presentFlags = (m_tearingSupport && m_windowedMode) ? DXGI_PRESENT_ALLOW_TEARING : 0;
// Present the frame.
ThrowIfFailed(m_swapChain->Present(0, presentFlags));
関連トピック