Blender Git Loki

Git Commits -> Revision 11972c0

Revision 11972c0 by Sergey Sharybin (master)
June 28, 2013, 21:58 (GMT)
Towards threaded object update

This commit contains changes related on running function
BKE_object_handle_update_ex from multiple threads in order
to increase scene update time when having multiple
independent groups of objects.

Currently this required changes to two areas:

- scene.c, where scene_update_tagged_recursive is now using
threads for updating the object

There're some tricks to prevent threads from being spawned
when it's not needed:

* Threading will only happen if there're more than one CPU
core.

* Threading will happen only if there're more than single
object which needed to be updated.

There's currently one crappy part of the change: which is
freeing object caches (derivedFinal, derivedDeform and so)
from main thread. This is so because in case VBO are used
freeing DM is not thread safe. This is because DrawObject
used global array. Would look into possibility of making
that code safe later.

There're also currently some ifdef-ed debug-only code, which
helps a lot troubleshooting whether everything is working
fine. This code looks a bit ugly now, will either drop it
later or make it more cleat.

And one more thing: threaded update is CURRENTLY DISABLED.
This is because of some thread-unsafe issues discovered
while was working on this patch. Namely:

* I have once a crash in Curve module. Wasn't been able
to reproduce the crash, but could thing about some
unsafe code there.

* Virtual modifier list is not thread-safe (it uses static
variables).

* Armature modifier is also doesn't seem to be thread safe
because of storing some temporary runtime data in actual
armature.

All this issues are to be solved next.

- depsgraph.c, where i've added a function which gives list
of groups, each group contains objects and dependency is
only allowed between objects inside one group.

This is needed to make scheduling of objects easier, which
means update threads will operate on groups, and will handle
objects one-by-one inside group. Different threads will
operate on different groups.

Currently such groups will be generated on every update.
Actually, on every run of scene_update_objects_threaded which
only happens if there're objects marked for update. In the
future we could consider storing such groups in graph itself,
which will help saving CPU power on building such groups.
But this is something to be discussed with Joshua first.

P.S. If you really want to test threaded update, you'll
need to replace:

#undef USE_THREADED_UPDATE

with:

#define USE_THREADED_UPDATE

Commit Details:

Full Hash: 11972c0d829abd7d3fa86341610060f9e39e94da
SVN Revision: 57864
Parent Commit: f934825
Lines Changed: +526, -17

5 Modified Paths:

/source/blender/blenkernel/BKE_depsgraph.h (+49, -0) (Diff)
/source/blender/blenkernel/intern/depsgraph.c (+174, -0) (Diff)
/source/blender/blenkernel/intern/DerivedMesh.c (+1, -0) (Diff)
/source/blender/blenkernel/intern/scene.c (+283, -17) (Diff)
/source/blender/windowmanager/intern/wm_operators.c (+19, -0) (Diff)
Tehnyt: Miika HämäläinenViimeksi päivitetty: 07.11.2014 14:18MiikaH:n Sivut a.k.a. MiikaHweb | 2003-2021