From 4d5ce8478c959a4ee5b13ef9ba7e46b28d089a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Thu, 25 May 2017 16:43:55 +0200 Subject: [PATCH] Enhance ABM performance a little bit by removing two std::set copy (#5815) * Enhance ABM performance a little bit by removing two std::set copy * ActiveBlockModifier::getTriggerContents now returns a const ref * ActiveBlockModifier::getRequiredNeighbors now returns a const ref * ActiveBlockModifier::getRequiredNeighbors is now purely virtual * Little code style fix --- src/script/lua_api/l_env.h | 4 ++-- src/serverenvironment.cpp | 30 ++++++++++++++---------------- src/serverenvironment.h | 5 ++--- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 629c6bc39..7ce19b085 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -203,11 +203,11 @@ public: m_simple_catch_up(simple_catch_up) { } - virtual std::set getTriggerContents() + virtual const std::set &getTriggerContents() const { return m_trigger_contents; } - virtual std::set getRequiredNeighbors() + virtual const std::set &getRequiredNeighbors() const { return m_required_neighbors; } diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 892c6c55b..cbdc747d1 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -721,7 +721,7 @@ public: chance = 1; ActiveABM aabm; aabm.abm = abm; - if(abm->getSimpleCatchUp()) { + if (abm->getSimpleCatchUp()) { float intervals = actual_interval / trigger_interval; if(intervals == 0) continue; @@ -731,25 +731,23 @@ public: } else { aabm.chance = chance; } + // Trigger neighbors - std::set required_neighbors_s - = abm->getRequiredNeighbors(); - for(std::set::iterator - i = required_neighbors_s.begin(); - i != required_neighbors_s.end(); ++i) - { - ndef->getIds(*i, aabm.required_neighbors); + const std::set &required_neighbors_s = + abm->getRequiredNeighbors(); + for (std::set::iterator rn = required_neighbors_s.begin(); + rn != required_neighbors_s.end(); ++rn) { + ndef->getIds(*rn, aabm.required_neighbors); } + // Trigger contents - std::set contents_s = abm->getTriggerContents(); - for(std::set::iterator - i = contents_s.begin(); i != contents_s.end(); ++i) - { + const std::set &contents_s = abm->getTriggerContents(); + for (std::set::iterator cs = contents_s.begin(); + cs != contents_s.end(); ++cs) { std::set ids; - ndef->getIds(*i, ids); - for(std::set::const_iterator k = ids.begin(); - k != ids.end(); ++k) - { + ndef->getIds(*cs, ids); + for (std::set::const_iterator k = ids.begin(); + k != ids.end(); ++k) { content_t c = *k; if (c >= m_aabms.size()) m_aabms.resize(c + 256, NULL); diff --git a/src/serverenvironment.h b/src/serverenvironment.h index 0e31aa41a..7c370fd54 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -51,11 +51,10 @@ public: virtual ~ActiveBlockModifier(){}; // Set of contents to trigger on - virtual std::set getTriggerContents()=0; + virtual const std::set &getTriggerContents() const = 0; // Set of required neighbors (trigger doesn't happen if none are found) // Empty = do not check neighbors - virtual std::set getRequiredNeighbors() - { return std::set(); } + virtual const std::set &getRequiredNeighbors() const = 0; // Trigger interval in seconds virtual float getTriggerInterval() = 0; // Random chance of (1 / return value), 0 is disallowed