diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 23101f2ee..39f7a8545 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -865,11 +865,10 @@ ipv6_server (IPv6 server) bool false [**Advanced] # Maximum number of blocks that are simultaneously sent per client. +# The maximum total count is calculated dynamically: +# max_total = ceil((#clients + max_users) * per_client / 4) max_simultaneous_block_sends_per_client (Maximum simultaneous block sends per client) int 10 -# Maximum number of blocks that are simultaneously sent in total. -max_simultaneous_block_sends_server_total (Maximum simultaneous block sends total) int 40 - # To reduce lag, block transfers are slowed down when a player is building something. # This determines how long they are slowed down after placing or removing a node. full_block_send_enable_min_time_from_building (Delay in sending blocks after building) float 2.0 diff --git a/minetest.conf.example b/minetest.conf.example index e92cd82f2..10f64e859 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -1049,13 +1049,11 @@ ### Advanced # Maximum number of blocks that are simultaneously sent per client. +# The maximum total count is calculated dynamically: +# max_total = ceil((#clients + max_users) * per_client / 4) # type: int # max_simultaneous_block_sends_per_client = 10 -# Maximum number of blocks that are simultaneously sent in total. -# type: int -# max_simultaneous_block_sends_server_total = 40 - # To reduce lag, block transfers are slowed down when a player is building something. # This determines how long they are slowed down after placing or removing a node. # type: float diff --git a/src/clientiface.h b/src/clientiface.h index 4d61ae74e..4850b0c2a 100644 --- a/src/clientiface.h +++ b/src/clientiface.h @@ -272,10 +272,7 @@ public: */ void ResendBlockIfOnWire(v3s16 p); - s32 SendingCount() - { - return m_blocks_sending.size(); - } + u32 getSendingCount() const { return m_blocks_sending.size(); } // Increments timeouts and removes timed-out blocks from list // NOTE: This doesn't fix the server-not-sending-block bug diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 212bc6208..2ddd5a43b 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -298,7 +298,6 @@ void set_default_settings(Settings *settings) settings->setDefault("strict_protocol_version_checking", "false"); settings->setDefault("player_transfer_distance", "0"); settings->setDefault("max_simultaneous_block_sends_per_client", "10"); - settings->setDefault("max_simultaneous_block_sends_server_total", "40"); settings->setDefault("time_send_interval", "5"); settings->setDefault("default_game", "minetest"); diff --git a/src/server.cpp b/src/server.cpp index 7bae69d55..c5b7bbd79 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2181,7 +2181,7 @@ void Server::SendBlocks(float dtime) std::vector queue; - s32 total_sending = 0; + u32 total_sending = 0; { ScopeProfiler sp2(g_profiler, "Server: selecting blocks for sending"); @@ -2195,7 +2195,7 @@ void Server::SendBlocks(float dtime) if (!client) continue; - total_sending += client->SendingCount(); + total_sending += client->getSendingCount(); client->GetNextBlocks(m_env,m_emerge, dtime, queue); } m_clients.unlock(); @@ -2207,11 +2207,13 @@ void Server::SendBlocks(float dtime) std::sort(queue.begin(), queue.end()); m_clients.lock(); - s32 max_blocks_to_send = - g_settings->getS32("max_simultaneous_block_sends_server_total"); + + // Maximal total count calculation + // The per-client block sends is halved with the maximal online users + u32 max_blocks_to_send = (m_env->getPlayerCount() + g_settings->getU32("max_users")) * + g_settings->getU32("max_simultaneous_block_sends_per_client") / 4 + 1; for (const PrioritySortedBlockTransfer &block_to_send : queue) { - //TODO: Calculate limit dynamically if (total_sending >= max_blocks_to_send) break; diff --git a/src/serverenvironment.h b/src/serverenvironment.h index 9d84d7a48..0eabfc08f 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -342,6 +342,7 @@ public: RemotePlayer *getPlayer(const u16 peer_id); RemotePlayer *getPlayer(const char* name); + u32 getPlayerCount() const { return m_players.size(); } static bool migratePlayersDatabase(const GameParams &game_params, const Settings &cmd_args);