diff options
author | Loic Blot <loic.blot@unix-experience.fr> | 2015-08-05 22:29:47 +0200 |
---|---|---|
committer | est31 <MTest31@outlook.com> | 2015-09-19 20:57:07 +0200 |
commit | 9c635f28ac2b103bf7196e47947bf64673c13393 (patch) | |
tree | efdde722915c72c54f982144e7a1714897e517e4 /src | |
parent | fe994946b7fabdb6f3cc7d11ec6ee1a27f7f5c20 (diff) | |
download | minetest-9c635f28ac2b103bf7196e47947bf64673c13393.tar.gz minetest-9c635f28ac2b103bf7196e47947bf64673c13393.tar.bz2 minetest-9c635f28ac2b103bf7196e47947bf64673c13393.zip |
Little optimization on getAdded/Removed activeobjects per player loop.
Use std::queue instead of std::set, we don't need such a heavy container.
Don't convert position to int to convert it back to float in the next function.
Diffstat (limited to 'src')
-rw-r--r-- | src/environment.cpp | 36 | ||||
-rw-r--r-- | src/environment.h | 8 | ||||
-rw-r--r-- | src/server.cpp | 38 |
3 files changed, 36 insertions, 46 deletions
diff --git a/src/environment.cpp b/src/environment.cpp index 6877c2460..79540bccf 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -1318,12 +1318,11 @@ u16 ServerEnvironment::addActiveObject(ServerActiveObject *object) Finds out what new objects have been added to inside a radius around a position */ -void ServerEnvironment::getAddedActiveObjects(v3s16 pos, s16 radius, +void ServerEnvironment::getAddedActiveObjects(Player *player, s16 radius, s16 player_radius, std::set<u16> ¤t_objects, - std::set<u16> &added_objects) + std::queue<u16> &added_objects) { - v3f pos_f = intToFloat(pos, BS); f32 radius_f = radius * BS; f32 player_radius_f = player_radius * BS; @@ -1339,18 +1338,19 @@ void ServerEnvironment::getAddedActiveObjects(v3s16 pos, s16 radius, */ for(std::map<u16, ServerActiveObject*>::iterator i = m_active_objects.begin(); - i != m_active_objects.end(); ++i) - { + i != m_active_objects.end(); ++i) { u16 id = i->first; + // Get object ServerActiveObject *object = i->second; if(object == NULL) continue; + // Discard if removed or deactivating if(object->m_removed || object->m_pending_deactivation) continue; - f32 distance_f = object->getBasePosition().getDistanceFrom(pos_f); + f32 distance_f = object->getBasePosition().getDistanceFrom(player->getPosition()); if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { // Discard if too far if (distance_f > player_radius_f && player_radius_f != 0) @@ -1364,7 +1364,7 @@ void ServerEnvironment::getAddedActiveObjects(v3s16 pos, s16 radius, if(n != current_objects.end()) continue; // Add to added_objects - added_objects.insert(id); + added_objects.push(id); } } @@ -1372,12 +1372,11 @@ void ServerEnvironment::getAddedActiveObjects(v3s16 pos, s16 radius, Finds out what objects have been removed from inside a radius around a position */ -void ServerEnvironment::getRemovedActiveObjects(v3s16 pos, s16 radius, +void ServerEnvironment::getRemovedActiveObjects(Player *player, s16 radius, s16 player_radius, std::set<u16> ¤t_objects, - std::set<u16> &removed_objects) + std::queue<u16> &removed_objects) { - v3f pos_f = intToFloat(pos, BS); f32 radius_f = radius * BS; f32 player_radius_f = player_radius * BS; @@ -1399,20 +1398,19 @@ void ServerEnvironment::getRemovedActiveObjects(v3s16 pos, s16 radius, u16 id = *i; ServerActiveObject *object = getActiveObject(id); - if(object == NULL){ - infostream<<"ServerEnvironment::getRemovedActiveObjects():" - <<" object in current_objects is NULL"<<std::endl; - removed_objects.insert(id); + if (object == NULL) { + infostream << "ServerEnvironment::getRemovedActiveObjects():" + << " object in current_objects is NULL" << std::endl; + removed_objects.push(id); continue; } - if(object->m_removed || object->m_pending_deactivation) - { - removed_objects.insert(id); + if (object->m_removed || object->m_pending_deactivation) { + removed_objects.push(id); continue; } - f32 distance_f = object->getBasePosition().getDistanceFrom(pos_f); + f32 distance_f = object->getBasePosition().getDistanceFrom(player->getPosition()); if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { if (distance_f <= player_radius_f || player_radius_f == 0) continue; @@ -1420,7 +1418,7 @@ void ServerEnvironment::getRemovedActiveObjects(v3s16 pos, s16 radius, continue; // Object is no longer visible - removed_objects.insert(id); + removed_objects.push(id); } } diff --git a/src/environment.h b/src/environment.h index 22840a9fc..41295abf2 100644 --- a/src/environment.h +++ b/src/environment.h @@ -265,19 +265,19 @@ public: Find out what new objects have been added to inside a radius around a position */ - void getAddedActiveObjects(v3s16 pos, s16 radius, + void getAddedActiveObjects(Player *player, s16 radius, s16 player_radius, std::set<u16> ¤t_objects, - std::set<u16> &added_objects); + std::queue<u16> &added_objects); /* Find out what new objects have been removed from inside a radius around a position */ - void getRemovedActiveObjects(v3s16 pos, s16 radius, + void getRemovedActiveObjects(Player* player, s16 radius, s16 player_radius, std::set<u16> ¤t_objects, - std::set<u16> &removed_objects); + std::queue<u16> &removed_objects); /* Get the next message emitted by some active object. diff --git a/src/server.cpp b/src/server.cpp index 9a5739892..9b1b142eb 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -680,10 +680,9 @@ void Server::AsyncRunStep(bool initial_step) radius *= MAP_BLOCKSIZE; player_radius *= MAP_BLOCKSIZE; - for(std::map<u16, RemoteClient*>::iterator + for (std::map<u16, RemoteClient*>::iterator i = clients.begin(); - i != clients.end(); ++i) - { + i != clients.end(); ++i) { RemoteClient *client = i->second; // If definitions and textures have not been sent, don't @@ -692,27 +691,23 @@ void Server::AsyncRunStep(bool initial_step) continue; Player *player = m_env->getPlayer(client->peer_id); - if(player==NULL) - { + if(player == NULL) { // This can happen if the client timeouts somehow /*infostream<<"WARNING: "<<__FUNCTION_NAME<<": Client " <<client->peer_id <<" has no associated player"<<std::endl;*/ continue; } - v3s16 pos = floatToInt(player->getPosition(), BS); - std::set<u16> removed_objects; - std::set<u16> added_objects; - m_env->getRemovedActiveObjects(pos, radius, player_radius, + std::queue<u16> removed_objects; + std::queue<u16> added_objects; + m_env->getRemovedActiveObjects(player, radius, player_radius, client->m_known_objects, removed_objects); - m_env->getAddedActiveObjects(pos, radius, player_radius, + m_env->getAddedActiveObjects(player, radius, player_radius, client->m_known_objects, added_objects); // Ignore if nothing happened - if(removed_objects.empty() && added_objects.empty()) - { - //infostream<<"active objects: none changed"<<std::endl; + if (removed_objects.empty() && added_objects.empty()) { continue; } @@ -723,12 +718,9 @@ void Server::AsyncRunStep(bool initial_step) // Handle removed objects writeU16((u8*)buf, removed_objects.size()); data_buffer.append(buf, 2); - for(std::set<u16>::iterator - i = removed_objects.begin(); - i != removed_objects.end(); ++i) - { + while (!removed_objects.empty()) { // Get object - u16 id = *i; + u16 id = removed_objects.front(); ServerActiveObject* obj = m_env->getActiveObject(id); // Add to data buffer for sending @@ -740,17 +732,15 @@ void Server::AsyncRunStep(bool initial_step) if(obj && obj->m_known_by_count > 0) obj->m_known_by_count--; + removed_objects.pop(); } // Handle added objects writeU16((u8*)buf, added_objects.size()); data_buffer.append(buf, 2); - for(std::set<u16>::iterator - i = added_objects.begin(); - i != added_objects.end(); ++i) - { + while (!added_objects.empty()) { // Get object - u16 id = *i; + u16 id = added_objects.front(); ServerActiveObject* obj = m_env->getActiveObject(id); // Get object type @@ -778,6 +768,8 @@ void Server::AsyncRunStep(bool initial_step) if(obj) obj->m_known_by_count++; + + added_objects.pop(); } u32 pktSize = SendActiveObjectRemoveAdd(client->peer_id, data_buffer); |