diff options
| author | Mel <einebeere@gmail.com> | 2023-08-03 02:29:44 +0200 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2023-08-03 02:31:12 +0200 |
| commit | 1d574e5e8fe3f08d13f1b8c4444fc4cb02cf0faf (patch) | |
| tree | d151baab68d6aa444a5968a1b579c5d48025084e /src/Compute/Queue.hpp | |
| parent | 15352db7bc03a176ea7a184f40a7f4e72b54b5fe (diff) | |
| download | meowcraft-1d574e5e8fe3f08d13f1b8c4444fc4cb02cf0faf.tar.zst meowcraft-1d574e5e8fe3f08d13f1b8c4444fc4cb02cf0faf.zip | |
World can now reassess chunk generation priorities on player movement and cancel no longer needed jobs
Diffstat (limited to 'src/Compute/Queue.hpp')
| -rw-r--r-- | src/Compute/Queue.hpp | 31 |
1 files changed, 31 insertions, 0 deletions
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 <typename F> + 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; |
