Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2016-09-07 16:09:55 +0300
committerJoshua Leung <aligorith@gmail.com>2016-09-07 16:14:53 +0300
commit4b65662483a6fabdf4f7b2b8f68190aaec4e38c1 (patch)
treec89cd1e4efe1abec8f4a3d8b6094be7f9e50f22b
parent5b42e07e18c9f933d5e6d267f322822cc159183d (diff)
Fix: GPencil drawing sessions now respect limits for maximum undo steps
When drawing with Grease Pencil "continous drawing" for a long time (i.e. basically, drawing a very large number of strokes), it could be possible to cause lower-specced machines to run out of RAM and start swapping. This was because there was no limit on the number of undo states that the GP undo code was storing; since the undo states grow exponentially on each stroke (i.e. each stroke results in another undo state which contains all the existing strokes AND the newest stroke), this could cause issues when taken to the extreme.
-rw-r--r--source/blender/editors/gpencil/gpencil_undo.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/source/blender/editors/gpencil/gpencil_undo.c b/source/blender/editors/gpencil/gpencil_undo.c
index 196aec894b9..7a9ad2b32c0 100644
--- a/source/blender/editors/gpencil/gpencil_undo.c
+++ b/source/blender/editors/gpencil/gpencil_undo.c
@@ -155,6 +155,29 @@ void gpencil_undo_push(bGPdata *gpd)
}
}
+ /* limit number of undo steps to the maximum undo steps
+ * - to prevent running out of memory during **really**
+ * long drawing sessions (triggering swapping)
+ */
+ /* TODO: Undo-memory constraint is not respected yet, but can be added if we have any need for it */
+ if (U.undosteps && !BLI_listbase_is_empty(&undo_nodes)) {
+ /* remove anything older than n-steps before cur_node */
+ int steps = 0;
+
+ undo_node = (cur_node) ? cur_node : undo_nodes.last;
+ while (undo_node) {
+ bGPundonode *prev_node = undo_node->prev;
+
+ if (steps >= U.undosteps) {
+ gpencil_undo_free_node(undo_node);
+ BLI_freelinkN(&undo_nodes, undo_node);
+ }
+
+ steps++;
+ undo_node = prev_node;
+ }
+ }
+
/* create new undo node */
undo_node = MEM_callocN(sizeof(bGPundonode), "gpencil undo node");
undo_node->gpd = BKE_gpencil_data_duplicate(G.main, gpd, true);