Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarNetElementGroup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/StarNetElementGroup.cpp')
-rw-r--r--source/core/StarNetElementGroup.cpp35
1 files changed, 24 insertions, 11 deletions
diff --git a/source/core/StarNetElementGroup.cpp b/source/core/StarNetElementGroup.cpp
index 6626e2b..901eeb1 100644
--- a/source/core/StarNetElementGroup.cpp
+++ b/source/core/StarNetElementGroup.cpp
@@ -13,6 +13,8 @@ void NetElementGroup::addNetElement(NetElement* element, bool propagateInterpola
void NetElementGroup::clearNetElements() {
m_elements.clear();
+ m_filteredForRules.reset();
+ m_filteredElementsCache.clear();
}
void NetElementGroup::initNetVersion(NetElementVersion const* version) {
@@ -89,26 +91,24 @@ bool NetElementGroup::writeNetDelta(DataStream& ds, uint64_t fromVersion, NetCom
void NetElementGroup::readNetDelta(DataStream& ds, float interpolationTime, NetCompatibilityRules rules) {
if (!checkWithRules(rules)) return;
- if (m_elements.size() == 0) {
- throw IOException("readNetDelta called on empty NetElementGroup");
- } else if (m_elements.size() == 1) {
- m_elements[0].first->readNetDelta(ds, interpolationTime, rules);
+ auto& elements = filterElementsForRules(rules);
+ if (elements.size() == 0) {
+ if (m_elements.size() == 0)
+ throw IOException("readNetDelta called on empty NetElementGroup");
+ } else if (elements.size() == 1) {
+ elements[0]->readNetDelta(ds, interpolationTime, rules);
} else {
uint64_t readIndex = ds.readVlqU();
- uint64_t i = 0;
- for (auto& element : m_elements) {
- if (!element.first->checkWithRules(rules))
- continue;
+ for (uint64_t i = 0; i != elements.size(); ++i) {
if (readIndex == 0 || readIndex - 1 > i) {
if (m_interpolationEnabled)
- m_elements[i].first->blankNetDelta(interpolationTime);
+ elements[i]->blankNetDelta(interpolationTime);
} else if (readIndex - 1 == i) {
- m_elements[i].first->readNetDelta(ds, interpolationTime, rules);
+ elements[i]->readNetDelta(ds, interpolationTime);
readIndex = ds.readVlqU();
} else {
throw IOException("group indexes out of order in NetElementGroup::readNetDelta");
}
- ++i;
}
}
}
@@ -120,4 +120,17 @@ void NetElementGroup::blankNetDelta(float interpolationTime) {
}
}
+List<NetElement*>& NetElementGroup::filterElementsForRules(NetCompatibilityRules rules) {
+ if (!m_filteredForRules || m_filteredForRules != rules) {
+ m_filteredForRules = rules;
+ m_filteredElementsCache.clear();
+ m_filteredElementsCache.reserve(m_elements.size());
+ for (auto& element : m_elements) {
+ if (element.first->checkWithRules(rules))
+ m_filteredElementsCache.push_back(element.first);
+ }
+ }
+ return m_filteredElementsCache;
+}
+
}