Performance fix + SAO factorization

Original credits goes to @Rogier-5

* Merge common attributes between LuaEntitySAO & PlayerSAO to UnitSAO
* Make some functions const
* Improve some lists performance by returning const ref

Signed-off-by: Loic Blot <loic.blot@unix-experience.fr>
master
Rogier 2017-01-10 04:39:45 +09:00 committed by Ner'zhul
parent ec30d49e02
commit 6647939403
8 changed files with 88 additions and 117 deletions

View File

@ -64,7 +64,7 @@ public:
m_id(id) m_id(id)
{ {
} }
u16 getId() u16 getId()
{ {
return m_id; return m_id;
@ -76,8 +76,8 @@ public:
} }
virtual ActiveObjectType getType() const = 0; virtual ActiveObjectType getType() const = 0;
virtual bool getCollisionBox(aabb3f *toset) = 0; virtual bool getCollisionBox(aabb3f *toset) const = 0;
virtual bool collideWithObjects() = 0; virtual bool collideWithObjects() const = 0;
protected: protected:
u16 m_id; // 0 is invalid, "no id" u16 m_id; // 0 is invalid, "no id"
}; };

View File

@ -47,8 +47,8 @@ public:
virtual void updateLightNoCheck(u8 light_at_pos){} virtual void updateLightNoCheck(u8 light_at_pos){}
virtual v3s16 getLightPosition(){return v3s16(0,0,0);} virtual v3s16 getLightPosition(){return v3s16(0,0,0);}
virtual aabb3f *getSelectionBox() { return NULL; } virtual aabb3f *getSelectionBox() { return NULL; }
virtual bool getCollisionBox(aabb3f *toset){return false;} virtual bool getCollisionBox(aabb3f *toset) const { return false; }
virtual bool collideWithObjects(){return false;} virtual bool collideWithObjects() const { return false; }
virtual v3f getPosition(){return v3f(0,0,0);} virtual v3f getPosition(){return v3f(0,0,0);}
virtual float getYaw() const {return 0;} virtual float getYaw() const {return 0;}
virtual scene::ISceneNode *getSceneNode(){return NULL;} virtual scene::ISceneNode *getSceneNode(){return NULL;}

View File

