Странное поведение при добавлении дублей - PullRequest
0 голосов
/ 06 августа 2020

Я работаю над проектом Direct3D, и в моем коде есть функция, которая принимает двойное значение в качестве параметра, это двойное значение представляет время с момента последнего кадра, идея заключалась в том, чтобы суммировать это время с другим двойным, который представляет угол. вращения куба, а затем сохраните новое значение как новый угол, но после отладки я заметил, что угол (называемый в коде rot), начинающийся с нуля, в самом первом кадре перескакивает на значение, подобное ~ 79800, каждый раз он немного отличается, но всегда имеет 79 в качестве первых чисел, я действительно не понимаю, в чем проблема.

Вот запуск каждого кадра:

double rot = 0.0f;
double seconds = 0.0;
unsigned int frames = 0;

// this is the function used to render a single frame
void RenderFrame(double time)
{
    // clear the back buffer to a deep blue
    devcon->ClearRenderTargetView(renderTarget, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f));
    devcon->ClearDepthStencilView(stencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);

    //PROBLEM HERE
    //////
    rot += time;
    //////


    VSCBdata.transformation = XMMatrixTranspose(XMMatrixRotationX(rot) * XMMatrixRotationZ(rot) * XMMatrixTranslation(0.0f, 0.0f, 4.0f) * XMMatrixPerspectiveLH(1.0f, 1.0f, 0.5f, 10.0f));

    devcon->UpdateSubresource(VSConstantBuffer, 0, NULL, &VSCBdata, 0, 0);

    // draw the vertex buffer to the back buffer
    devcon->DrawIndexed(ARRAYSIZE(indices), 0, 0);

    VSCBdata.transformation = XMMatrixTranspose(XMMatrixRotationY(rot) * XMMatrixRotationZ(rot) * XMMatrixTranslation(0.0f, 2.0f, 6.0f) * XMMatrixPerspectiveLH(1.0f, 1.0f, 0.5f, 10.0f));

    devcon->UpdateSubresource(VSConstantBuffer, 0, NULL, &VSCBdata, 0, 0);

    // draw the vertex buffer to the back buffer
    devcon->DrawIndexed(ARRAYSIZE(indices), 0, 0);

    // do 3D rendering on the back buffer here

    // switch the back buffer and the front buffer
    swapchain->Present(0, 0);
}

А вот код который вычисляет прошедшее время:

double frequency = 0.0;
__int64 start = 0;
__int64 lastFrame = 0;

void StartTimer()
{
    LARGE_INTEGER shish;
    QueryPerformanceFrequency(&shish);
    frequency = double(shish.QuadPart);
    QueryPerformanceCounter(&shish);
    start = shish.QuadPart;
}

double GetTime()
{
    LARGE_INTEGER time;
    QueryPerformanceCounter(&time);
    return (time.QuadPart - start) / frequency;
}

double GetFrameTime()
{
    LARGE_INTEGER time;
    QueryPerformanceCounter(&time);
    __int64 result = time.QuadPart - lastFrame;
    lastFrame = time.QuadPart;
    if (result < 0.0) result = 0.0;
    return double(result)/frequency;
}

1 Ответ

0 голосов
/ 06 августа 2020

Поскольку lastFrame инициализирован как 0, первый вызов GetFrameTime вернет значение QueryPerformanceCounter в секундах.

Вы должны либо вызвать GetFrameTime один раз в начале вашего запрограммировать и сбросить значение или инициализировать lastFrame в StartTimer.

...