During a mesh transformation in edit mode (Move, Rotate...), not the entire draw cache needs to be recreated.
But this occurs because DEG_id_tag_update(tc->obedit->data, ID_RECALC_GEOMETRY), chain a call to BKE_object_data_batch_cache_dirty_tag that tags all the batch cache to be redone
This patch proposes not tag dirty All, but only what participates in the deformation of geometry.
Depsgraph Changes:
Currently, the graph can be compared to this simplified one:
Where DEG_id_tag_update(id, ID_RECALC_GEOMETRY) triggers geom_eval_mesh or geom_eval_obj_init.
And DEG_id_tag_update(id, ID_RECALC_SELECT) triggers update_select or update_select_obj.
This patch proposes to separate "tag_dirty" from "geom_eval" and create a separate node for it (update_all in the image bellow).
In addition to adding an node to update_deform
The graph becomes something like this:
Benchmarking:
| master: | patch: | |
|---|---|---|
| large_mesh_editing: | Average: 16.727632 FPS | Average: 26.424897 FPS |
| rdata 9ms iter 26ms (frame 60ms) | rdata 0ms iter 19ms (frame 38ms) | |
| large_mesh_editing_ledge: | Average: 17.761902 FPS | Average: 28.070558 FPS |
| rdata 9ms iter 24ms (frame 56ms) | rdata 0ms iter 18ms (frame 36ms) | |
| looptris_test: | Average: 5.537827 FPS | Average: 5.456050 FPS |
| rdata 11ms iter 26ms (frame 169ms) | rdata 11ms iter 28ms (frame 172ms) | |
| subdiv_mesh_cage_and_final: | Average: 2.095824 FPS | Average: 2.140402 FPS |
| rdata 7ms iter 21ms (frame 242ms) | rdata 0ms iter 20ms (frame 237ms) | |
| rdata 7ms iter 22ms (frame 233ms) | rdata 0ms iter 21ms (frame 227ms) | |
| subdiv_mesh_final_only: | Average: 6.626541 FPS | Average: 7.974115 FPS |
| rdata 3ms iter 13ms (frame 145ms) | rdata 0ms iter 10ms (frame 122ms) | |
| subdiv_mesh_final_only_ledge: | Average: 6.590914 FPS | Average: 7.978224 FPS |
| rdata 3ms iter 13ms (frame 143ms) | rdata 0ms iter 10ms (frame 121ms) |





