Bugfix [#31735] Performance issue related to object parenting to armature

In the file included with the bugreport, framerates were dropping from 60fps to
11fps for an armature with several lattices parented, and a 5fps drop everytime
an object was parented to the armature.

Upon (re-)inspection of the code, it became apparent that this was being caused
by a block of code that would recalculate the parent (perhaps recursively) as it
thought the parent state was for the wrong timestamp. However, the timestamps
this was using was never really updated (except for a single place, which set it
to a single fixed value to force recalculations to take place), which meant that
this branch was run all the time. AFACT, this is a remnant from some of the old
timeoffset stuff + pre-Depsgraph timestamping hacks that are no longer used/set.
This commit is contained in:
Joshua Leung
2012-06-07 05:29:10 +00:00
parent ebb2dc84fc
commit e69ec8be55
3 changed files with 2 additions and 28 deletions

View File

@@ -1927,11 +1927,6 @@ static int where_is_object_parslow(Object *ob, float obmat[4][4], float slowmat[
void BKE_object_where_is_calc_time(Scene *scene, Object *ob, float ctime)
{
float slowmat[4][4] = MAT4_UNITY;
float stime = ctime;
/* new version: correct parent+vertexparent and track+parent */
/* this one only calculates direct attached parent and track */
/* is faster, but should keep track of timeoffs */
if (ob == NULL) return;
@@ -1941,21 +1936,8 @@ void BKE_object_where_is_calc_time(Scene *scene, Object *ob, float ctime)
if (ob->parent) {
Object *par = ob->parent;
/* hurms, code below conflicts with depgraph... (ton) */
/* and even worse, it gives bad effects for NLA stride too (try ctime != par->ctime, with MBlur) */
if (stime != par->ctime) {
// only for ipo systems?
Object tmp = *par;
if (par->proxy_from) ; // was a copied matrix, no where_is! bad...
else BKE_object_where_is_calc_time(scene, par, ctime);
solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
*par = tmp;
}
else
solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
/* calculate parent matrix */
solve_parenting(scene, ob, par, ob->obmat, slowmat, 0);
/* "slow parent" is definitely not threadsafe, and may also give bad results jumping around
* An old-fashioned hack which probably doesn't really cut it anymore
@@ -1974,10 +1956,7 @@ void BKE_object_where_is_calc_time(Scene *scene, Object *ob, float ctime)
bConstraintOb *cob;
cob = constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
/* constraints need ctime, not stime. Some call BKE_object_where_is_calc_time and bsystem_time */
solve_constraints(&ob->constraints, cob, ctime);
constraints_clear_evalob(cob);
}

View File

@@ -610,8 +610,6 @@ void BKE_scene_set_background(Main *bmain, Scene *scene)
/* not too nice... for recovering objects with lost data */
//if (ob->pose == NULL) base->flag &= ~OB_POSEMODE;
ob->flag = base->flag;
ob->ctime = -1234567.0; /* force ipo to be calculated later */
}
/* no full animation update, this to enable render code to work (render code calls own animation updates) */
}

View File

@@ -6578,9 +6578,6 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* no return after this point, otherwise leaks */
view3d_cached_text_draw_begin();
/* patch? children objects with a timeoffs change the parents. How to solve! */
/* if ( ((int)ob->ctime) != F_(scene->r.cfra)) BKE_object_where_is_calc(scene, ob); */
/* draw motion paths (in view space) */
if (ob->mpath && (v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
bAnimVizSettings *avs = &ob->avs;