2017-09-12 76 views
0

我最近开始在C++中学习DirectX编程,并且遇到了一个小问题。在DirectX中放置帧之间的延迟

问题是,我的练习要求我将DirectX应用程序中的颜色从一个更改为另一个。我有一个函数,这是否:

void render_frame(void) 
{ 
    // start the random generator 
    srand(time(NULL)); 

    // clear the window to random color 
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(rand() % 255, rand() % 255, rand() % 255), 1.0f, 0); 

    // begin/end/display scene 
    d3ddev->BeginScene(); 
    d3ddev->EndScene(); 
    d3ddev->Present(NULL, NULL, NULL, NULL); 
} 

它的工作原理,但它是依赖于时间()延迟,我不知道是否有在Direct3D图书馆更好的对应。例如,如果我能在链与特定的颜色和延迟调用此函数为了这样的:

void render_frame_red(void); 
delay(1000); 
void render_frame_blue(void); 
delay(1000); 

我知道函数睡眠()存在于标准库,但它确实冻结我的应用程序窗口(我可以”在延迟期间与它进行交互)。也许我可以将时间设置为不同的tickrate,以便随时更新我想要的时间?

我知道这是一件小事,我可能会稍后在我的3D编程之旅中想出它,但如果我更了解DirectX中的工作方式,它不会受到伤害。

+0

只能在程序中调用一次srand()。 –

+0

是的,那是我的不好。我通常在我的main()函数(在这种情况下是WinMain())开始时调用它。 – RPAnimation

+0

@NeilButterworth其实一次在线程中。甚至可以使用':: std :: random_device'。至于问题,DirectX根本不处理时间。现在,所有相关功能都存在于DXGI中(请参阅[IDXGISwapChain](https://msdn.microsoft.com/en-us/library/windows/desktop/bb174569(v = vs.85).aspx))和系统定时器。 – VTT

回答

0

Direct3D的一般模型是“尽可能快地渲染帧”,然后在程序中进行基于时间的操作来处理动画。传统的GDI风格的绘图只能绘制“按需”,您可以使用Direct3D进行绘制,但会让事情变得更加困难。

换句话说,使用时钟而不是帧数来控制动画和效果。有关Direct3D渲染的定时器解决方案,请参阅this blog post

BTW,不投资你的时间在学习传统的Direct3D 9很大程度上依赖于支持从已过时的DirectX SDK代码,并要求传统DirectSetup部署古助手库D3DX9(见MSDN)。使用DirectX 11.请参阅DirectX Tool Kit

+0

这两者之间的主要区别是什么?我知道DirectX SDK不再被更新,但不是基于相同根的那些? (语法,与GPU沟通,技术等)当代开发人员是否使用DirectX Tool Kit来制作游戏?我知道我没有根据地提出问题,但我需要确保在从已弃用的SDK中放弃我的学习之前。 – RPAnimation

+0

@RPAnimation'DirectX SDK'经常更新,但它成为'Windows SDK'的一部分。单独的'DirectX SDK'是一个弃用的旧版SDK。 'DirectX Tool Kit'是一组支持库以简化开发(并且它也经常更新)。 – VTT

+0

关于我的博客上关于不同主题的DirectX SDK状态,有几十篇文章。从上面的MSDN链接开始,查看[博客](https://blogs.msdn.microsoft.com/chuckw/tag/dxsdk/)。大多数游戏开发者使用现有的游戏引擎(使用DirectX 11/12),或者他们已经熟悉DirectX以编写自己的引擎。我指出_DirectX Tool Kit_是一种基于受支持的开源库来学习C++中的DirectX 11的可访问方法,可以避免使用已弃用的DirectX SDK。网上大多数其他教程在这方面已经过时了。 –