Fix T37898: blenderplayer painfully slow in recent builds
authorSergey Sharybin <sergey.vfx@gmail.com>
Sun, 22 Dec 2013 09:26:59 +0000 (15:26 +0600)
committerSergey Sharybin <sergey.vfx@gmail.com>
Sun, 22 Dec 2013 09:26:59 +0000 (15:26 +0600)
Issue was caused by recent image cache rewrite and root of
the issue goes to the fact that blender player doesn't
initialize cache limiter and it uses 32meg of memory only.

This leads to infinite image loading/freeing.

For now disabled cache limiter in game engine, this brings
back old behavior.

In theory we might be smarter here, but better caching
policy is to be discussed.

intern/memutil/MEM_CacheLimiter.h
intern/memutil/MEM_CacheLimiterC-Api.h
intern/memutil/intern/MEM_CacheLimiterC-Api.cpp
source/gameengine/GamePlayer/ghost/CMakeLists.txt
source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
source/gameengine/GamePlayer/ghost/SConscript

index 88e06833b4ae8bdaa603e557ed9ec54aed2f4b1c..bbe6ace24563fcfa4fc0f0f1285ba71e0cc7eaf4 100644 (file)
@@ -69,6 +69,8 @@ class MEM_CacheLimiter;
 extern "C" {
        void MEM_CacheLimiter_set_maximum(size_t m);
        size_t MEM_CacheLimiter_get_maximum();
+       void MEM_CacheLimiter_set_disabled(bool disabled);
+       bool MEM_CacheLimiter_is_disabled(void);
 };
 #endif
 
@@ -177,8 +179,13 @@ public:
 
        void enforce_limits() {
                size_t max = MEM_CacheLimiter_get_maximum();
+               bool is_disabled = MEM_CacheLimiter_is_disabled();
                size_t mem_in_use, cur_size;
 
+               if (is_disabled) {
+                       return;
+               }
+
                if (max == 0) {
                        return;
                }
index a6a3ec85777c9f3c0bbc79349f7f13f82b028e45..ce7782e3183163ae8a08d631c22ce0f27f15870d 100644 (file)
@@ -53,6 +53,8 @@ typedef bool (*MEM_CacheLimiter_ItemDestroyable_Func) (void*);
 #ifndef __MEM_CACHELIMITER_H__
 void MEM_CacheLimiter_set_maximum(size_t m);
 size_t MEM_CacheLimiter_get_maximum(void);
+void MEM_CacheLimiter_set_disabled(bool disabled);
+bool MEM_CacheLimiter_is_disabled(void);
 #endif /* __MEM_CACHELIMITER_H__ */
 
 /**
index 6156b511f014b5159b2151cf0a3d5bac36593dfa..f6f1fe419d4aa6ae7b06f79153689ed4c92e1d11 100644 (file)
@@ -29,6 +29,8 @@
 #include "MEM_CacheLimiter.h"
 #include "MEM_CacheLimiterC-Api.h"
 
+static bool is_disabled = false;
+
 static size_t & get_max()
 {
        static size_t m = 32 * 1024 * 1024;
@@ -45,6 +47,16 @@ size_t MEM_CacheLimiter_get_maximum()
        return get_max();
 }
 
+void MEM_CacheLimiter_set_disabled(bool disabled)
+{
+       is_disabled = disabled;
+}
+
+bool MEM_CacheLimiter_is_disabled(void)
+{
+       return is_disabled;
+}
+
 class MEM_CacheLimiterHandleCClass;
 class MEM_CacheLimiterCClass;
 
index 6a5d97e8ede600f13e8fe363bffa0c8780624b77..df752799c2c320dc8d7dd07a4bf50faef311370d 100644 (file)
@@ -50,6 +50,7 @@ set(INC
        ../../../../intern/ghost
        ../../../../intern/guardedalloc
        ../../../../intern/string
+       ../../../../intern/memutil
 )
 
 set(INC_SYS
index 14b5bca1101dd8e1fcd0df3bafb678beb0e33c84..b04dbc75fe43739b8023b4095d5397778d4cc8b6 100644 (file)
@@ -52,6 +52,8 @@ extern "C"
 {
 #endif  // __cplusplus
 #include "MEM_guardedalloc.h"
+#include "MEM_CacheLimiterC-Api.h"
+
 #include "BLI_threads.h"
 #include "BLI_mempool.h"
 #include "BLI_blenlib.h"
@@ -437,6 +439,7 @@ int main(int argc, char** argv)
        free_main(G.main);
        G.main = NULL;
 
+       MEM_CacheLimiter_set_disabled(true);
        IMB_init();
        BKE_images_init();
        BKE_modifier_init();
index 1b1d1fc1d91243f595cb09625682cfdb7a11a8bb..3e8ab3d0dd71c7e07e122eaf0eb8dc10df2c4a2a 100644 (file)
@@ -41,6 +41,7 @@ incs = [
     '#intern/string',
     '#intern/ghost',
     '#intern/guardedalloc',
+    '#intern/memutil',
     '#intern/moto/include',
     '#intern/container',
     '#intern/audaspace/intern',