Add mesh generation delay
authornumber Zero <silverunicorn2011@yandex.ru>
Sat, 18 Feb 2017 18:53:05 +0000 (21:53 +0300)
committerparamat <mat.gregory@virginmedia.com>
Sun, 26 Mar 2017 04:50:59 +0000 (05:50 +0100)
builtin/settingtypes.txt
minetest.conf.example
src/client.cpp
src/client.h
src/defaultsettings.cpp
src/settings_translation_file.cpp

index ff17973fad92d12a40405948aebaf69e8ba8479a..d2bdf030add584118e521e155885d424a6a1b39b 100644 (file)
@@ -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
 
index 283dc13f158c86f5c991e9d8dcfafab0cddd270a..fd76d98e0bd1ea9eacf443c5b7a1fe4513b8ed9e 100644 (file)
@@ -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
index 0c4819bc5bb5d2836a902fc89c614727b96e2266..8bbaa83bd51bc021d3d5c0b3148a7008e16e5f8a 100644 (file)
@@ -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);
index b1310424d4cc08aca1a9e92e7af5e9ff1b33bcfc..4a4d296f2d42dada74fa2c08b42e23133123a728 100644 (file)
@@ -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);
index fbf15b2eae650fd66154596e1781ce0ca9f019d5..396b69b3a0671852041e072ebeae53af24150213 100644 (file)
@@ -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");
index 39223d9ce2c8ec6f680f4d7c789d96ce2c8f78b4..9ec21c415f9d4712b7ce3ecbd089bb5d978d4920 100644 (file)
@@ -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");