最近在学习引擎的时候,发现DirectX11垂直同步提交非常卡,测试了下,发现每次提交需要20毫秒以上时间,关闭垂直同步的提交时间几乎在2毫秒以下。(没有任何渲染,就是设置背景色为蓝色而已)
float bgColor[4];
bgColor[0] = 0.0f;
bgColor[1] = 0.0f;
bgColor[2] = 1.0f;
bgColor[3] = 1.0f;
m_pDeviceContext->ClearRenderTargetView(m_pRenderTargetView, bgColor);
m_pDeviceContext->ClearDepthStencilView(m_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);
if (m_bVsync)
m_pSwapChain->Present(1, 0);
else
m_pSwapChain->Present(0, 0);
国内搜不到任何相关的资料,果然国内还在学DirectX的已经很少了。Google上搜到好几篇,都是在说GPU和CPU导致的,还有说是分辨率没设置正确的,Σ( ° △ °|||)︴因为之前有写过DirectX11的代码,知道应该没有这个问题的。但是相信Google一次,全部测试下(除了CPU和CPU的),发现没有用。只好重新打开之前的代码,测试,没有明显卡顿,多台电脑测试,都发现没有这种问题。Google上也不能相信,只好靠自己了。
采取最傻的方法,老代码和有问题的代码全部拷出来(就2部分代码:创建窗口,创建DirectX和渲染这部分),发现没有卡顿问题,怀疑是不是将这部分代码封装到静态库中,导致的,再测试还是没有问题。那只能怀疑有些新的东西导致的,逐步注释代码,定位到RegisterRawInputDevices的问题。
有问题的代码:
bool CMouse::Initialize()
{
m_eventBuffer = {};
if (!m_bRawInputIsInit)
{
RAWINPUTDEVICE rid;
memset(&rid, 0, sizeof(rid));
rid.dwFlags = 0;
rid.hwndTarget = NULL;
rid.usUsage = 0x02;
rid.usUsagePage = 0x01;
bool result = RegisterRawInputDevices(&rid, 1, sizeof(rid));
if (!result)
ENGINE_LOG_HRESULT_ERROR("RegisterRawInputDevices function failed", GetLastError())
else
m_bRawInputIsInit = true;
}
return true;
}
不清楚为何会有这种情况,只能认为RegisterRawInputDevices捕获设备信息的时候有影响到DirectX的垂直同步渲染。Google也没搜到相关的内容,只能暂时记录下,以防下次再花很多时间来查问题。
DirectX引擎视频系列:油管上的,讲的还是比较细的,看的不是很多,暂时不能做任何评价。