Код: Выделить всё
// Prepare to render the next frame.
void D3D12HelloFrameBuffering::MoveToNextFrame()
{
// Schedule a Signal command in the queue.
const UINT64 currentFenceValue = m_fenceValues[m_frameIndex];
ThrowIfFailed(m_commandQueue->Signal(m_fence.Get(), currentFenceValue));
// Update the frame index.
m_frameIndex = m_swapChain->GetCurrentBackBufferIndex();
// If the next frame is not ready to be rendered yet, wait until it is ready.
if (m_fence->GetCompletedValue() < m_fenceValues[m_frameIndex])
{
ThrowIfFailed(m_fence->SetEventOnCompletion(m_fenceValues[m_frameIndex], m_fenceEvent));
WaitForSingleObjectEx(m_fenceEvent, INFINITE, FALSE);
}
// Set the fence value for the next frame.
m_fenceValues[m_frameIndex] = currentFenceValue + 1;
}
Я также проверил пример кода Nvidia, и вот их версия:
Код: Выделить всё
struct FrameContext
{
ComPtr m_allocator;
ComPtr m_computeAllocator;
ComPtr m_fence;
uint64_t m_fenceValue = 0;
};
void DeviceResources::MoveToNextFrame()
{
FrameContext* ctx = &m_frameContext[m_frameIndex];
DX::ThrowIfFailed(m_commandQueue->Signal(ctx->m_fence.Get(), ctx->m_fenceValue));
m_frameIndex = m_swapChain->GetCurrentBackBufferIndex();
if (ctx->m_fence->GetCompletedValue() < ctx->m_fenceValue)
{
DX::ThrowIfFailed(ctx->m_fence->SetEventOnCompletion(ctx->m_fenceValue, m_fenceEvent.Get()));
WaitForSingleObjectEx(m_fenceEvent.Get(), INFINITE, false);
}
ctx->m_fenceValue++;
}
Заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/787 ... n-question