Пропуск кадров в обработчике OnPaint с использованием таймера - PullRequest
0 голосов
/ 28 апреля 2020

Я создаю игру, в которой анимации создаются с использованием обработчика OnPaint и таймера. Приложение использует физическую систему, которая дает разные результаты при одинаковых входных данных. Я подозреваю, что эта проблема вызвана пропущенными кадрами, но я не могу точно определить, почему это происходит.

Каждый раз, когда вызывается OnPaint, я рассчитываю, сколько времени прошло с тех пор, как я в последний раз рисовал экран. Затем я обновляю объекты в игре на основе этого количества времени. Вот как выглядит моя функция OnPaint:

// Frame duration in milliseconds
const int FrameDuration = 20;

void CChildView::OnPaint()
{
    CPaintDC paintDC(this);     // device context for painting
    CDoubleBufferDC dc(&paintDC); // device context for painting
    Graphics graphics(dc.m_hDC);    // Create GDI+ graphics context
    graphics.SetSmoothingMode(SmoothingModeAntiAlias);
    mGame.OnDraw(&graphics);

    if (mFirstDraw)
    {
        mFirstDraw = false;
        SetTimer(1, FrameDuration, nullptr);

        /*
         * Initialize the elapsed time system
         */
        LARGE_INTEGER time, freq;
        QueryPerformanceCounter(&time);
        QueryPerformanceFrequency(&freq);

        mLastTime = time.QuadPart;
        mTimeFreq = double(freq.QuadPart);
    }

    /*
     * Compute the elapsed time since the last draw
     */
    LARGE_INTEGER time;
    QueryPerformanceCounter(&time);
    long long diff = time.QuadPart - mLastTime;
    double elapsed = double(diff) / mTimeFreq;
    mLastTime = time.QuadPart;

    mGame.Update(elapsed);
}

Мой обработчик OnTimer просто вызывает invalidate.

void CChildView::OnTimer(UINT_PTR nIDEvent)
{
    Invalidate();
    CWnd::OnTimer(nIDEvent);
}

Я не уверен, почему я здесь пропускаю кадры. Я также не уверен на 100%, но, основываясь на поведении, которое я заметил, я думаю, что в этом моя проблема.

...