diff --git a/ios/src/FlutterFilamentFFIApi.cpp b/ios/src/FlutterFilamentFFIApi.cpp index 1ee2dcc3..020971d1 100644 --- a/ios/src/FlutterFilamentFFIApi.cpp +++ b/ios/src/FlutterFilamentFFIApi.cpp @@ -45,7 +45,7 @@ public: float elapsed = float(std::chrono::duration_cast(now - last).count()); - while(elapsed < 3 * _frameIntervalInMilliseconds / 4) { + while(elapsed < _frameIntervalInMilliseconds - 5) { std::function task; std::unique_lock lock(_access); @@ -70,6 +70,25 @@ public: // Log("Took %f milliseconds for render", float(std::chrono::duration_cast(frameEnd - frameStart).count())); } + elapsed = float(std::chrono::duration_cast(now - last).count()); + + while(elapsed < _frameIntervalInMilliseconds) { + std::function task; + std::unique_lock lock(_access); + if (_tasks.empty()) { + _cond.wait_for(lock, std::chrono::duration(1)); + now = std::chrono::high_resolution_clock::now(); + elapsed = float(std::chrono::duration_cast(now - last).count()); + continue; + } + task = std::move(_tasks.front()); + _tasks.pop_front(); + task(); + + now = std::chrono::high_resolution_clock::now(); + elapsed = float(std::chrono::duration_cast(now - last).count()); + } + last = now; } }); @@ -139,6 +158,7 @@ public: void setFrameIntervalInMilliseconds(float frameIntervalInMilliseconds) { _frameIntervalInMilliseconds = frameIntervalInMilliseconds; + Log("Set _frameIntervalInMilliseconds to %f", _frameIntervalInMilliseconds); } template