| 22 | } |
| 23 | |
| 24 | void UpdateLoop::exec(Updatable updatable, ShouldExit shouldExit) |
| 25 | { |
| 26 | // We must use double precision because time_since_epoch can exceed float precision |
| 27 | typedef std::chrono::duration<double> seconds; |
| 28 | double prevElapsedTime = 0; |
| 29 | |
| 30 | while (!shouldExit()) |
| 31 | { |
| 32 | // Get time delta |
| 33 | double elapsed; |
| 34 | while (true) // this loop enforces max frame rate |
| 35 | { |
| 36 | elapsed = seconds(std::chrono::high_resolution_clock::now().time_since_epoch()).count(); |
| 37 | if (float(elapsed - prevElapsedTime) > mMinFrameDuration) |
| 38 | break; |
| 39 | std::this_thread::sleep_for(std::chrono::milliseconds(1)); |
| 40 | } |
| 41 | |
| 42 | float dtWallClock(elapsed - prevElapsedTime); |
| 43 | prevElapsedTime = elapsed; |
| 44 | |
| 45 | if (!updatable(dtWallClock)) |
| 46 | { |
| 47 | return; |
| 48 | } |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | } // namespace skybolt |
no outgoing calls
no test coverage detected