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");