aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/clientiface.cpp12
-rw-r--r--src/clientiface.h15
2 files changed, 23 insertions, 4 deletions
diff --git a/src/clientiface.cpp b/src/clientiface.cpp
index bb25a4265..49b668cf0 100644
--- a/src/clientiface.cpp
+++ b/src/clientiface.cpp
@@ -328,8 +328,15 @@ void RemoteClient::GetNextBlocks (
continue;
}
+ /*
+ Check occlusion cache first.
+ */
+ if (m_blocks_occ.find(p) != m_blocks_occ.end())
+ continue;
+
if (m_occ_cull && !block_not_found &&
env->getMap().isBlockOccluded(block, cam_pos_nodes)) {
+ m_blocks_occ.insert(p);
continue;
}
}
@@ -395,8 +402,11 @@ queue_full_break:
}
}
- if (new_nearest_unsent_d != -1)
+ if (new_nearest_unsent_d != -1 && m_nearest_unsent_d != new_nearest_unsent_d) {
m_nearest_unsent_d = new_nearest_unsent_d;
+ // if the distance has changed, clear the occlusion cache
+ m_blocks_occ.clear();
+ }
}
void RemoteClient::GotBlock(v3s16 p)
diff --git a/src/clientiface.h b/src/clientiface.h
index cda01650b..261c09fce 100644
--- a/src/clientiface.h
+++ b/src/clientiface.h
@@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <list>
#include <vector>
#include <set>
+#include <unordered_set>
#include <memory>
#include <mutex>
@@ -379,7 +380,15 @@ private:
List of block positions.
No MapBlock* is stored here because the blocks can get deleted.
*/
- std::set<v3s16> m_blocks_sent;
+ std::unordered_set<v3s16> m_blocks_sent;
+
+ /*
+ Cache of blocks that have been occlusion culled at the current distance.
+ As GetNextBlocks traverses the same distance multiple times, this saves
+ significant CPU time.
+ */
+ std::unordered_set<v3s16> m_blocks_occ;
+
s16 m_nearest_unsent_d = 0;
v3s16 m_last_center;
v3f m_last_camera_dir;
@@ -399,7 +408,7 @@ private:
Block is removed when GOTBLOCKS is received.
Value is time from sending. (not used at the moment)
*/
- std::map<v3s16, float> m_blocks_sending;
+ std::unordered_map<v3s16, float> m_blocks_sending;
/*
Blocks that have been modified since blocks were
@@ -409,7 +418,7 @@ private:
List of block positions.
*/
- std::set<v3s16> m_blocks_modified;
+ std::unordered_set<v3s16> m_blocks_modified;
/*
Count of excess GotBlocks().