mirror of
https://github.com/minetest/minetest.git
synced 2025-02-17 10:23:47 +01:00
Avoid resending near blocks unnecessarily.
This commit is contained in:
@ -138,26 +138,6 @@ void RemoteClient::GetNextBlocks (
|
|||||||
camera_dir.rotateYZBy(sao->getLookPitch());
|
camera_dir.rotateYZBy(sao->getLookPitch());
|
||||||
camera_dir.rotateXZBy(sao->getRotation().Y);
|
camera_dir.rotateXZBy(sao->getRotation().Y);
|
||||||
|
|
||||||
/*infostream<<"camera_dir=("<<camera_dir.X<<","<<camera_dir.Y<<","
|
|
||||||
<<camera_dir.Z<<")"<<std::endl;*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Get the starting value of the block finder radius.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (m_last_center != center) {
|
|
||||||
m_nearest_unsent_d = 0;
|
|
||||||
m_last_center = center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*infostream<<"m_nearest_unsent_reset_timer="
|
|
||||||
<<m_nearest_unsent_reset_timer<<std::endl;*/
|
|
||||||
|
|
||||||
//s16 last_nearest_unsent_d = m_nearest_unsent_d;
|
|
||||||
s16 d_start = m_nearest_unsent_d;
|
|
||||||
|
|
||||||
//infostream<<"d_start="<<d_start<<std::endl;
|
|
||||||
|
|
||||||
u16 max_simul_sends_usually = m_max_simul_sends;
|
u16 max_simul_sends_usually = m_max_simul_sends;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -189,6 +169,29 @@ 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();
|
||||||
|
|
||||||
|
/*
|
||||||
|
Get the starting value of the block finder radius.
|
||||||
|
*/
|
||||||
|
if (m_last_center != center) {
|
||||||
|
m_nearest_unsent_d = 0;
|
||||||
|
m_last_center = center;
|
||||||
|
}
|
||||||
|
// reset the unsent distance if the view angle has changed more that 10% of the fov
|
||||||
|
// (this matches isBlockInSight which allows for an extra 10%)
|
||||||
|
if (camera_dir.dotProduct(m_last_camera_dir) < std::cos(camera_fov * 0.1f)) {
|
||||||
|
m_nearest_unsent_d = 0;
|
||||||
|
m_last_camera_dir = camera_dir;
|
||||||
|
}
|
||||||
|
if (m_nearest_unsent_d > 0) {
|
||||||
|
// make sure any blocks modified since the last time we sent blocks are resent
|
||||||
|
for (const v3s16 &p : m_blocks_modified) {
|
||||||
|
m_nearest_unsent_d = std::min(m_nearest_unsent_d, center.getDistanceFrom(p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_blocks_modified.clear();
|
||||||
|
|
||||||
|
s16 d_start = m_nearest_unsent_d;
|
||||||
|
|
||||||
// Distrust client-sent FOV and get server-set player object property
|
// Distrust client-sent FOV and get server-set player object property
|
||||||
// zoom FOV (degrees) as a check to avoid hacked clients using FOV to load
|
// zoom FOV (degrees) as a check to avoid hacked clients using FOV to load
|
||||||
// distant world.
|
// distant world.
|
||||||
@ -393,21 +396,18 @@ queue_full_break:
|
|||||||
|
|
||||||
void RemoteClient::GotBlock(v3s16 p)
|
void RemoteClient::GotBlock(v3s16 p)
|
||||||
{
|
{
|
||||||
if (m_blocks_modified.find(p) == m_blocks_modified.end()) {
|
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);
|
// only add to sent blocks if it actually was sending
|
||||||
else
|
// (it might have been modified since)
|
||||||
m_excess_gotblocks++;
|
|
||||||
|
|
||||||
m_blocks_sent.insert(p);
|
m_blocks_sent.insert(p);
|
||||||
|
} else {
|
||||||
|
m_excess_gotblocks++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoteClient::SentBlock(v3s16 p)
|
void RemoteClient::SentBlock(v3s16 p)
|
||||||
{
|
{
|
||||||
if (m_blocks_modified.find(p) != m_blocks_modified.end())
|
|
||||||
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.0f;
|
m_blocks_sending[p] = 0.0f;
|
||||||
else
|
else
|
||||||
@ -417,29 +417,24 @@ void RemoteClient::SentBlock(v3s16 p)
|
|||||||
|
|
||||||
void RemoteClient::SetBlockNotSent(v3s16 p)
|
void RemoteClient::SetBlockNotSent(v3s16 p)
|
||||||
{
|
{
|
||||||
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())
|
// remove the block from sending and sent sets,
|
||||||
m_blocks_sending.erase(p);
|
// and mark as modified if found
|
||||||
if (m_blocks_sent.find(p) != m_blocks_sent.end())
|
if (m_blocks_sending.erase(p) + m_blocks_sent.erase(p) > 0)
|
||||||
m_blocks_sent.erase(p);
|
m_blocks_modified.insert(p);
|
||||||
m_blocks_modified.insert(p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoteClient::SetBlocksNotSent(std::map<v3s16, MapBlock*> &blocks)
|
void RemoteClient::SetBlocksNotSent(std::map<v3s16, MapBlock*> &blocks)
|
||||||
{
|
{
|
||||||
m_nearest_unsent_d = 0;
|
|
||||||
m_nothing_to_send_pause_timer = 0;
|
m_nothing_to_send_pause_timer = 0;
|
||||||
|
|
||||||
for (auto &block : blocks) {
|
for (auto &block : blocks) {
|
||||||
v3s16 p = block.first;
|
v3s16 p = block.first;
|
||||||
m_blocks_modified.insert(p);
|
// remove the block from sending and sent sets,
|
||||||
|
// and mark as modified if found
|
||||||
if (m_blocks_sending.find(p) != m_blocks_sending.end())
|
if (m_blocks_sending.erase(p) + m_blocks_sent.erase(p) > 0)
|
||||||
m_blocks_sending.erase(p);
|
m_blocks_modified.insert(p);
|
||||||
if (m_blocks_sent.find(p) != m_blocks_sent.end())
|
|
||||||
m_blocks_sent.erase(p);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -364,6 +364,7 @@ private:
|
|||||||
std::set<v3s16> m_blocks_sent;
|
std::set<v3s16> m_blocks_sent;
|
||||||
s16 m_nearest_unsent_d = 0;
|
s16 m_nearest_unsent_d = 0;
|
||||||
v3s16 m_last_center;
|
v3s16 m_last_center;
|
||||||
|
v3f m_last_camera_dir;
|
||||||
|
|
||||||
const u16 m_max_simul_sends;
|
const u16 m_max_simul_sends;
|
||||||
const float m_min_time_from_building;
|
const float m_min_time_from_building;
|
||||||
@ -383,10 +384,10 @@ private:
|
|||||||
std::map<v3s16, float> m_blocks_sending;
|
std::map<v3s16, float> m_blocks_sending;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Blocks that have been modified since last sending them.
|
Blocks that have been modified since blocks were
|
||||||
These blocks will not be marked as sent, even if the
|
sent to the client last (getNextBlocks()).
|
||||||
client reports it has received them to account for blocks
|
This is used to reset the unsent distance, so that
|
||||||
that are being modified while on the line.
|
modified blocks are resent to the client.
|
||||||
|
|
||||||
List of block positions.
|
List of block positions.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user