Direct3D 12窗口模式强制vsync

真子

我正在编写一个简单的Direct3D 12应用程序以准备发布Vulkan,它在所有方面都可以正常工作,但有一个方面:在带边框的窗口中运行会将帧率限制为60fps,即使禁用了vsync。让我感到困惑的是:同一程序在全屏窗口中的运行速度接近4000fps。

使用肮脏的自制分析器,我发现代码的这一部分发生了挂断,该挂起一直等到最后一帧完成后才开始处理下一个。

if (m_fence->GetCompletedValue() < endFenceValue)
{
    result = m_fence->SetEventOnCompletion(endFenceValue, m_fenceEvent);
    if (result != S_OK) return false;
    WaitForSingleObject(m_fenceEvent, INFINITE); //Program stalls here
}
//m_fence is a pointer to an ID3D12Fence object
//endFenceValue is an unsigned long long
//m_fenceEvent is a HANDLE

用于呈现渲染帧的代码是普通的:

if (m_vsync)
{
    result = m_swapChain->Present(1, 0);
    if (result != S_OK) return 0;
}
else
{
    result = m_swapChain->Present(0, 0);
    if (result != S_OK) return 0;
}

//Increase the fence value
result = m_commandQueue->Signal(m_fence, m_fenceValue);
if (result != S_OK) return 0;

return m_fenceValue++;
//m_swapChain is a pointer to an IDXGISwapChain3 object
//m_commandQueue is a pointer to an ID3D12CommandQueue object
//m_fenceValue is a HANDLE

注意:代码的第一块使用上述函数的返回值作为endFenceValue

我正在使用的交换链的设置如下:

swapChainDesc.BufferCount = 2; //Double buffered
swapChainDesc.BufferDesc.Width = width; //Set width
swapChainDesc.BufferDesc.Height = height; //Set height
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; //32-bit back buffers
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; //Set the back buffers to be used as render targets
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; //Throw out old back buffer contents after getting a new frame
swapChainDesc.OutputWindow = window;
swapChainDesc.Windowed = !fullscreen;
//Auto-detect the refresh rate
swapChainDesc.BufferDesc.RefreshRate.Numerator = 0;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 0;

//No multisampling for now
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
//Set the scan line ordering and scaling to unspecified
swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
//Allow to switch between windowed and fullscreen modes
//Also changes the monitor resolution to match the width and height of the window in fullscreen mode
swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

对于那些感兴趣的人,我正在使用SDL创建窗口,但是编写自己的窗口WinMain并不能解决问题。我也尝试过检查nVidia控制面板中的vsync设置,退出fl.ux(但不卸载它),并在“系统属性”中更改性能设置。

谁能为此提供解释或解决方案?

galop1n

Windows 10内部版本10586已删除带有窗口交换链的刷新率上限。

更新您的Windows,它应该会自行解决。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Direct3D游戏中强制Direct3D抗锯齿?

来自分类Dev

在Direct3D 12应用程序中,全屏真的比窗口模式好吗?

来自分类Dev

Direct3D编程的新手:11 vs 12

来自分类Dev

Direct3D 11无窗口渲染到DIB(用于IMediaSample上游)

来自分类Dev

Windows 10移动版(电话)是否支持Direct3D 12?

来自分类Dev

Direct3D 和 DXGI 的区别

来自分类Dev

Direct3D纹理资源生命周期

来自分类Dev

Direct3D地图像素黑色

来自分类Dev

C ++ Direct3D多屏幕捕获

来自分类Dev

Direct3D 9.0返回到固定功能管道

来自分类Dev

Oracle Virtual Box如何启用Direct3D

来自分类Dev

Windows XP VirtualBox VM上的Direct3D加速

来自分类Dev

Direct3D(v10)多个世界转换

来自分类Dev

在Visual Studio中安装Directx和Direct3D

来自分类Dev

使用QueryInterface方法的目的是什么?(Direct3D)

来自分类Dev

为Direct3D初始化获取HWND

来自分类Dev

如何查找支持的 Direct3D 功能级别

来自分类Dev

从Direct2D渲染目标获取Direct3D设备

来自分类Dev

Direct3D 11 / HLSL Texture3D <float3>错误错误?

来自分类Dev

Direct3D 11 / HLSL Texture3D <float3>错误错误?

来自分类Dev

unity3d,多个渲染目标-Direct3D / OpenGl中的不同行为

来自分类Dev

如何在Direct3D 11中从CPU访问帧缓冲区?

来自分类Dev

CUDA Direct3D互操作性已弃用?

来自分类Dev

OpenGL和Direct3D:从程序员的角度来看,它们代表什么?

来自分类Dev

Tesla k20m与Direct3D 11的互操作性

来自分类Dev

Direct3D 11中具有不同数量图元的图形对象

来自分类Dev

Direct3D多个顶点缓冲区,非交错元素

来自分类Dev

什么是Direct3D 12.0上的“映射默认缓冲区”?

来自分类Dev

尝试加载PNG纹理(Direct3D 11)时出现“未找到组件”错误

Related 相关文章

热门标签

归档