当帧开始时,我会进行逻辑更新并在此之后进行渲染。 在我的渲染代码中,我做通常的事情。我设置了几个状态,buffors,纹理,并通过调用Draw来结束。
m_deviceContext->Draw(
nbVertices,
0);
在帧结束时,我调用present来显示渲染帧。
// Present the back buffer to the screen since rendering is complete.
if(m_vsync_enabled)
{
// Lock to screen refresh rate.
m_swapChain->Present(1, 0);
}
else
{
// Present as fast as possible.
m_swapChain->Present(0, 0);
}
通常的东西。现在,当我打电话给Draw时,根据MSDN
Draw将工作提交给渲染管道。
这是否意味着数据被发送到GPU并且主线程(名为Draw)继续?还是等待渲染完成?
在我看来,只有Present函数才能使主线程等待渲染完成。
答案 0 :(得分:3)
有许多调用可以触发GPU开始工作,Draw
是一个。其他内容包括Dispatch
,CopyResource
等.MSDN文档试图说的是像PSSetShader
这样的内容。在致电IASetPrimitiveTopology
之前,Draw
等并没有做任何事情。
当您致电Present
时,该Present
被视为框架结束的隐含指示符'但是你的程序通常可以继续在第一帧完成和显示之前为下一帧设置渲染调用。默认情况下,Windows会让您在at 12:00 the schedule is :
first_task:eating:fruit
second_task:rest:onehour
third_task:watching:horrorfilm
at 18:00 the schedule is :
first_task:eating:vegetals
second_task:rest:threehours
third_task:watching:manga
at 22:00 the schedule is :
first_task:eating:nothing
second_task:rest:sevenhours
third_task:watching:nothing
调用阻塞CPU线程之前最多排队3帧,让GPU赶上 - 实时渲染您通常不想要延迟在输入和渲染之间真的很高。
这里要记住一般的经验法则: