Fixes for using std:vector in ABMHander and further perf improvements

This commit is contained in:
Lars Hofhansl 2017-01-04 11:11:55 -08:00 committed by sfan5
parent ad10b8b762
commit ca3629637c
3 changed files with 22 additions and 13 deletions

View File

@ -827,7 +827,7 @@ public:
{ {
content_t c = *k; content_t c = *k;
if (c >= m_aabms.size()) if (c >= m_aabms.size())
m_aabms.resize(c + 256, (std::vector<ActiveABM> *) NULL); m_aabms.resize(c + 256, NULL);
if (!m_aabms[c]) if (!m_aabms[c])
m_aabms[c] = new std::vector<ActiveABM>; m_aabms[c] = new std::vector<ActiveABM>;
m_aabms[c]->push_back(aabm); m_aabms[c]->push_back(aabm);
@ -872,7 +872,7 @@ public:
} }
void apply(MapBlock *block) void apply(MapBlock *block)
{ {
if(m_aabms.empty()) if(m_aabms.empty() || block->isDummy())
return; return;
ServerMap *map = &m_env->getServerMap(); ServerMap *map = &m_env->getServerMap();
@ -886,13 +886,13 @@ public:
for(p0.Y=0; p0.Y<MAP_BLOCKSIZE; p0.Y++) for(p0.Y=0; p0.Y<MAP_BLOCKSIZE; p0.Y++)
for(p0.Z=0; p0.Z<MAP_BLOCKSIZE; p0.Z++) for(p0.Z=0; p0.Z<MAP_BLOCKSIZE; p0.Z++)
{ {
MapNode n = block->getNodeNoEx(p0); const MapNode &n = block->getNodeUnsafe(p0);
content_t c = n.getContent(); content_t c = n.getContent();
v3s16 p = p0 + block->getPosRelative();
if (!m_aabms[c]) if (c >= m_aabms.size() || !m_aabms[c])
continue; continue;
v3s16 p = p0 + block->getPosRelative();
for(std::vector<ActiveABM>::iterator for(std::vector<ActiveABM>::iterator
i = m_aabms[c]->begin(); i != m_aabms[c]->end(); ++i) { i = m_aabms[c]->begin(); i != m_aabms[c]->end(); ++i) {
if(myrand() % i->chance != 0) if(myrand() % i->chance != 0)

View File

@ -305,8 +305,7 @@ public:
inline MapNode getNodeNoEx(v3s16 p) inline MapNode getNodeNoEx(v3s16 p)
{ {
bool is_valid; bool is_valid;
MapNode node = getNode(p.X, p.Y, p.Z, &is_valid); return getNode(p.X, p.Y, p.Z, &is_valid);
return is_valid ? node : MapNode(CONTENT_IGNORE);
} }
inline void setNode(s16 x, s16 y, s16 z, MapNode & n) inline void setNode(s16 x, s16 y, s16 z, MapNode & n)
@ -341,6 +340,22 @@ public:
return getNodeNoCheck(p.X, p.Y, p.Z, valid_position); return getNodeNoCheck(p.X, p.Y, p.Z, valid_position);
} }
////
//// Non-checking, unsafe variants of the above
//// MapBlock must be loaded by another function in the same scope/function
//// Caller must ensure that this is not a dummy block (by calling isDummy())
////
inline const MapNode &getNodeUnsafe(s16 x, s16 y, s16 z)
{
return data[z * zstride + y * ystride + x];
}
inline const MapNode &getNodeUnsafe(v3s16 &p)
{
return getNodeUnsafe(p.X, p.Y, p.Z);
}
inline void setNodeNoCheck(s16 x, s16 y, s16 z, MapNode & n) inline void setNodeNoCheck(s16 x, s16 y, s16 z, MapNode & n)
{ {
if (data == NULL) if (data == NULL)
@ -512,7 +527,6 @@ public:
void serializeNetworkSpecific(std::ostream &os, u16 net_proto_version); void serializeNetworkSpecific(std::ostream &os, u16 net_proto_version);
void deSerializeNetworkSpecific(std::istream &is); void deSerializeNetworkSpecific(std::istream &is);
private: private:
/* /*
Private methods Private methods

View File

@ -143,11 +143,6 @@ struct MapNode
MapNode() MapNode()
{ } { }
MapNode(const MapNode & n)
{
*this = n;
}
MapNode(content_t content, u8 a_param1=0, u8 a_param2=0) MapNode(content_t content, u8 a_param1=0, u8 a_param2=0)
: param0(content), : param0(content),
param1(a_param1), param1(a_param1),