GP: Fix performance problem with big files
authorAntonioya <blendergit@gmail.com>
Mon, 10 Sep 2018 18:24:05 +0000 (20:24 +0200)
committerAntonioya <blendergit@gmail.com>
Mon, 10 Sep 2018 18:24:37 +0000 (20:24 +0200)
During drawing, the depsgrah was tagged to update and this produced a full copy of the datablock. This tag was done in order to get the right data in drawing engine, but this added a great overhead while drawing and the response of the pen was not good.

Now, the depsgraph is not tagged and the drawing engine uses the original copy data of the buffer datablock. This is not a problem because only can draw in one window at time.

release/scripts/addons
source/blender/draw/engines/gpencil/gpencil_draw_utils.c
source/blender/editors/gpencil/gpencil_paint.c

index 6c3a46dc113de870a03191e4c0685238b0823acd..371960484a38fc64e0a2635170a41a0d8ab2f6bd 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 6c3a46dc113de870a03191e4c0685238b0823acd
+Subproject commit 371960484a38fc64e0a2635170a41a0d8ab2f6bd
index 1e24b33746686ef3e9c05a7d113f87002a3f94c3..39ab49cde28be2b2d733935024789770199a8cf8 100644 (file)
@@ -906,7 +906,10 @@ void DRW_gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data, void *vedata, T
        GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
        Brush *brush = BKE_brush_getactive_gpencil(ts);
-       bGPdata *gpd = ob->data;
+       bGPdata *gpd_eval = ob->data;
+       /* need the original to avoid cow overhead while drawing */
+       bGPdata *gpd = (bGPdata *)DEG_get_original_id(&gpd_eval->id);
+
        MaterialGPencilStyle *gp_style = NULL;
 
        float obscale = mat4_to_scale(ob->obmat);
index 4ce3899e288c65ae20befcb8f28feacdd5302e09..14b7bfc4e1cd9424e6979497697c454127f53e42 100644 (file)
@@ -604,9 +604,6 @@ static short gp_stroke_addpoint(
                        gpd->runtime.sbuffer_size = 2;
                }
 
-               /* tag depsgraph to update object */
-               DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
-
                /* can keep carrying on this way :) */
                return GP_STROKEADD_NORMAL;
        }
@@ -739,9 +736,6 @@ static short gp_stroke_addpoint(
                        }
                }
 
-               /* tag depsgraph to update object */
-               DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
-
                /* check if another operation can still occur */
                if (gpd->runtime.sbuffer_size == GP_STROKE_BUFFER_MAX)
                        return GP_STROKEADD_FULL;
@@ -833,9 +827,6 @@ static short gp_stroke_addpoint(
                if (gpd->runtime.sbuffer_size == 0)
                        gpd->runtime.sbuffer_size++;
 
-               /* tag depsgraph to update object */
-               DEG_id_tag_update(&gpd->id, OB_RECALC_DATA);
-
                return GP_STROKEADD_NORMAL;
        }