| 189 | } |
| 190 | |
| 191 | void |
| 192 | DeviceManager::MessageLoop() |
| 193 | { |
| 194 | MSG msg = {0}; |
| 195 | |
| 196 | LARGE_INTEGER perfFreq, previousTime; |
| 197 | QueryPerformanceFrequency(&perfFreq); |
| 198 | QueryPerformanceCounter(&previousTime); |
| 199 | |
| 200 | while (WM_QUIT != msg.message) |
| 201 | { |
| 202 | if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) |
| 203 | { |
| 204 | TranslateMessage(&msg); |
| 205 | DispatchMessage(&msg); |
| 206 | } |
| 207 | else |
| 208 | { |
| 209 | LARGE_INTEGER newTime; |
| 210 | QueryPerformanceCounter(&newTime); |
| 211 | |
| 212 | double elapsedSeconds = (m_FixedFrameInterval >= 0) |
| 213 | ? m_FixedFrameInterval |
| 214 | : (double)(newTime.QuadPart - previousTime.QuadPart) / (double)perfFreq.QuadPart; |
| 215 | |
| 216 | if(m_SwapChain && GetWindowState() != kWindowMinimized) |
| 217 | { |
| 218 | Animate(elapsedSeconds); |
| 219 | Render(); |
| 220 | m_SwapChain->Present(m_SyncInterval, 0); |
| 221 | Sleep(0); |
| 222 | } |
| 223 | else |
| 224 | { |
| 225 | // Release CPU resources when idle |
| 226 | Sleep(1); |
| 227 | } |
| 228 | |
| 229 | { |
| 230 | m_vFrameTimes.push_back(elapsedSeconds); |
| 231 | double timeSum = 0; |
| 232 | for(auto it = m_vFrameTimes.begin(); it != m_vFrameTimes.end(); it++) |
| 233 | timeSum += *it; |
| 234 | |
| 235 | if(timeSum > m_AverageTimeUpdateInterval) |
| 236 | { |
| 237 | m_AverageFrameTime = timeSum / (double)m_vFrameTimes.size(); |
| 238 | m_vFrameTimes.clear(); |
| 239 | } |
| 240 | } |
| 241 | |
| 242 | previousTime = newTime; |
| 243 | } |
| 244 | } |
| 245 | } |
| 246 | |
| 247 | LRESULT |
| 248 | DeviceManager::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |