Cache server config settings. (#6530)

* Cache server config settings.
This commit is contained in:
lhofhansl 2017-10-15 00:32:17 -07:00 committed by Loïc Blot
parent 9f3a585937
commit 6bab695479
2 changed files with 55 additions and 52 deletions

View File

@ -52,6 +52,17 @@ std::string ClientInterface::state2Name(ClientState state)
return statenames[state]; return statenames[state];
} }
RemoteClient::RemoteClient() :
m_max_simul_sends(g_settings->getU16("max_simultaneous_block_sends_per_client")),
m_min_time_from_building(
g_settings->getFloat("full_block_send_enable_min_time_from_building")),
m_max_send_distance(g_settings->getS16("max_block_send_distance")),
m_block_optimize_distance(g_settings->getS16("block_send_optimize_distance")),
m_max_gen_distance(g_settings->getS16("max_block_generate_distance")),
m_occ_cull(g_settings->getBool("server_side_occlusion_culling"))
{
}
void RemoteClient::ResendBlockIfOnWire(v3s16 p) void RemoteClient::ResendBlockIfOnWire(v3s16 p)
{ {
// if this block is on wire, mark it for sending again as soon as possible // if this block is on wire, mark it for sending again as soon as possible
@ -88,7 +99,7 @@ void RemoteClient::GetNextBlocks (
m_nothing_to_send_pause_timer -= dtime; m_nothing_to_send_pause_timer -= dtime;
m_nearest_unsent_reset_timer += dtime; m_nearest_unsent_reset_timer += dtime;
if(m_nothing_to_send_pause_timer >= 0) if (m_nothing_to_send_pause_timer >= 0)
return; return;
RemotePlayer *player = env->getPlayer(peer_id); RemotePlayer *player = env->getPlayer(peer_id);
@ -101,9 +112,7 @@ void RemoteClient::GetNextBlocks (
return; return;
// Won't send anything if already sending // Won't send anything if already sending
if(m_blocks_sending.size() >= g_settings->getU16 if (m_blocks_sending.size() >= m_max_simul_sends) {
("max_simultaneous_block_sends_per_client"))
{
//infostream<<"Not sending any blocks, Queue full."<<std::endl; //infostream<<"Not sending any blocks, Queue full."<<std::endl;
return; return;
} }
@ -113,7 +122,7 @@ void RemoteClient::GetNextBlocks (
LuaEntitySAO *lsao = getAttachedObject(sao, env); LuaEntitySAO *lsao = getAttachedObject(sao, env);
const v3f &playerspeed = lsao? lsao->getVelocity() : player->getSpeed(); const v3f &playerspeed = lsao? lsao->getVelocity() : player->getSpeed();
v3f playerspeeddir(0,0,0); v3f playerspeeddir(0,0,0);
if(playerspeed.getLength() > 1.0*BS) if (playerspeed.getLength() > 1.0f * BS)
playerspeeddir = playerspeed / playerspeed.getLength(); playerspeeddir = playerspeed / playerspeed.getLength();
// Predict to next block // Predict to next block
v3f playerpos_predicted = playerpos + playerspeeddir*MAP_BLOCKSIZE*BS; v3f playerpos_predicted = playerpos + playerspeeddir*MAP_BLOCKSIZE*BS;
@ -135,8 +144,7 @@ void RemoteClient::GetNextBlocks (
Get the starting value of the block finder radius. Get the starting value of the block finder radius.
*/ */
if(m_last_center != center) if (m_last_center != center) {
{
m_nearest_unsent_d = 0; m_nearest_unsent_d = 0;
m_last_center = center; m_last_center = center;
} }
@ -145,9 +153,8 @@ void RemoteClient::GetNextBlocks (
<<m_nearest_unsent_reset_timer<<std::endl;*/ <<m_nearest_unsent_reset_timer<<std::endl;*/
// Reset periodically to workaround for some bugs or stuff // Reset periodically to workaround for some bugs or stuff
if(m_nearest_unsent_reset_timer > 20.0) if (m_nearest_unsent_reset_timer > 20.0f) {
{ m_nearest_unsent_reset_timer = 0.0f;
m_nearest_unsent_reset_timer = 0;
m_nearest_unsent_d = 0; m_nearest_unsent_d = 0;
//infostream<<"Resetting m_nearest_unsent_d for " //infostream<<"Resetting m_nearest_unsent_d for "
// <<server->getPlayerName(peer_id)<<std::endl; // <<server->getPlayerName(peer_id)<<std::endl;
@ -158,9 +165,7 @@ void RemoteClient::GetNextBlocks (
//infostream<<"d_start="<<d_start<<std::endl; //infostream<<"d_start="<<d_start<<std::endl;
u16 max_simul_sends_setting = g_settings->getU16 u16 max_simul_sends_usually = m_max_simul_sends;
("max_simultaneous_block_sends_per_client");
u16 max_simul_sends_usually = max_simul_sends_setting;
/* /*
Check the time from last addNode/removeNode. Check the time from last addNode/removeNode.
@ -168,9 +173,7 @@ void RemoteClient::GetNextBlocks (
Decrease send rate if player is building stuff. Decrease send rate if player is building stuff.
*/ */
m_time_from_building += dtime; m_time_from_building += dtime;
if(m_time_from_building < g_settings->getFloat( if (m_time_from_building < m_min_time_from_building) {
"full_block_send_enable_min_time_from_building"))
{
max_simul_sends_usually max_simul_sends_usually
= LIMITED_MAX_SIMULTANEOUS_BLOCK_SENDS; = LIMITED_MAX_SIMULTANEOUS_BLOCK_SENDS;
} }
@ -193,17 +196,17 @@ void RemoteClient::GetNextBlocks (
s16 wanted_range = sao->getWantedRange() + 1; s16 wanted_range = sao->getWantedRange() + 1;
float camera_fov = sao->getFov(); float camera_fov = sao->getFov();
const s16 full_d_max = MYMIN(g_settings->getS16("max_block_send_distance"), wanted_range); const s16 full_d_max = std::min(m_max_send_distance, wanted_range);
const s16 d_opt = MYMIN(g_settings->getS16("block_send_optimize_distance"), wanted_range); const s16 d_opt = std::min(m_block_optimize_distance, wanted_range);
const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE; const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE;
//infostream << "Fov from client " << camera_fov << " full_d_max " << full_d_max << std::endl; //infostream << "Fov from client " << camera_fov << " full_d_max " << full_d_max << std::endl;
s16 d_max = full_d_max; s16 d_max = full_d_max;
s16 d_max_gen = MYMIN(g_settings->getS16("max_block_generate_distance"), wanted_range); s16 d_max_gen = std::min(m_max_gen_distance, wanted_range);
// Don't loop very much at a time // Don't loop very much at a time
s16 max_d_increment_at_time = 1; s16 max_d_increment_at_time = 1;
if(d_max > d_start + max_d_increment_at_time) if (d_max > d_start + max_d_increment_at_time)
d_max = d_start + max_d_increment_at_time; d_max = d_start + max_d_increment_at_time;
s32 nearest_emerged_d = -1; s32 nearest_emerged_d = -1;
@ -212,10 +215,9 @@ void RemoteClient::GetNextBlocks (
//bool queue_is_full = false; //bool queue_is_full = false;
const v3s16 cam_pos_nodes = floatToInt(camera_pos, BS); const v3s16 cam_pos_nodes = floatToInt(camera_pos, BS);
const bool occ_cull = g_settings->getBool("server_side_occlusion_culling");
s16 d; s16 d;
for(d = d_start; d <= d_max; d++) { for (d = d_start; d <= d_max; d++) {
/* /*
Get the border/face dot coordinates of a "d-radiused" Get the border/face dot coordinates of a "d-radiused"
box box
@ -223,7 +225,7 @@ void RemoteClient::GetNextBlocks (
std::vector<v3s16> list = FacePositionCache::getFacePositions(d); std::vector<v3s16> list = FacePositionCache::getFacePositions(d);
std::vector<v3s16>::iterator li; std::vector<v3s16>::iterator li;
for(li = list.begin(); li != list.end(); ++li) { for (li = list.begin(); li != list.end(); ++li) {
v3s16 p = *li + center; v3s16 p = *li + center;
/* /*
@ -238,8 +240,8 @@ void RemoteClient::GetNextBlocks (
u16 max_simul_dynamic = max_simul_sends_usually; u16 max_simul_dynamic = max_simul_sends_usually;
// If block is very close, allow full maximum // If block is very close, allow full maximum
if(d <= BLOCK_SEND_DISABLE_LIMITS_MAX_D) if (d <= BLOCK_SEND_DISABLE_LIMITS_MAX_D)
max_simul_dynamic = max_simul_sends_setting; max_simul_dynamic = m_max_simul_sends;
// Don't select too many blocks for sending // Don't select too many blocks for sending
if (num_blocks_selected >= max_simul_dynamic) { if (num_blocks_selected >= max_simul_dynamic) {
@ -280,12 +282,8 @@ void RemoteClient::GetNextBlocks (
/* /*
Don't send already sent blocks Don't send already sent blocks
*/ */
{ if (m_blocks_sent.find(p) != m_blocks_sent.end())
if(m_blocks_sent.find(p) != m_blocks_sent.end()) continue;
{
continue;
}
}
/* /*
Check if map has this block Check if map has this block
@ -319,7 +317,7 @@ void RemoteClient::GetNextBlocks (
continue; continue;
} }
if (occ_cull && !block_is_invalid && if (m_occ_cull && !block_is_invalid &&
env->getMap().isBlockOccluded(block, cam_pos_nodes)) { env->getMap().isBlockOccluded(block, cam_pos_nodes)) {
continue; continue;
} }
@ -337,8 +335,7 @@ void RemoteClient::GetNextBlocks (
/* /*
Add inexistent block to emerge queue. Add inexistent block to emerge queue.
*/ */
if(block == NULL || surely_not_found_on_disk || block_is_invalid) if (block == NULL || surely_not_found_on_disk || block_is_invalid) {
{
if (emerge->enqueueBlockEmerge(peer_id, p, generate)) { if (emerge->enqueueBlockEmerge(peer_id, p, generate)) {
if (nearest_emerged_d == -1) if (nearest_emerged_d == -1)
nearest_emerged_d = d; nearest_emerged_d = d;
@ -352,7 +349,7 @@ void RemoteClient::GetNextBlocks (
continue; continue;
} }
if(nearest_sent_d == -1) if (nearest_sent_d == -1)
nearest_sent_d = d; nearest_sent_d = d;
/* /*
@ -369,23 +366,23 @@ queue_full_break:
// If nothing was found for sending and nothing was queued for // If nothing was found for sending and nothing was queued for
// emerging, continue next time browsing from here // emerging, continue next time browsing from here
if(nearest_emerged_d != -1){ if (nearest_emerged_d != -1) {
new_nearest_unsent_d = nearest_emerged_d; new_nearest_unsent_d = nearest_emerged_d;
} else if(nearest_emergefull_d != -1){ } else if (nearest_emergefull_d != -1) {
new_nearest_unsent_d = nearest_emergefull_d; new_nearest_unsent_d = nearest_emergefull_d;
} else { } else {
if(d > full_d_max){ if (d > full_d_max) {
new_nearest_unsent_d = 0; new_nearest_unsent_d = 0;
m_nothing_to_send_pause_timer = 2.0; m_nothing_to_send_pause_timer = 2.0f;
} else { } else {
if(nearest_sent_d != -1) if (nearest_sent_d != -1)
new_nearest_unsent_d = nearest_sent_d; new_nearest_unsent_d = nearest_sent_d;
else else
new_nearest_unsent_d = d; new_nearest_unsent_d = d;
} }
} }
if(new_nearest_unsent_d != -1) if (new_nearest_unsent_d != -1)
m_nearest_unsent_d = new_nearest_unsent_d; m_nearest_unsent_d = new_nearest_unsent_d;
} }
@ -406,8 +403,8 @@ void RemoteClient::SentBlock(v3s16 p)
if (m_blocks_modified.find(p) != m_blocks_modified.end()) if (m_blocks_modified.find(p) != m_blocks_modified.end())
m_blocks_modified.erase(p); m_blocks_modified.erase(p);
if(m_blocks_sending.find(p) == m_blocks_sending.end()) if (m_blocks_sending.find(p) == m_blocks_sending.end())
m_blocks_sending[p] = 0.0; m_blocks_sending[p] = 0.0f;
else else
infostream<<"RemoteClient::SentBlock(): Sent block" infostream<<"RemoteClient::SentBlock(): Sent block"
" already in m_blocks_sending"<<std::endl; " already in m_blocks_sending"<<std::endl;
@ -418,9 +415,9 @@ void RemoteClient::SetBlockNotSent(v3s16 p)
m_nearest_unsent_d = 0; m_nearest_unsent_d = 0;
m_nothing_to_send_pause_timer = 0; m_nothing_to_send_pause_timer = 0;
if(m_blocks_sending.find(p) != m_blocks_sending.end()) if (m_blocks_sending.find(p) != m_blocks_sending.end())
m_blocks_sending.erase(p); m_blocks_sending.erase(p);
if(m_blocks_sent.find(p) != m_blocks_sent.end()) if (m_blocks_sent.find(p) != m_blocks_sent.end())
m_blocks_sent.erase(p); m_blocks_sent.erase(p);
m_blocks_modified.insert(p); m_blocks_modified.insert(p);
} }
@ -434,9 +431,9 @@ void RemoteClient::SetBlocksNotSent(std::map<v3s16, MapBlock*> &blocks)
v3s16 p = block.first; v3s16 p = block.first;
m_blocks_modified.insert(p); m_blocks_modified.insert(p);
if(m_blocks_sending.find(p) != m_blocks_sending.end()) if (m_blocks_sending.find(p) != m_blocks_sending.end())
m_blocks_sending.erase(p); m_blocks_sending.erase(p);
if(m_blocks_sent.find(p) != m_blocks_sent.end()) if (m_blocks_sent.find(p) != m_blocks_sent.end())
m_blocks_sent.erase(p); m_blocks_sent.erase(p);
} }
} }
@ -610,7 +607,7 @@ ClientInterface::ClientInterface(const std::shared_ptr<con::Connection> & con)
: :
m_con(con), m_con(con),
m_env(NULL), m_env(NULL),
m_print_info_timer(0.0) m_print_info_timer(0.0f)
{ {
} }
@ -655,9 +652,8 @@ bool ClientInterface::isUserLimitReached()
void ClientInterface::step(float dtime) void ClientInterface::step(float dtime)
{ {
m_print_info_timer += dtime; m_print_info_timer += dtime;
if(m_print_info_timer >= 30.0) if (m_print_info_timer >= 30.0f) {
{ m_print_info_timer = 0.0f;
m_print_info_timer = 0.0;
UpdatePlayerList(); UpdatePlayerList();
} }
} }

View File

@ -246,7 +246,7 @@ public:
bool isMechAllowed(AuthMechanism mech) bool isMechAllowed(AuthMechanism mech)
{ return allowed_auth_mechs & mech; } { return allowed_auth_mechs & mech; }
RemoteClient() = default; RemoteClient();
~RemoteClient() = default; ~RemoteClient() = default;
/* /*
@ -354,6 +354,13 @@ private:
v3s16 m_last_center; v3s16 m_last_center;
float m_nearest_unsent_reset_timer = 0.0f; float m_nearest_unsent_reset_timer = 0.0f;
const u16 m_max_simul_sends;
const float m_min_time_from_building;
const s16 m_max_send_distance;
const s16 m_block_optimize_distance;
const s16 m_max_gen_distance;
const bool m_occ_cull;
/* /*
Blocks that are currently on the line. Blocks that are currently on the line.
This is used for throttling the sending of blocks. This is used for throttling the sending of blocks.