@ -159,7 +159,7 @@ public:
void processMessage(const std::string &data); void processMessage(const std::string &data);
bool getCollisionBox(aabb3f *toset) { return false; } bool getCollisionBox(aabb3f *toset) const { return false; }
private: private:
scene::IMeshSceneNode *m_node; scene::IMeshSceneNode *m_node;
v3f m_position; v3f m_position;
@ -316,7 +316,7 @@ public:
std::string infoText() std::string infoText()
{return m_infotext;} {return m_infotext;}
bool getCollisionBox(aabb3f *toset) { return false; } bool getCollisionBox(aabb3f *toset) const { return false; }
private: private:
aabb3f m_selection_box; aabb3f m_selection_box;
scene::IMeshSceneNode *m_node; scene::IMeshSceneNode *m_node;
@ -587,7 +587,7 @@ GenericCAO::GenericCAO(Client *client, ClientEnvironment *env):
} }
} }
bool GenericCAO::getCollisionBox(aabb3f *toset) bool GenericCAO::getCollisionBox(aabb3f *toset) const
{ {
if (m_prop.physical) if (m_prop.physical)
{ {

View File

@ -130,7 +130,7 @@ public:
ClientActiveObject *getParent(); ClientActiveObject *getParent();
bool getCollisionBox(aabb3f *toset); bool getCollisionBox(aabb3f *toset) const;
bool collideWithObjects(); bool collideWithObjects();

View File

@ -19,11 +19,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "content_sao.h" #include "content_sao.h"
#include "util/serialize.h" #include "util/serialize.h"
#include "util/mathconstants.h"
#include "collision.h" #include "collision.h"
#include "environment.h" #include "environment.h"
#include "settings.h"
#include "serialization.h" // For compressZlib
#include "tool.h" // For ToolCapabilities #include "tool.h" // For ToolCapabilities
#include "gamedef.h" #include "gamedef.h"
#include "nodedef.h" #include "nodedef.h"
@ -31,7 +28,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "server.h" #include "server.h"
#include "scripting_game.h" #include "scripting_game.h"
#include "genericobject.h" #include "genericobject.h"
#include "log.h"
std::map<u16, ServerActiveObject::Factory> ServerActiveObject::m_types; std::map<u16, ServerActiveObject::Factory> ServerActiveObject::m_types;
@ -94,13 +90,8 @@ public:
} }
} }
bool getCollisionBox(aabb3f *toset) { bool getCollisionBox(aabb3f *toset) const { return false; }
return false; bool collideWithObjects() const { return false; }
}
bool collideWithObjects() {
return false;
}
private: private:
float m_timer1; float m_timer1;
@ -110,6 +101,28 @@ private:
// Prototype (registers item for deserialization) // Prototype (registers item for deserialization)
TestSAO proto_TestSAO(NULL, v3f(0,0,0)); TestSAO proto_TestSAO(NULL, v3f(0,0,0));
/*
UnitSAO
*/
UnitSAO::UnitSAO(ServerEnvironment *env, v3f pos):
ServerActiveObject(env, pos),
m_hp(-1),
m_yaw(0),
m_properties_sent(true),
m_armor_groups_sent(false),
m_animation_range(0,0),
m_animation_speed(0),
m_animation_blend(0),
m_animation_loop(true),
m_animation_sent(false),
m_bone_position_sent(false),
m_attachment_parent_id(0),
m_attachment_sent(false)
{
// Initialize something to armor groups
m_armor_groups["fleshy"] = 100;
}
/* /*
LuaEntitySAO LuaEntitySAO
*/ */
@ -125,29 +138,17 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos,
m_registered(false), m_registered(false),
m_velocity(0,0,0), m_velocity(0,0,0),
m_acceleration(0,0,0), m_acceleration(0,0,0),
m_properties_sent(true),
m_last_sent_yaw(0), m_last_sent_yaw(0),
m_last_sent_position(0,0,0), m_last_sent_position(0,0,0),
m_last_sent_velocity(0,0,0), m_last_sent_velocity(0,0,0),
m_last_sent_position_timer(0), m_last_sent_position_timer(0),
m_last_sent_move_precision(0), m_last_sent_move_precision(0)
m_armor_groups_sent(false),
m_animation_speed(0),
m_animation_blend(0),
m_animation_loop(true),
m_animation_sent(false),
m_bone_position_sent(false),
m_attachment_parent_id(0),
m_attachment_sent(false)
{ {
// Only register type if no environment supplied // Only register type if no environment supplied
if(env == NULL){ if(env == NULL){
ServerActiveObject::registerType(getType(), create); ServerActiveObject::registerType(getType(), create);
return; return;
} }
// Initialize something to armor groups
m_armor_groups["fleshy"] = 100;
} }
LuaEntitySAO::~LuaEntitySAO() LuaEntitySAO::~LuaEntitySAO()
@ -565,7 +566,7 @@ void LuaEntitySAO::setArmorGroups(const ItemGroupList &armor_groups)
m_armor_groups_sent = false; m_armor_groups_sent = false;
} }
ItemGroupList LuaEntitySAO::getArmorGroups() const ItemGroupList &LuaEntitySAO::getArmorGroups()
{ {
return m_armor_groups; return m_armor_groups;
} }
@ -635,7 +636,7 @@ void LuaEntitySAO::removeAttachmentChild(int child_id)
m_attachment_child_ids.erase(child_id); m_attachment_child_ids.erase(child_id);
} }
UNORDERED_SET<int> LuaEntitySAO::getAttachmentChildIds() const UNORDERED_SET<int> &LuaEntitySAO::getAttachmentChildIds()
{ {
return m_attachment_child_ids; return m_attachment_child_ids;
} }
@ -732,7 +733,8 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end)
m_messages_out.push(aom); m_messages_out.push(aom);
} }
bool LuaEntitySAO::getCollisionBox(aabb3f *toset) { bool LuaEntitySAO::getCollisionBox(aabb3f *toset) const
{
if (m_prop.physical) if (m_prop.physical)
{ {
//update collision box //update collision box
@ -748,7 +750,8 @@ bool LuaEntitySAO::getCollisionBox(aabb3f *toset) {
return false; return false;
} }
bool LuaEntitySAO::collideWithObjects(){ bool LuaEntitySAO::collideWithObjects() const
{
return m_prop.collideWithObjects; return m_prop.collideWithObjects;
} }
@ -770,16 +773,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer
m_nocheat_dig_time(0), m_nocheat_dig_time(0),
m_wield_index(0), m_wield_index(0),
m_position_not_sent(false), m_position_not_sent(false),
m_armor_groups_sent(false),
m_properties_sent(true),
m_is_singleplayer(is_singleplayer), m_is_singleplayer(is_singleplayer),
m_animation_speed(0),
m_animation_blend(0),
m_animation_loop(true),
m_animation_sent(false),
m_bone_position_sent(false),
m_attachment_parent_id(0),
m_attachment_sent(false),
m_breath(PLAYER_MAX_BREATH), m_breath(PLAYER_MAX_BREATH),
m_pitch(0), m_pitch(0),
m_fov(0), m_fov(0),
@ -793,7 +787,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer
m_physics_override_sent(false) m_physics_override_sent(false)
{ {
assert(m_peer_id != 0); // pre-condition assert(m_peer_id != 0); // pre-condition
m_armor_groups["fleshy"] = 100;
m_prop.hp_max = PLAYER_MAX_HP; m_prop.hp_max = PLAYER_MAX_HP;
m_prop.physical = false; m_prop.physical = false;
@ -828,6 +821,11 @@ void PlayerSAO::initialize(RemotePlayer *player, const std::set<std::string> &pr
m_inventory = &m_player->inventory; m_inventory = &m_player->inventory;
} }
v3f PlayerSAO::getEyeOffset() const
{
return v3f(0, BS * 1.625f, 0);
}
std::string PlayerSAO::getDescription() std::string PlayerSAO::getDescription()
{ {
return std::string("player ") + m_player->getName(); return std::string("player ") + m_player->getName();
@ -1282,7 +1280,7 @@ void PlayerSAO::setArmorGroups(const ItemGroupList &armor_groups)
m_armor_groups_sent = false; m_armor_groups_sent = false;
} }
ItemGroupList PlayerSAO::getArmorGroups() const ItemGroupList &PlayerSAO::getArmorGroups()
{ {
return m_armor_groups; return m_armor_groups;
} }
@ -1354,7 +1352,7 @@ void PlayerSAO::removeAttachmentChild(int child_id)
m_attachment_child_ids.erase(child_id); m_attachment_child_ids.erase(child_id);
} }
UNORDERED_SET<int> PlayerSAO::getAttachmentChildIds() const UNORDERED_SET<int> &PlayerSAO::getAttachmentChildIds()
{ {
return m_attachment_child_ids; return m_attachment_child_ids;
} }
@ -1512,15 +1510,10 @@ bool PlayerSAO::checkMovementCheat()
return cheated; return cheated;
} }
bool PlayerSAO::getCollisionBox(aabb3f *toset) bool PlayerSAO::getCollisionBox(aabb3f *toset) const
{ {
*toset = aabb3f(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30); *toset = aabb3f(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30);
toset->MinEdge += m_base_position; toset->MinEdge += m_base_position;
toset->MaxEdge += m_base_position; toset->MaxEdge += m_base_position;
return true; return true;
} }
bool PlayerSAO::collideWithObjects()
{
return true;
}

