Editing an object that is referenced in a disabled modifier (of another object) forces the other modifiers on the same stack to update #73199
Labels
No Label
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset Browser
Interest
Asset Browser Project Overview
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Collada
Interest
Compatibility
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
EEVEE
Interest
EEVEE & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest
Import Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overlay
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest
Wayland
Interest
Workbench
Interest: X11
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Module
Animation & Rigging
Module
Core
Module
Development Management
Module
EEVEE & Viewport
Module
Grease Pencil
Module
Modeling
Module
Nodes & Physics
Module
Pipeline, Assets & IO
Module
Platforms, Builds & Tests
Module
Python API
Module
Render & Cycles
Module
Sculpt, Paint & Texture
Module
Triaging
Module
User Interface
Module
VFX & Video
Platform
FreeBSD
Platform
Linux
Platform
macOS
Platform
Windows
Priority
High
Priority
Low
Priority
Normal
Priority
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
No Milestone
No project
No Assignees
21 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: blender/blender#73199
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
System Information
Operating system: Windows-7-6.1.7601-SP1 64 Bits
Graphics card: GeForce GTX 660 Ti/PCIe/SSE2 NVIDIA Corporation 4.5.0 NVIDIA 441.20
Blender Version
Broken: version: 2.82 (sub 6), branch: master, commit date: 2020-01-15 21:07, hash:
689a873029
Short description of error
When there are two Boolean modifiers, and the second one is disabled, editing its shape still recalculates the Boolean operation if the first one is enabled.
Even when both modifiers are disabled, editing their shapes is slower than editing the same shape that is not targeted by a Boolean modifier.
As an example:
2020-01-17_18-02-50.mp4
Exact steps for others to reproduce the error
Added subscriber: @Vyach
#102361 was marked as duplicate of this issue
#88332 was marked as duplicate of this issue
#81871 was marked as duplicate of this issue
#80892 was marked as duplicate of this issue
#79693 was marked as duplicate of this issue
#79147 was marked as duplicate of this issue
#79047 was marked as duplicate of this issue
#77956 was marked as duplicate of this issue
#71490 was marked as duplicate of this issue
#75646 was marked as duplicate of this issue
Changed status from 'Needs Triage' to: 'Confirmed'
Added subscriber: @dr.sybren
I've replaced the example file that's slightly easier to use for debugging:
Cube.002
when looking through the depsgraph plots, soCube.LeftBool
makes more sense)I can confirm the reported behaviour, and IMO it's indeed a bug. The performance of editing the
Cube.LeftBool
mesh should IMO be independent of whether the boolean modifier targetingCube.RightBool
is active.Added subscribers: @Sergey, @mont29
Issue here is that for the depsgraph, it has no knowledge whether the modifier is disabled or not, so it keeps following the rules established by the relations generated in
updateDepsgraph()
modifier's callback.We could imagine something like calling
DEG_relations_tag_update()
when enabling/disabling a modifier's "visibility", and then check in the variousupdateDepsgraph()
callbacks whether modifier is enabled or not... But that does not seem to go along current design really,updateDepsgraph()
is not even aware of evaluation context at all currently (which makes sense).Think we need depsgraph mastermind lights here before we do anything, @Sergey?
Also, this is definitively not a bug, things are working as expected in current design afaikt, and not how simple it will be to change that behavior..
This is indeed a known issue.
There is no easy solution here, since modifier "visibility" can be driver/animated. So if we want to be smart and completely remove relations from disabled modifiers then we will very quickly run into feedback loop: we need to know whether modifier is enabled or not during dependency graph construction, but to know that we need to evaluate dependency graph.
One possible solution is to have heuristic similar to collections: ignore collections which are not visible and which visibility is not animated/driven. But that' s an optimization rather than a bug fix.
@Sergey
Anyway, I'll be happy with such optimisation, because mostly I work with static scenes and sculpts.
Added subscriber: @lichtwerk
Isnt this the same as {#71490}?
Also had a play there with adding relations conditionally (but not the complete way as @Sergey suggested...), see P1162
If these reports should be merged [I think they should], should we do it by merging #71490 into this one? [comments here are much more to the point...]
Added subscribers: @hadrien, @VincentBlankfield
I think merging #71490 here is a good idea indeed.
Switched off Boolean modifier still recalculates if there is second one, that switched onto Switched off modifier still recalculates if there is second one, that switched onAdded subscribers: @FrancoisRimasson, @GabrielMoro, @M.Pivetta, @ZachHixson, @mano-wii
Thanks for the merge I wasn't sure the issue affected all modifiers.
That makes sense. I imagine depsgraph can't evaluate relations up to the point where it knows whether or not the modifier is enabled (if driven/animated), and then decide to evaluate it or not ? Surely you've explored this already, probably pointless to suggest it.
In any case, I know I would benefit greatly from this optimization : for most scenes my modifiers' states are usually static (that wouldn't apply to character rigs). My exact case is, I have a short script that checks for a specific lattice modifier on all mesh objects and toggles it to gain performance - at least that's what I expected to happen, but performance stays the same hence the bug report.
Yep, It looks smart and proper way to fix it. Anyway In most cases modifiers are static.
I will wait this great improvement.
Added subscriber: @thomason1005
Idk if it is correct place, but I have this bit of info about modifiers unnecessary recalculation,
may be it can help to check Blender`s behavior more precisely.
untitled.blend
2020-06-25_20-18-32.mp4
Added subscriber: @mattli911
Added subscriber: @jaggz
Added subscriber: @karja
Here is another example. Even if you apply Subsurf, switched Mirror will be calculated on every move. You can test it with this file (if lags are not so noticable — increase subdiv)
MadMirror.blend
2.79 has small but noticable slowdown in this case. 2.9 have heavy lags.
Is it the same problem? It is very annoying, and become more dramatic, because mirror duplicate geometry instead instancing it.
Added subscriber: @dfelinto
Hi @Vyach - this is already marked as known issue, so although more information can help, the report already has all the information a developer would need to look at it. In your case you can just report your issue as a new bug, and the triaging team can handle the investigation and eventually merge the tasks if it comes to that. Just please refer to this task when opening a new one.
@dfelinto Got it! I thought this was exact the same issue, so I didn`t new report. But if U suggest so, I'll try.
Added subscriber: @3di
Added subscribers: @viadvena, @iss
Of course optimization/design.
But very important optimization, that will affect total performance much.
I hope, this will be fixed once.
I suppose, this is the same issue.
2020-11-06_17-56-43.mp4
**Crucial Bug!**With bugs like this one Blender stay too far from proprietary apps. It's confusing me how often new releases coming but bugs that corrupt whole workflow isn't resolving for so long. I hope devs will take all efforts to squash this bug and others.
If we can flag modifiers as targets/dependencies of drivers, that could allow at least a workable solution.
In fact, if that's possible, a little notification of it being such a target would be useful, maybe with a mouseover:
"This modifier (or its visibility) is controlled by drivers. It will still be calculated even if you disable its visibility."
Added subscriber: @jstaniek
Fi>>! In #73199#876123, @Sergey wrote:
My thoughts 16 months later: fixing critical performance degradation versus animation features.
It depends how we define meaning of the visibility. If we separate the "viewport/design-time" meaning of the visibility flag from the "animation/render-time" visibility we might find a solution at conceptual level.
Is it true that Blender 2.7 or older had no such issue or not so clearly noticeable? As a heavy user of booleans with hi-poly I remember using the modifier visibility was a help there (as well as for subdiv, etc).
@jstaniek so changing driver-values should also count as «animation time».
As stupid person I can`t understand why checking modifier == executing modifier.
Then, there should be parallel method to check it without touching depsgraph.
Or even just memorize, whats animated/drivered and what is not, and only check it on load.
Then update only when user make something animated
Added subscriber: @vasiln
Switched off modifier still recalculates if there is second one, that switched onto Object referenced in a disabled modifier still force the other modifiers on the stack to updateAdded subscribers: @HooglyBoogly, @lone_noel
Added subscriber: @EnzioProbst
[Edited to correct] I presume modifier visibility is rarely used by drivers, although possibly heavily by some users / in some projects.
Perhaps I'm not understanding the implications correctly, but isn't there some balance that can be reached here? What about a default, toggleable from a Modifier's pulldown menu, that INCLUDES it in depsgraph updates (opt-in seems like a good default). Additionally, if you manually add a driver to a visibility/renderability, it can auto-toggle it on for you; however, if you're using python/drivers to "externally" modify it, you have to go turn it on, or have the "default" preference checked.
So, in prefs somewhere: "- [x] Modifier dependency graph test default" <-- no clue what to call this.
Seems like a strange thing to be unable to resolve, and it impacts a lot of people who are working on editing things that are slow with their modifiers, and they only want it later when they enable it, or during render.
Object referenced in a disabled modifier still force the other modifiers on the stack to updateto Editing an object that is referenced in a disabled modifier (of another object) forces the other modifiers on the same stack to updateAdded subscribers: @kursadk, @PratikPB2123
Added subscriber: @F_Scociety
We really need some sort of performance option here that can be toggled while editing. I am working with very complex models in terms of modifier stacks. Lots of sub-surf and booleans. Any edit I make grinds my PC to a halt making it impossible to edit anything without going through and disabling all the modifiers. What is truly needed is a way to edit (optionally) without updating all the modifier dependencies until you exit edit mode. Even in object mode, simple translate, scale, etc. would benefit greatly from this.
This is still happening to me in blender 4.1.
I have numerous objects with boolean modifiers, and all the modifiers have viewport rendering turned off, and the objects themselves are hidden too. All of them.
I experience a massive slowdown editing any of the objects in any way.