diff --git a/src/client/client.cpp b/src/client/client.cpp index 78e077fc3..4dc05dc09 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -475,6 +475,7 @@ void Client::step(float dtime) */ { int num_processed_meshes = 0; + std::vector blocks_to_ack; while (!m_mesh_update_thread.m_queue_out.empty()) { num_processed_meshes++; @@ -513,14 +514,18 @@ void Client::step(float dtime) m_minimap->addBlock(r.p, minimap_mapblock); if (r.ack_block_to_server) { - /* - Acknowledge block - [0] u8 count - [1] v3s16 pos_0 - */ - sendGotBlocks(r.p); + if (blocks_to_ack.size() == 255) { + sendGotBlocks(blocks_to_ack); + blocks_to_ack.clear(); + } + + blocks_to_ack.emplace_back(r.p); } } + if (blocks_to_ack.size() > 0) { + // Acknowledge block(s) + sendGotBlocks(blocks_to_ack); + } if (num_processed_meshes > 0) g_profiler->graphAdd("num_processed_meshes", num_processed_meshes); @@ -1069,10 +1074,13 @@ void Client::sendDeletedBlocks(std::vector &blocks) Send(&pkt); } -void Client::sendGotBlocks(v3s16 block) +void Client::sendGotBlocks(const std::vector &blocks) { - NetworkPacket pkt(TOSERVER_GOTBLOCKS, 1 + 6); - pkt << (u8) 1 << block; + NetworkPacket pkt(TOSERVER_GOTBLOCKS, 1 + 6 * blocks.size()); + pkt << (u8) blocks.size(); + for (const v3s16 &block : blocks) + pkt << block; + Send(&pkt); } diff --git a/src/client/client.h b/src/client/client.h index 312b8c87f..527ae6524 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -465,7 +465,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef void promptConfirmRegistration(AuthMechanism chosen_auth_mechanism); void startAuth(AuthMechanism chosen_auth_mechanism); void sendDeletedBlocks(std::vector &blocks); - void sendGotBlocks(v3s16 block); + void sendGotBlocks(const std::vector &blocks); void sendRemovedSounds(std::vector &soundList); // Helper function