[Bf-blender-cvs] [8cd0ac8223a] blender-v2.93-release: Cleanup: move frame caching into functions

Campbell Barton noreply at git.blender.org
Fri May 7 10:17:49 CEST 2021


Commit: 8cd0ac8223ad22c812aa12e1fbe2e5d8928303d2
Author: Campbell Barton
Date:   Fri May 7 17:53:27 2021 +1000
Branches: blender-v2.93-release
https://developer.blender.org/rB8cd0ac8223ad22c812aa12e1fbe2e5d8928303d2

Cleanup: move frame caching into functions

===================================================================

M	source/blender/windowmanager/intern/wm_playanim.c

===================================================================

diff --git a/source/blender/windowmanager/intern/wm_playanim.c b/source/blender/windowmanager/intern/wm_playanim.c
index d7fdcc7e4af..3a3d5436b8a 100644
--- a/source/blender/windowmanager/intern/wm_playanim.c
+++ b/source/blender/windowmanager/intern/wm_playanim.c
@@ -271,6 +271,65 @@ static struct {
     .pics_size_in_memory = 0,
     .memory_limit = 0,
 };
+
+static void frame_cache_add(PlayAnimPict *pic)
+{
+  pic->frame_cache_node = BLI_genericNodeN(pic);
+  BLI_addhead(&g_frame_cache.pics, pic->frame_cache_node);
+  g_frame_cache.pics_len++;
+
+  if (g_frame_cache.memory_limit != 0) {
+    BLI_assert(pic->size_in_memory == 0);
+    pic->size_in_memory = IMB_get_size_in_memory(pic->ibuf);
+    g_frame_cache.pics_size_in_memory += pic->size_in_memory;
+  }
+}
+
+static void frame_cache_remove(PlayAnimPict *pic)
+{
+  LinkData *node = pic->frame_cache_node;
+  IMB_freeImBuf(pic->ibuf);
+  if (g_frame_cache.memory_limit != 0) {
+    BLI_assert(pic->size_in_memory != 0);
+    g_frame_cache.pics_size_in_memory -= pic->size_in_memory;
+    pic->size_in_memory = 0;
+  }
+  pic->ibuf = NULL;
+  pic->frame_cache_node = NULL;
+  BLI_freelinkN(&g_frame_cache.pics, node);
+  g_frame_cache.pics_len--;
+}
+
+/* Don't free the current frame by moving it to the head of the list. */
+static void frame_cache_touch(PlayAnimPict *pic)
+{
+  BLI_assert(pic->frame_cache_node->data == pic);
+  BLI_remlink(&g_frame_cache.pics, pic->frame_cache_node);
+  BLI_addhead(&g_frame_cache.pics, pic->frame_cache_node);
+}
+
+static bool frame_cache_limit_exceeded(void)
+{
+  return g_frame_cache.memory_limit ?
+             (g_frame_cache.pics_size_in_memory > g_frame_cache.memory_limit) :
+             (g_frame_cache.pics_len > PLAY_FRAME_CACHE_MAX);
+}
+
+static void frame_cache_limit_apply(ImBuf *ibuf_keep)
+{
+  /* Really basic memory conservation scheme. Keep frames in a FIFO queue. */
+  LinkData *node = g_frame_cache.pics.last;
+  while (node && frame_cache_limit_exceeded()) {
+    PlayAnimPict *pic = node->data;
+    BLI_assert(pic->frame_cache_node == node);
+
+    node = node->prev;
+    if (pic->ibuf && pic->ibuf != ibuf_keep) {
+      frame_cache_remove(pic);
+    }
+  }
+}
+
 #endif /* USE_FRAME_CACHE_LIMIT */
 
 static ImBuf *ibuf_from_picture(PlayAnimPict *pic)
@@ -1574,50 +1633,12 @@ static char *wm_main_playanim_intern(int argc, const char **argv)
 
 #ifdef USE_FRAME_CACHE_LIMIT
         if (ps.picture->frame_cache_node == NULL) {
-          ps.picture->frame_cache_node = BLI_genericNodeN(ps.picture);
-          BLI_addhead(&g_frame_cache.pics, ps.picture->frame_cache_node);
-          g_frame_cache.pics_len++;
-
-          if (g_frame_cache.memory_limit != 0) {
-            BLI_assert(ps.picture->size_in_memory == 0);
-            ps.picture->size_in_memory = IMB_get_size_in_memory(ps.picture->ibuf);
-            g_frame_cache.pics_size_in_memory += ps.picture->size_in_memory;
-          }
+          frame_cache_add(ps.picture);
         }
         else {
-          /* Don't free the current frame by moving it to the head of the list. */
-          BLI_assert(ps.picture->frame_cache_node->data == ps.picture);
-          BLI_remlink(&g_frame_cache.pics, ps.picture->frame_cache_node);
-          BLI_addhead(&g_frame_cache.pics, ps.picture->frame_cache_node);
-        }
-
-        /* Really basic memory conservation scheme. Keep frames in a FIFO queue. */
-        LinkData *node = g_frame_cache.pics.last;
-        while (node && (g_frame_cache.memory_limit ?
-                            (g_frame_cache.pics_size_in_memory > g_frame_cache.memory_limit) :
-                            (g_frame_cache.pics_len > PLAY_FRAME_CACHE_MAX))) {
-          PlayAnimPict *pic = node->data;
-          BLI_assert(pic->frame_cache_node == node);
-
-          if (pic->ibuf && pic->ibuf != ibuf) {
-            LinkData *node_tmp;
-            IMB_freeImBuf(pic->ibuf);
-            if (g_frame_cache.memory_limit != 0) {
-              BLI_assert(pic->size_in_memory != 0);
-              g_frame_cache.pics_size_in_memory -= pic->size_in_memory;
-              pic->size_in_memory = 0;
-            }
-            pic->ibuf = NULL;
-            pic->frame_cache_node = NULL;
-            node_tmp = node->prev;
-            BLI_freelinkN(&g_frame_cache.pics, node);
-            g_frame_cache.pics_len--;
-            node = node_tmp;
-          }
-          else {
-            node = node->prev;
-          }
+          frame_cache_touch(ps.picture);
         }
+        frame_cache_limit_apply(ibuf);
 
 #endif /* USE_FRAME_CACHE_LIMIT */



More information about the Bf-blender-cvs mailing list