From 65429b22d67a5197900e52630e47012b90869d5e Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Sat, 27 Jun 2026 13:47:06 +0800 Subject: [PATCH] feat(tools): add RecentQueue to replace std::deque in server_world --- include/Cubed/gameplay/server_world.hpp | 3 +- include/Cubed/tools/recent_queue.hpp | 55 +++++++++++++++++++++++++ src/gameplay/server_world.cpp | 4 +- 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 include/Cubed/tools/recent_queue.hpp diff --git a/include/Cubed/gameplay/server_world.hpp b/include/Cubed/gameplay/server_world.hpp index d67f74e..b561fa0 100644 --- a/include/Cubed/gameplay/server_world.hpp +++ b/include/Cubed/gameplay/server_world.hpp @@ -6,6 +6,7 @@ #include "Cubed/gameplay/river_worm.hpp" #include "Cubed/gameplay/server_chunk.hpp" #include "Cubed/gameplay/server_player.hpp" +#include "Cubed/tools/recent_queue.hpp" #include "Cubed/tools/thread_pool.hpp" #include "world/block_change.pb.h" @@ -128,7 +129,7 @@ private: std::mutex m_need_gen_queue_mutex; std::condition_variable_any m_gen_cv; - std::deque m_need_gen_queue; + RecentQueue m_need_gen_queue; std::atomic> m_gen_thread_pool; diff --git a/include/Cubed/tools/recent_queue.hpp b/include/Cubed/tools/recent_queue.hpp new file mode 100644 index 0000000..cb0f795 --- /dev/null +++ b/include/Cubed/tools/recent_queue.hpp @@ -0,0 +1,55 @@ +#pragma once +#include +#include +namespace Cubed { +template class RecentQueue { +private: + std::list m_list; + std::unordered_map::iterator> m_map; + +public: + void enqueue(T key) { + auto it = m_map.find(key); + if (it != m_map.end()) { + m_list.splice(m_list.end(), m_list, it->second); + return; + } + m_list.emplace_back(std::move(key)); + auto iter = std::prev(m_list.end()); + m_map.emplace(*iter, iter); + } + + void pop() { + if (m_list.empty()) { + return; + } + m_map.erase(m_list.front()); + m_list.pop_front(); + } + void clear() { + m_list.clear(); + m_map.clear(); + } + + const T& front() const { + assert(!empty()); + return m_list.front(); + } + const T& back() const { + assert(!empty()); + return m_list.back(); + } + [[nodiscard]] + bool empty() const { + return m_list.empty(); + } + [[nodiscard]] + size_t size() const { + return m_list.size(); + } + [[nodiscard]] + bool contains(const T& key) const { + return m_map.find(key) != m_map.end(); + } +}; +} // namespace Cubed \ No newline at end of file diff --git a/src/gameplay/server_world.cpp b/src/gameplay/server_world.cpp index 3da56ed..37f6c59 100644 --- a/src/gameplay/server_world.cpp +++ b/src/gameplay/server_world.cpp @@ -249,7 +249,7 @@ void ServerWorld::start_gen_thread() { std::optional uuid{std::nullopt}; if (!m_need_gen_queue.empty()) { uuid = m_need_gen_queue.front(); - m_need_gen_queue.pop_front(); + m_need_gen_queue.pop(); } lk.unlock(); gen_chunks_internal(uuid); @@ -327,7 +327,7 @@ void ServerWorld::need_gen(std::optional uuid) { if (uuid) { std::lock_guard lock(m_need_gen_queue_mutex); - m_need_gen_queue.push_back(*uuid); + m_need_gen_queue.enqueue(*uuid); } // m_gen_player_pos = get_player("TestPlayer").get_player_pos();