From 1d574e5e8fe3f08d13f1b8c4444fc4cb02cf0faf Mon Sep 17 00:00:00 2001 From: Mel Date: Thu, 3 Aug 2023 02:29:44 +0200 Subject: World can now reassess chunk generation priorities on player movement and cancel no longer needed jobs --- src/Compute/Queue.hpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/Compute') diff --git a/src/Compute/Queue.hpp b/src/Compute/Queue.hpp index e201932..799df73 100644 --- a/src/Compute/Queue.hpp +++ b/src/Compute/Queue.hpp @@ -46,6 +46,37 @@ public: return done_results; } + struct Reassession { + enum { Keep, Reassess, Cancel } type; + Real new_priority = 0; + }; + + template + void reassess(F assess) { + decltype(m_control->work.jobs) new_jobs{}; + + std::scoped_lock work_lock(m_control->work.mutex); + while (!m_control->work.jobs.empty()) { // I don't like std::priority_queue :( + Job job = m_control->work.jobs.top(); + m_control->work.jobs.pop(); + + Reassession reassession = assess(job.id); + + switch (reassession.type) { + case Reassession::Keep: + new_jobs.push(job); + break; + case Reassession::Reassess: + new_jobs.emplace(job.id, reassession.new_priority, job.execute); + break; + default: + break; + } + } + + m_control->work.jobs = std::move(new_jobs); + } + private: struct Job { Job() = default; -- cgit 1.4.1