From fbb6fe2fa6597d611bcd9c52ea4451a7907f3097 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Fri, 26 Jun 2026 11:32:52 +0800 Subject: [PATCH] feat(client): add center-based chunk loading priority --- include/Cubed/gameplay/client_world.hpp | 3 +++ include/Cubed/gameplay/server_world.hpp | 2 +- src/gameplay/client_world.cpp | 26 +++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/include/Cubed/gameplay/client_world.hpp b/include/Cubed/gameplay/client_world.hpp index d78958a..7e2b52a 100644 --- a/include/Cubed/gameplay/client_world.hpp +++ b/include/Cubed/gameplay/client_world.hpp @@ -53,9 +53,11 @@ public: } private: + enum class ChunkLoadStyle { RANDOM, CENTER }; using ChunkHashMap = tbb::concurrent_unordered_map; using ChunkPosSet = std::unordered_set; + using ChunkPosVector = std::vector; ClientPlayer m_player; ChunkHashMap m_chunks; std::vector m_planes; @@ -79,6 +81,7 @@ private: std::atomic m_day_tick{6000}; std::atomic m_requesting_chunk{false}; std::shared_ptr m_client; + ChunkLoadStyle m_chunk_load_style{ChunkLoadStyle::CENTER}; void client_run(std::stop_token token); void set_player_pos(); diff --git a/include/Cubed/gameplay/server_world.hpp b/include/Cubed/gameplay/server_world.hpp index 2387600..56b436a 100644 --- a/include/Cubed/gameplay/server_world.hpp +++ b/include/Cubed/gameplay/server_world.hpp @@ -131,7 +131,7 @@ private: std::atomic> m_gen_thread_pool; - std::atomic m_chunk_load_style{ChunkLoadStyle::RANDOM}; + std::atomic m_chunk_load_style{ChunkLoadStyle::CENTER}; PlayerUUIDMap m_uuid_to_name; tbb::concurrent_unordered_map m_timers; diff --git a/src/gameplay/client_world.cpp b/src/gameplay/client_world.cpp index 094d43f..abcaff2 100644 --- a/src/gameplay/client_world.cpp +++ b/src/gameplay/client_world.cpp @@ -301,7 +301,7 @@ void ClientWorld::request_chunk() { } } - ChunkPosSet need_send_pos; + ChunkPosVector need_send_pos; { std::lock_guard lk(m_chunks_mutex); for (auto it = m_chunks.begin(); it != m_chunks.end();) { @@ -315,13 +315,35 @@ void ClientWorld::request_chunk() { for (auto pos : required_chunks) { auto it = m_chunks.find(pos); if (it == m_chunks.end()) { - need_send_pos.emplace(pos); + need_send_pos.emplace_back(pos); } } } if (need_send_pos.empty()) { return; } + using enum ChunkLoadStyle; + switch (m_chunk_load_style) { + case RANDOM: + + break; + case CENTER: { + + glm::vec3 player_pos = m_player.get_player_pos(); + auto dist2 = [player_pos](ChunkPos chunk_pos) { + ChunkPos player_chunk_pos = + get_chunk_pos(player_pos.x, player_pos.z); + float dx = player_chunk_pos.x - chunk_pos.x; + float dz = player_chunk_pos.z - chunk_pos.z; + return dx * dx + dz * dz; + }; + + std::sort(need_send_pos.begin(), need_send_pos.end(), + [&dist2](const auto& a, const auto& b) { + return dist2(a) < dist2(b); + }); + } + } auto uuid = m_player.get_uuid(); ChunkDataReq req; for (const auto& pos : need_send_pos) {