aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin/settingtypes.txt4
-rw-r--r--minetest.conf.example5
-rw-r--r--src/client.cpp9
-rw-r--r--src/client.h3
-rw-r--r--src/defaultsettings.cpp1
-rw-r--r--src/settings_translation_file.cpp2
6 files changed, 22 insertions, 2 deletions
diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt
index ff17973fa..d2bdf030a 100644
--- a/builtin/settingtypes.txt
+++ b/builtin/settingtypes.txt
@@ -511,6 +511,10 @@ hud_hotbar_max_width (Maximum hotbar width) float 1.0
# Enables caching of facedir rotated meshes.
enable_mesh_cache (Mesh cache) bool false
+# Delay between mesh updates on the client in ms. Increasing this will slow
+# down the rate of mesh updates, thus reducing jitter on slower clients.
+mesh_generation_interval (Mapblock mesh generation delay) int 0 0 50
+
# Enables minimap.
enable_minimap (Minimap) bool true
diff --git a/minetest.conf.example b/minetest.conf.example
index 283dc13f1..fd76d98e0 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -594,6 +594,11 @@ enable_client_modding (Client modding) bool false
# type: bool
# enable_mesh_cache = false
+# Delay between mesh updates on the client in ms. Increasing this will slow
+# down the rate of mesh updates, thus reducing jitter on slower clients.
+# type: int min: 0 max: 50
+# mesh_generation_interval = 0
+
# Enables minimap.
# type: bool
# enable_minimap = true
diff --git a/src/client.cpp b/src/client.cpp
index 0c4819bc5..8bbaa83bd 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -157,6 +157,12 @@ QueuedMeshUpdate *MeshUpdateQueue::pop()
MeshUpdateThread
*/
+MeshUpdateThread::MeshUpdateThread() : UpdateThread("Mesh")
+{
+ m_generation_interval = g_settings->getU16("mesh_generation_interval");
+ m_generation_interval = rangelim(m_generation_interval, 0, 50);
+}
+
void MeshUpdateThread::enqueueUpdate(v3s16 p, MeshMakeData *data,
bool ack_block_to_server, bool urgent)
{
@@ -168,7 +174,8 @@ void MeshUpdateThread::doUpdate()
{
QueuedMeshUpdate *q;
while ((q = m_queue_in.pop())) {
-
+ if (m_generation_interval)
+ sleep_ms(m_generation_interval);
ScopeProfiler sp(g_profiler, "Client: Mesh making");
MapBlockMesh *mesh_new = new MapBlockMesh(q->data, m_camera_offset);
diff --git a/src/client.h b/src/client.h
index b1310424d..4a4d296f2 100644
--- a/src/client.h
+++ b/src/client.h
@@ -120,13 +120,14 @@ class MeshUpdateThread : public UpdateThread
{
private:
MeshUpdateQueue m_queue_in;
+ int m_generation_interval;
protected:
virtual void doUpdate();
public:
- MeshUpdateThread() : UpdateThread("Mesh") {}
+ MeshUpdateThread();
void enqueueUpdate(v3s16 p, MeshMakeData *data,
bool ack_block_to_server, bool urgent);
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index fbf15b2ea..396b69b3a 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -38,6 +38,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("enable_sound", "true");
settings->setDefault("sound_volume", "0.8");
settings->setDefault("enable_mesh_cache", "false");
+ settings->setDefault("mesh_generation_interval", "0");
settings->setDefault("enable_vbo", "true");
settings->setDefault("free_move", "false");
settings->setDefault("fast_move", "false");
diff --git a/src/settings_translation_file.cpp b/src/settings_translation_file.cpp
index 39223d9ce..9ec21c415 100644
--- a/src/settings_translation_file.cpp
+++ b/src/settings_translation_file.cpp
@@ -245,6 +245,8 @@ fake_function() {
gettext("Maximum proportion of current window to be used for hotbar.\nUseful if there's something to be displayed right or left of hotbar.");
gettext("Mesh cache");
gettext("Enables caching of facedir rotated meshes.");
+ gettext("Mapblock mesh generation delay");
+ gettext("Delay between mesh updates on the client in ms. Increasing this will slow\ndown the rate of mesh updates, thus reducing jitter on slower clients.");
gettext("Minimap");
gettext("Enables minimap.");
gettext("Round minimap");