在DirectX

时间:2017-09-12 17:40:42

标签: c++ 3d directx delay direct3d

我最近开始用C ++学习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);
}

它有效,但它依赖于time()延迟,我想知道Direct3D库中是否有更好的对应物。例如,如果我可以按照具体的颜色和链延迟顺序调用此函数,如下所示:

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

我知道函数Sleep()存在于标准库中,但它实际上冻结了我的应用程序窗口(在延迟期间我无法与它进行交互)。也许我可以将时间设置为不同的时间段,以便它按照我想要的频率更新?

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

1 个答案:

答案 0 :(得分:0)

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

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

  顺便说一句,不要花时间学习遗留的Direct3D 9,它依赖于支持已弃用的DirectX SDK的代码,并要求传统的DirectSetup部署古老的帮助库D3DX9(参见MSDN )。使用DirectX 11.请参阅DirectX Tool Kit