0

私は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);
}

どんな助けでも大歓迎です

4

2 に答える 2

0

ディスパッチメッセージの後から続行を削除します。大量のメッセージがキューに入れられている場合(たとえば、ウィンドウ上でマウスを動かすと)、レンダリングする代わりにそれらのメッセージの処理に時間を浪費することになります。

また、すべてのメッセージを1つのメッセージで処理するには、次のようにするのが一般的です。

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

レンダリングしているよりも定期的に入力を処理しているように見えるので、処理している入力の種類も確認するのは興味深いことです。

ただし、一般的には、常にレンダリングし、最後のフレームからの時間で移動コードを単純に乗算して、スムーズにする方がよいでしょう。このようにして、特定の1秒間の動きを計算します。したがって、キーを押して1秒あたり1回転で回転する場合は、回転増分を(2 * pi)/sinceLastFrame..に設定するだけです。

CPU時間が50%である理由は、事実上、ループに座っているためです。どの時点でもタイムスライスをあきらめることはありません。ループ処理入力をスピンするだけで、おそらくレンダリングが発生するよりも1秒あたり何回も回転します。

于 2011-08-30T17:33:24.163 に答える
0

わかりました、私はそれを釘付けにしました、そして私は私の顔にパンチに値すると思います。ハードウェアデバイスの代わりに参照デバイスを作成していました

于 2011-09-04T10:39:10.190 に答える