c6c7d3d8c4f1295dcae3918788150fc80c6c0807
This is a performance improvement when moving a bunch of keys on the same `FCurve` in heavy scenes. When moving keys in such a way that the `BezTriple` array of the FCurve has to be sorted, the pointers of `TransInfo` also have to be updated. This used to happen by doing a nested loop over all `BeztMap` and all `TransData2D`. There was a bit of optimization with the `blender::Vector<bool> adjusted` which stored if a `TransData2D` has been fixed yet. But in general the complexity was still `BeztMap.size() * TransData.size()`. There are two optimizations that can be done here. * Skip any BeztMap if `old_index == new_index`. If the Key is not going to move any pointers to it will still be valid. * Use a `Map<float *, int>` built beforehand to quickly get the `TransData2D` that needs updating instead of searching. The `int` in this case is the index to the `TransData2D` array. Doing this reduces the complexity to `BeztMap.size() + TransData.size()`. Measurements of `beztmap_to_data` | - | Before | After | | - | - | - | | Moving 1 key of 1 FCurve | ~24000 ns | ~5800ns | | Moving ~1000 keys of 1 FCurve | 17ms | 0.02ms | Measurements of `remake_graph_transdata` | - | Before | After | | - | - | - | | Moving 1 key of 279 FCurves | 290ms | 22ms | | Moving ~300 keys of 279 FCurves | 82 **SECONDS** | 80ms | Test file used https://download.blender.org/ftp/sybren/animation-rigging/heavy_mocap_test.blend The deeper technical explanation. `TransInfo` has an array of `TransData`. `TransData` has pointers to the float arrays of a `BezTriple`. The `BezTriple` array is sorted by swapping data, meaning the `TransData` will now point to the wrong data in the array. This has to be updated and we can do that by using the `BeztMap`. This is all under the assumption that `BeztMap` is sorted in the exact same way as `BezTriple` otherwise this method will fail. But by doing it the same way, we can know at which index the `BezTriple` is before and after sorting. Now we just need to find the corresponding `TransData`. That can be done by comparing pointers. The `BeztMap` stores the `BezTriple` it represents and from it we can get the pointers to its `vec` 0, 1 and 2. (key and handles) Pull Request: https://projects.blender.org/blender/blender/pulls/120816
…
Blender
Blender is the free and open source 3D creation suite. It supports the entirety of the 3D pipeline-modeling, rigging, animation, simulation, rendering, compositing, motion tracking and video editing.
Project Pages
Development
License
Blender as a whole is licensed under the GNU General Public License, Version 3. Individual files may have a different, but compatible license.
See blender.org/about/license for details.
Description
Languages
C++
78%
Python
14.9%
C
2.9%
GLSL
1.9%
CMake
1.2%
Other
0.9%