View File

@ -24,14 +24,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "serverobject.h" #include "serverobject.h"
#include "itemgroup.h" #include "itemgroup.h"
#include "object_properties.h" #include "object_properties.h"
#include "constants.h"
class UnitSAO: public ServerActiveObject class UnitSAO: public ServerActiveObject
{ {
public: public:
UnitSAO(ServerEnvironment *env, v3f pos): UnitSAO(ServerEnvironment *env, v3f pos);
ServerActiveObject(env, pos),
m_hp(-1), m_yaw(0) {}
virtual ~UnitSAO() {} virtual ~UnitSAO() {}
virtual void setYaw(const float yaw) { m_yaw = yaw; } virtual void setYaw(const float yaw) { m_yaw = yaw; }
@ -46,6 +43,29 @@ public:
protected: protected:
s16 m_hp; s16 m_hp;
float m_yaw; float m_yaw;
bool m_properties_sent;
struct ObjectProperties m_prop;
ItemGroupList m_armor_groups;
bool m_armor_groups_sent;
v2f m_animation_range;
float m_animation_speed;
float m_animation_blend;
bool m_animation_loop;
bool m_animation_sent;
// Stores position and rotation for each bone name
UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position;
bool m_bone_position_sent;
int m_attachment_parent_id;
UNORDERED_SET<int> m_attachment_child_ids;
std::string m_attachment_bone;
v3f m_attachment_position;
v3f m_attachment_rotation;
bool m_attachment_sent;
}; };
/* /*
@ -81,7 +101,7 @@ public:
void setHP(s16 hp); void setHP(s16 hp);
s16 getHP() const; s16 getHP() const;
void setArmorGroups(const ItemGroupList &armor_groups); void setArmorGroups(const ItemGroupList &armor_groups);
ItemGroupList getArmorGroups(); const ItemGroupList &getArmorGroups();
void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop);
void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop); void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop);
void setBonePosition(const std::string &bone, v3f position, v3f rotation); void setBonePosition(const std::string &bone, v3f position, v3f rotation);
@ -90,7 +110,7 @@ public:
void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation);
void addAttachmentChild(int child_id); void addAttachmentChild(int child_id);
void removeAttachmentChild(int child_id); void removeAttachmentChild(int child_id);
UNORDERED_SET<int> getAttachmentChildIds(); const UNORDERED_SET<int> &getAttachmentChildIds();
ObjectProperties* accessObjectProperties(); ObjectProperties* accessObjectProperties();
void notifyObjectPropertiesModified(); void notifyObjectPropertiesModified();
/* LuaEntitySAO-specific */ /* LuaEntitySAO-specific */
@ -103,8 +123,8 @@ public:
void setSprite(v2s16 p, int num_frames, float framelength, void setSprite(v2s16 p, int num_frames, float framelength,
bool select_horiz_by_yawpitch); bool select_horiz_by_yawpitch);
std::string getName(); std::string getName();
bool getCollisionBox(aabb3f *toset); bool getCollisionBox(aabb3f *toset) const;
bool collideWithObjects(); bool collideWithObjects() const;
private: private:
std::string getPropertyPacket(); std::string getPropertyPacket();
void sendPosition(bool do_interpolate, bool is_movement_end); void sendPosition(bool do_interpolate, bool is_movement_end);
@ -112,36 +132,15 @@ private:
std::string m_init_name; std::string m_init_name;
std::string m_init_state; std::string m_init_state;
bool m_registered; bool m_registered;
struct ObjectProperties m_prop;
v3f m_velocity; v3f m_velocity;
v3f m_acceleration; v3f m_acceleration;
ItemGroupList m_armor_groups;
bool m_properties_sent;
float m_last_sent_yaw; float m_last_sent_yaw;
v3f m_last_sent_position; v3f m_last_sent_position;
v3f m_last_sent_velocity; v3f m_last_sent_velocity;
float m_last_sent_position_timer; float m_last_sent_position_timer;
float m_last_sent_move_precision; float m_last_sent_move_precision;
bool m_armor_groups_sent;
v2f m_animation_range;
float m_animation_speed;
float m_animation_blend;
bool m_animation_loop;
bool m_animation_sent;
UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position;
bool m_bone_position_sent;
int m_attachment_parent_id;
UNORDERED_SET<int> m_attachment_child_ids;
std::string m_attachment_bone;
v3f m_attachment_position;
v3f m_attachment_rotation;
bool m_attachment_sent;
}; };
/* /*
@ -235,7 +234,7 @@ public:
u16 getBreath() const { return m_breath; } u16 getBreath() const { return m_breath; }
void setBreath(const u16 breath, bool send = true); void setBreath(const u16 breath, bool send = true);
void setArmorGroups(const ItemGroupList &armor_groups); void setArmorGroups(const ItemGroupList &armor_groups);
ItemGroupList getArmorGroups(); const ItemGroupList &getArmorGroups();
void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop); void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop);
void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop); void getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop);
void setBonePosition(const std::string &bone, v3f position, v3f rotation); void setBonePosition(const std::string &bone, v3f position, v3f rotation);
@ -244,7 +243,7 @@ public:
void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation);
void addAttachmentChild(int child_id); void addAttachmentChild(int child_id);
void removeAttachmentChild(int child_id); void removeAttachmentChild(int child_id);
UNORDERED_SET<int> getAttachmentChildIds(); const UNORDERED_SET<int> &getAttachmentChildIds();
ObjectProperties* accessObjectProperties(); ObjectProperties* accessObjectProperties();
void notifyObjectPropertiesModified(); void notifyObjectPropertiesModified();
@ -315,13 +314,13 @@ public:
m_is_singleplayer = is_singleplayer; m_is_singleplayer = is_singleplayer;
} }
bool getCollisionBox(aabb3f *toset); bool getCollisionBox(aabb3f *toset) const;
bool collideWithObjects(); bool collideWithObjects() const { return true; }
void initialize(RemotePlayer *player, const std::set<std::string> &privs); void initialize(RemotePlayer *player, const std::set<std::string> &privs);
v3f getEyePosition() const { return m_base_position + getEyeOffset(); } v3f getEyePosition() const { return m_base_position + getEyeOffset(); }
v3f getEyeOffset() const { return v3f(0, BS * 1.625f, 0); } v3f getEyeOffset() const;
private: private:
std::string getPropertyPacket(); std::string getPropertyPacket();
@ -346,31 +345,11 @@ private:
int m_wield_index; int m_wield_index;
bool m_position_not_sent; bool m_position_not_sent;
ItemGroupList m_armor_groups;
bool m_armor_groups_sent;
bool m_properties_sent;
struct ObjectProperties m_prop;
// Cached privileges for enforcement // Cached privileges for enforcement
std::set<std::string> m_privs; std::set<std::string> m_privs;
bool m_is_singleplayer; bool m_is_singleplayer;
v2f m_animation_range;
float m_animation_speed;
float m_animation_blend;
bool m_animation_loop;
bool m_animation_sent;
// Stores position and rotation for each bone name
UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position;
bool m_bone_position_sent;
int m_attachment_parent_id;
UNORDERED_SET<int> m_attachment_child_ids;
std::string m_attachment_bone;
v3f m_attachment_position;
v3f m_attachment_rotation;
bool m_attachment_sent;
u16 m_breath; u16 m_breath;
f32 m_pitch; f32 m_pitch;
f32 m_fov; f32 m_fov;

View File

@ -137,8 +137,8 @@ int ObjectRef::l_remove(lua_State *L)
if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
return 0; return 0;
UNORDERED_SET<int> child_ids = co->getAttachmentChildIds(); const UNORDERED_SET<int> &child_ids = co->getAttachmentChildIds();
UNORDERED_SET<int>::iterator it; UNORDERED_SET<int>::const_iterator it;
for (it = child_ids.begin(); it != child_ids.end(); ++it) { for (it = child_ids.begin(); it != child_ids.end(); ++it) {
// Child can be NULL if it was deleted earlier // Child can be NULL if it was deleted earlier
if (ServerActiveObject *child = env->getActiveObject(*it)) if (ServerActiveObject *child = env->getActiveObject(*it))
@ -396,8 +396,7 @@ int ObjectRef::l_get_armor_groups(lua_State *L)
if (co == NULL) if (co == NULL)
return 0; return 0;
// Do it // Do it
ItemGroupList groups = co->getArmorGroups(); push_groups(L, co->getArmorGroups());
push_groups(L, groups);
return 1; return 1;
} }

View File

@ -146,8 +146,8 @@ public:
virtual void setArmorGroups(const ItemGroupList &armor_groups) virtual void setArmorGroups(const ItemGroupList &armor_groups)
{} {}
virtual ItemGroupList getArmorGroups() virtual const ItemGroupList &getArmorGroups()
{ return ItemGroupList(); } { static const ItemGroupList rv; return rv; }
virtual void setPhysicsOverride(float physics_override_speed, float physics_override_jump, float physics_override_gravity) virtual void setPhysicsOverride(float physics_override_speed, float physics_override_jump, float physics_override_gravity)
{} {}
virtual void setAnimation(v2f frames, float frame_speed, float frame_blend, bool frame_loop) virtual void setAnimation(v2f frames, float frame_speed, float frame_blend, bool frame_loop)
@ -166,8 +166,8 @@ public:
{} {}
virtual void removeAttachmentChild(int child_id) virtual void removeAttachmentChild(int child_id)
{} {}
virtual UNORDERED_SET<int> getAttachmentChildIds() virtual const UNORDERED_SET<int> &getAttachmentChildIds()
{ return UNORDERED_SET<int>(); } { static const UNORDERED_SET<int> rv; return rv; }
virtual ObjectProperties* accessObjectProperties() virtual ObjectProperties* accessObjectProperties()
{ return NULL; } { return NULL; }
virtual void notifyObjectPropertiesModified() virtual void notifyObjectPropertiesModified()