| 339 | } |
| 340 | |
| 341 | void |
| 342 | DeviceManager::MessageLoop() |
| 343 | { |
| 344 | MSG msg = {0}; |
| 345 | |
| 346 | LARGE_INTEGER perfFreq, previousTime; |
| 347 | QueryPerformanceFrequency(&perfFreq); |
| 348 | QueryPerformanceCounter(&previousTime); |
| 349 | |
| 350 | while (WM_QUIT != msg.message) |
| 351 | { |
| 352 | if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) |
| 353 | { |
| 354 | TranslateMessage(&msg); |
| 355 | DispatchMessage(&msg); |
| 356 | } |
| 357 | else |
| 358 | { |
| 359 | PROFILER_BEGIN("Main Loop"); |
| 360 | |
| 361 | LARGE_INTEGER newTime; |
| 362 | QueryPerformanceCounter(&newTime); |
| 363 | |
| 364 | double elapsedSeconds = (m_FixedFrameInterval >= 0) |
| 365 | ? m_FixedFrameInterval |
| 366 | : (double)(newTime.QuadPart - previousTime.QuadPart) / (double)perfFreq.QuadPart; |
| 367 | |
| 368 | if(m_SwapChain && GetWindowState() != kWindowMinimized) |
| 369 | { |
| 370 | Animate(elapsedSeconds); |
| 371 | Render(); |
| 372 | m_SwapChain->Present(m_SyncInterval, 0); |
| 373 | Sleep(0); |
| 374 | } |
| 375 | else |
| 376 | { |
| 377 | // Release CPU resources when idle |
| 378 | Sleep(1); |
| 379 | } |
| 380 | |
| 381 | { |
| 382 | m_vFrameTimes.push_back(elapsedSeconds); |
| 383 | double timeSum = 0; |
| 384 | for(auto it = m_vFrameTimes.begin(); it != m_vFrameTimes.end(); it++) |
| 385 | timeSum += *it; |
| 386 | |
| 387 | if(timeSum > m_AverageTimeUpdateInterval) |
| 388 | { |
| 389 | m_AverageFrameTime = timeSum / (double)m_vFrameTimes.size(); |
| 390 | m_vFrameTimes.clear(); |
| 391 | } |
| 392 | } |
| 393 | |
| 394 | previousTime = newTime; |
| 395 | |
| 396 | PROFILER_END(); |
| 397 | PROFILER_RESET(); |
| 398 | } |