rejig frame timings

This commit is contained in:
Nick Fisher
2024-03-09 11:22:12 +08:00
parent ed8bcd5794
commit f02cd5d611

View File

@@ -40,28 +40,7 @@ public:
_t = new std::thread([this]() { _t = new std::thread([this]() {
auto last = std::chrono::high_resolution_clock::now(); auto last = std::chrono::high_resolution_clock::now();
while (!_stop) { while (!_stop) {
last = std::chrono::high_resolution_clock::now();
auto now = std::chrono::high_resolution_clock::now();
float elapsed = float(std::chrono::duration_cast<std::chrono::milliseconds>(now - last).count());
while(elapsed < _frameIntervalInMilliseconds - 5) {
std::function<void()> task;
std::unique_lock<std::mutex> lock(_access);
if (_tasks.empty()) {
_cond.wait_for(lock, std::chrono::duration<float, std::milli>(1));
now = std::chrono::high_resolution_clock::now();
elapsed = float(std::chrono::duration_cast<std::chrono::milliseconds>(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<std::chrono::milliseconds>(now - last).count());
}
if (_rendering) { if (_rendering) {
// auto frameStart = std::chrono::high_resolution_clock::now(); // auto frameStart = std::chrono::high_resolution_clock::now();
@@ -69,26 +48,30 @@ public:
// auto frameEnd = std::chrono::high_resolution_clock::now(); // auto frameEnd = std::chrono::high_resolution_clock::now();
} }
elapsed = float(std::chrono::duration_cast<std::chrono::milliseconds>(now - last).count()); auto now = std::chrono::high_resolution_clock::now();
while(elapsed < _frameIntervalInMilliseconds) { float elapsed = float(std::chrono::duration_cast<std::chrono::milliseconds>(now - last).count());
std::function<void()> task;
std::unique_lock<std::mutex> lock(_access); std::function<void()> task;
if (_tasks.empty()) {
_cond.wait_for(lock, std::chrono::duration<float, std::milli>(1)); std::unique_lock<std::mutex> lock(_access);
now = std::chrono::high_resolution_clock::now();
elapsed = float(std::chrono::duration_cast<std::chrono::milliseconds>(now - last).count()); if(_tasks.empty()) {
continue; _cond.wait_for(lock, std::chrono::duration<float, std::milli>(1));
} continue;
}
while(!_tasks.empty()) {
task = std::move(_tasks.front()); task = std::move(_tasks.front());
_tasks.pop_front(); _tasks.pop_front();
task(); task();
now = std::chrono::high_resolution_clock::now();
elapsed = float(std::chrono::duration_cast<std::chrono::milliseconds>(now - last).count());
} }
last = now; now = std::chrono::high_resolution_clock::now();
elapsed = float(std::chrono::duration_cast<std::chrono::milliseconds>(now - last).count());
if(elapsed < _frameIntervalInMilliseconds) {
auto sleepFor = std::chrono::microseconds(int(_frameIntervalInMilliseconds - elapsed) * 1000);
std::this_thread::sleep_for(sleepFor);
}
} }
}); });
} }
@@ -503,12 +486,6 @@ FLUTTER_PLUGIN_EXPORT void set_post_processing_ffi(void *const viewer,
auto fut = _rl->add_task(lambda); auto fut = _rl->add_task(lambda);
} }
FLUTTER_PLUGIN_EXPORT void pick_ffi(void *const viewer, int x, int y,
EntityId *entityId) {
std::packaged_task<void()> lambda([=] { pick(viewer, x, y, entityId); });
auto fut = _rl->add_task(lambda);
}
FLUTTER_PLUGIN_EXPORT void FLUTTER_PLUGIN_EXPORT void
get_name_for_entity_ffi(void *const sceneManager, const EntityId entityId, void (*callback)(const char*)) { get_name_for_entity_ffi(void *const sceneManager, const EntityId entityId, void (*callback)(const char*)) {
std::packaged_task<const char *()> lambda( std::packaged_task<const char *()> lambda(