Direct3D 10中的正确动画

时间:2011-08-30 17:00:46

标签: animation direct3d throttling

我是d3d开发的初学者,我一直坚持第一个问题。我创建了一个小程序,绘制每个顶点随机高度的地形和从左向右移动的灯(加上基本的键盘管理)。问题是动画灯很滑,输入识别经常失败,CPU使用率是50%不变(我有双核cpu)。我认为这个问题是由不正确的限制引起的,但即使在修复代码后我仍然有问题。我的主要循环是

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    HWND wndHandle;
    int width = 640;
    int height = 480;

    wndHandle = InitWindow(hInstance, width, height);
    InitDirect3D(wndHandle, width, height);
    DInputInit(hInstance, wndHandle);
    SceneSetUp();
    MSG msg = {0};
    QueryPerformanceFrequency((LARGE_INTEGER *) &perf_cnt);
    time_count = perf_cnt / fixedtic;
    QueryPerformanceCounter((LARGE_INTEGER *) &next_time);
    while (WM_QUIT != msg.message)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            continue;
        }
        HandleInput();
        QueryPerformanceCounter((LARGE_INTEGER *) &cur_time);
        if (cur_time>next_time) {
            Render();
            next_time += time_count;
            if (next_time < cur_time)
                next_time = cur_time + time_count;
        }
    }
    ShutdownDirect3D();
    return (int)msg.wParam;
}

,而渲染功能是

void Render()
{
    QueryPerformanceCounter((LARGE_INTEGER *) &curtime);
    timespan = (curtime - last_time) * time_factor;
    last_time = curtime;
    model.pD3DDevice->ClearRenderTargetView(model.pRenderTargetView, D3DXCOLOR(0.0f, 0.0f, 0.0f, 0.0f));
    lightpos.x = (float)cos(ang) * 256.0f;
    ang += timespan * 0.5;
    lpvar->SetFloatVector((float *) lightpos);
    D3DXMatrixLookAtLH(&V, &model.campos, new D3DXVECTOR3(0.0f, 0.0f, 0.0f), new D3DXVECTOR3(0.0f, 1.0f, 0.0f));
    D3DXMATRIX VP = V*P;
    camvar->SetFloatVector((float *)model.campos);
    ViewProjection->SetMatrix((float *) &VP);
    for(UINT p=0; p < techniqueDescription.Passes; ++p)
    {
        pTechnique->GetPassByIndex(p)->Apply(0);
        model.pD3DDevice->DrawIndexed(numIndices, 0, 0);
    }
    model.pSwapChain->Present(0, 0);
}

感谢任何帮助

2 个答案:

答案 0 :(得分:0)

从Dispatch消息后删除continue。如果你有一堆排队的消息(比如你将鼠标移到窗口上),那么你最终会浪费时间来处理这些消息而不是渲染。

通常还要执行以下操作来处理所有消息:

    while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

看到你正在处理的输入也是很有趣的,因为你似乎比渲染更经常地处理输入。

一般情况下,最好不断渲染并简单地将任何移动代码乘以自上一帧以来的时间来平滑。通过这种方式,您可以计算出给定秒数的运动。因此,如果您想按一个键并以每秒1转的速度旋转,那么您只需将旋转增量设置为(2 * pi)/ sinceLastFrame ......

你的CPU时间为50%的原因是因为你有效地坐在一个循环中。你不会在任何时候放弃你的时间片。你只需旋转循环处理输入,每秒可能要比渲染更多次。

答案 1 :(得分:0)

好的,我钉了它,我觉得我应该得到一拳。我正在创建一个参考设备而不是硬件设备