Я создаю игру, в которой анимации создаются с использованием обработчика 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%, но, основываясь на поведении, которое я заметил, я думаю, что в этом моя проблема.