Server::AsyncRunStep: buffered_messages now uses std::vector instead of std::list. * sendRemoveNode and sendAddNodes are also converted as a side effect

This commit is contained in:
Loic Blot 2015-03-05 11:18:17 +01:00
parent 36e8ba9ce2
commit 82482ecd9d
2 changed files with 56 additions and 79 deletions

@ -788,25 +788,22 @@ void Server::AsyncRunStep(bool initial_step)
// Key = object id // Key = object id
// Value = data sent by object // Value = data sent by object
std::map<u16, std::list<ActiveObjectMessage>* > buffered_messages; std::map<u16, std::vector<ActiveObjectMessage>* > buffered_messages;
// Get active object messages from environment // Get active object messages from environment
for(;;) for(;;) {
{
ActiveObjectMessage aom = m_env->getActiveObjectMessage(); ActiveObjectMessage aom = m_env->getActiveObjectMessage();
if(aom.id == 0) if (aom.id == 0)
break; break;
std::list<ActiveObjectMessage>* message_list = NULL; std::vector<ActiveObjectMessage>* message_list = NULL;
std::map<u16, std::list<ActiveObjectMessage>* >::iterator n; std::map<u16, std::vector<ActiveObjectMessage>* >::iterator n;
n = buffered_messages.find(aom.id); n = buffered_messages.find(aom.id);
if(n == buffered_messages.end()) if (n == buffered_messages.end()) {
{ message_list = new std::vector<ActiveObjectMessage>;
message_list = new std::list<ActiveObjectMessage>;
buffered_messages[aom.id] = message_list; buffered_messages[aom.id] = message_list;
} }
else else {
{
message_list = n->second; message_list = n->second;
} }
message_list->push_back(aom); message_list->push_back(aom);
@ -815,28 +812,26 @@ void Server::AsyncRunStep(bool initial_step)
m_clients.Lock(); m_clients.Lock();
std::map<u16, RemoteClient*> clients = m_clients.getClientList(); std::map<u16, RemoteClient*> clients = m_clients.getClientList();
// Route data to every client // Route data to every client
for(std::map<u16, RemoteClient*>::iterator for (std::map<u16, RemoteClient*>::iterator
i = clients.begin(); i = clients.begin();
i != clients.end(); ++i) i != clients.end(); ++i) {
{
RemoteClient *client = i->second; RemoteClient *client = i->second;
std::string reliable_data; std::string reliable_data;
std::string unreliable_data; std::string unreliable_data;
// Go through all objects in message buffer // Go through all objects in message buffer
for(std::map<u16, std::list<ActiveObjectMessage>* >::iterator for (std::map<u16, std::vector<ActiveObjectMessage>* >::iterator
j = buffered_messages.begin(); j = buffered_messages.begin();
j != buffered_messages.end(); ++j) j != buffered_messages.end(); ++j) {
{
// If object is not known by client, skip it // If object is not known by client, skip it
u16 id = j->first; u16 id = j->first;
if(client->m_known_objects.find(id) == client->m_known_objects.end()) if (client->m_known_objects.find(id) == client->m_known_objects.end())
continue; continue;
// Get message list of object // Get message list of object
std::list<ActiveObjectMessage>* list = j->second; std::vector<ActiveObjectMessage>* list = j->second;
// Go through every message // Go through every message
for(std::list<ActiveObjectMessage>::iterator for (std::vector<ActiveObjectMessage>::iterator
k = list->begin(); k != list->end(); ++k) k = list->begin(); k != list->end(); ++k) {
{
// Compose the full new data with header // Compose the full new data with header
ActiveObjectMessage aom = *k; ActiveObjectMessage aom = *k;
std::string new_data; std::string new_data;
@ -876,10 +871,9 @@ void Server::AsyncRunStep(bool initial_step)
m_clients.Unlock(); m_clients.Unlock();
// Clear buffered_messages // Clear buffered_messages
for(std::map<u16, std::list<ActiveObjectMessage>* >::iterator for(std::map<u16, std::vector<ActiveObjectMessage>* >::iterator
i = buffered_messages.begin(); i = buffered_messages.begin();
i != buffered_messages.end(); ++i) i != buffered_messages.end(); ++i) {
{
delete i->second; delete i->second;
} }
} }
@ -912,78 +906,61 @@ void Server::AsyncRunStep(bool initial_step)
// Players far away from the change are stored here. // Players far away from the change are stored here.
// Instead of sending the changes, MapBlocks are set not sent // Instead of sending the changes, MapBlocks are set not sent
// for them. // for them.
std::list<u16> far_players; std::vector<u16> far_players;
if(event->type == MEET_ADDNODE || event->type == MEET_SWAPNODE) switch (event->type) {
{ case MEET_ADDNODE:
//infostream<<"Server: MEET_ADDNODE"<<std::endl; case MEET_SWAPNODE:
prof.add("MEET_ADDNODE", 1); prof.add("MEET_ADDNODE", 1);
if(disable_single_change_sending) sendAddNode(event->p, event->n, event->already_known_by_peer,
sendAddNode(event->p, event->n, event->already_known_by_peer, &far_players, disable_single_change_sending ? 5 : 30,
&far_players, 5, event->type == MEET_ADDNODE); event->type == MEET_ADDNODE);
else break;
sendAddNode(event->p, event->n, event->already_known_by_peer, case MEET_REMOVENODE:
&far_players, 30, event->type == MEET_ADDNODE);
}
else if(event->type == MEET_REMOVENODE)
{
//infostream<<"Server: MEET_REMOVENODE"<<std::endl;
prof.add("MEET_REMOVENODE", 1); prof.add("MEET_REMOVENODE", 1);
if(disable_single_change_sending) sendRemoveNode(event->p, event->already_known_by_peer,
sendRemoveNode(event->p, event->already_known_by_peer, &far_players, disable_single_change_sending ? 5 : 30);
&far_players, 5); break;
else case MEET_BLOCK_NODE_METADATA_CHANGED:
sendRemoveNode(event->p, event->already_known_by_peer, infostream << "Server: MEET_BLOCK_NODE_METADATA_CHANGED" << std::endl;
&far_players, 30); prof.add("MEET_BLOCK_NODE_METADATA_CHANGED", 1);
} setBlockNotSent(event->p);
else if(event->type == MEET_BLOCK_NODE_METADATA_CHANGED) break;
{ case MEET_OTHER:
infostream<<"Server: MEET_BLOCK_NODE_METADATA_CHANGED"<<std::endl; infostream << "Server: MEET_OTHER" << std::endl;
prof.add("MEET_BLOCK_NODE_METADATA_CHANGED", 1);
setBlockNotSent(event->p);
}
else if(event->type == MEET_OTHER)
{
infostream<<"Server: MEET_OTHER"<<std::endl;
prof.add("MEET_OTHER", 1); prof.add("MEET_OTHER", 1);
for(std::set<v3s16>::iterator for(std::set<v3s16>::iterator
i = event->modified_blocks.begin(); i = event->modified_blocks.begin();
i != event->modified_blocks.end(); ++i) i != event->modified_blocks.end(); ++i) {
{
setBlockNotSent(*i); setBlockNotSent(*i);
} }
} break;
else default:
{
prof.add("unknown", 1); prof.add("unknown", 1);
infostream<<"WARNING: Server: Unknown MapEditEvent " infostream << "WARNING: Server: Unknown MapEditEvent "
<<((u32)event->type)<<std::endl; << ((u32)event->type) << std::endl;
break;
} }
/* /*
Set blocks not sent to far players Set blocks not sent to far players
*/ */
if(!far_players.empty()) if(!far_players.empty()) {
{
// Convert list format to that wanted by SetBlocksNotSent // Convert list format to that wanted by SetBlocksNotSent
std::map<v3s16, MapBlock*> modified_blocks2; std::map<v3s16, MapBlock*> modified_blocks2;
for(std::set<v3s16>::iterator for(std::set<v3s16>::iterator
i = event->modified_blocks.begin(); i = event->modified_blocks.begin();
i != event->modified_blocks.end(); ++i) i != event->modified_blocks.end(); ++i) {
{
modified_blocks2[*i] = modified_blocks2[*i] =
m_env->getMap().getBlockNoCreateNoEx(*i); m_env->getMap().getBlockNoCreateNoEx(*i);
} }
// Set blocks not sent // Set blocks not sent
for(std::list<u16>::iterator for(std::vector<u16>::iterator
i = far_players.begin(); i = far_players.begin();
i != far_players.end(); ++i) i != far_players.end(); ++i) {
{ if(RemoteClient *client = getClient(*i))
u16 peer_id = *i; client->SetBlocksNotSent(modified_blocks2);
RemoteClient *client = getClient(peer_id);
if(client==NULL)
continue;
client->SetBlocksNotSent(modified_blocks2);
} }
} }
@ -2018,7 +1995,7 @@ void Server::stopSound(s32 handle)
} }
void Server::sendRemoveNode(v3s16 p, u16 ignore_id, void Server::sendRemoveNode(v3s16 p, u16 ignore_id,
std::list<u16> *far_players, float far_d_nodes) std::vector<u16> *far_players, float far_d_nodes)
{ {
float maxd = far_d_nodes*BS; float maxd = far_d_nodes*BS;
v3f p_f = intToFloat(p, BS); v3f p_f = intToFloat(p, BS);
@ -2029,7 +2006,7 @@ void Server::sendRemoveNode(v3s16 p, u16 ignore_id,
std::vector<u16> clients = m_clients.getClientIDs(); std::vector<u16> clients = m_clients.getClientIDs();
for(std::vector<u16>::iterator i = clients.begin(); for(std::vector<u16>::iterator i = clients.begin();
i != clients.end(); ++i) { i != clients.end(); ++i) {
if(far_players) { if (far_players) {
// Get player // Get player
if(Player *player = m_env->getPlayer(*i)) { if(Player *player = m_env->getPlayer(*i)) {
// If player is far away, only set modified blocks not sent // If player is far away, only set modified blocks not sent
@ -2049,7 +2026,7 @@ void Server::sendRemoveNode(v3s16 p, u16 ignore_id,
} }
void Server::sendAddNode(v3s16 p, MapNode n, u16 ignore_id, void Server::sendAddNode(v3s16 p, MapNode n, u16 ignore_id,
std::list<u16> *far_players, float far_d_nodes, std::vector<u16> *far_players, float far_d_nodes,
bool remove_metadata) bool remove_metadata)
{ {
float maxd = far_d_nodes*BS; float maxd = far_d_nodes*BS;

@ -422,9 +422,9 @@ private:
*/ */
// Envlock and conlock should be locked when calling these // Envlock and conlock should be locked when calling these
void sendRemoveNode(v3s16 p, u16 ignore_id=0, void sendRemoveNode(v3s16 p, u16 ignore_id=0,
std::list<u16> *far_players=NULL, float far_d_nodes=100); std::vector<u16> *far_players=NULL, float far_d_nodes=100);
void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0, void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0,
std::list<u16> *far_players=NULL, float far_d_nodes=100, std::vector<u16> *far_players=NULL, float far_d_nodes=100,
bool remove_metadata=true); bool remove_metadata=true);
void setBlockNotSent(v3s16 p); void setBlockNotSent(v3s16 p);