reapplyCss() Is called too many times when adding a node hierarchy to the Scene

David Grieve david.grieve at oracle.com
Fri Mar 11 22:33:50 UTC 2016


There is (was?) some code in Node or Parent that was supposed to prevent 
this.
Namely, I thought I had it so CSS was applied from the parent before 
applying to the children.

It may also depend on how you add the nodes to the scene.

On 3/11/16 5:18 PM, Scott Palmer wrote:
> I think I've discovered a significant performance issue with CSS
> processing...
>
> Adding a Node hierarchy to a Scene leads to
> javafx.scene.node.setScenes(Scene, SubScene) being called.  This leads a
> walk down the Node hierarchy like so:
>
> setScenes
>   -> invalidatedScenes
>       -> scenesChanged
>           -> setScenes    // on child Nodes -- recursion
>       -> impl_reapplyCSS()
>           ->reapplyCss()
>              loops over children calling reapplyCss() on each - recursive
>
> The thing to note there is:
> * invalidatedScenes decides if it is going to call impl_reapplyCSS()
> * invalidatedScenes calls scenesChanged which calls setScenes on all
> children which leads to invalidateScenes being called recursively on the
> node hierarchy
> * invalidatedScenes calls impl_reapplyCSS()
>
> As the setScene call walks down the node hierarchy it gets to a leaf node
> and then calls impl_reapplyCSS() which will call reapplyCss() recursively.
> Since when reapplyCss() returns the cssFlag for the node will be set back
> to UPDATE, so when the parent calls impl_reapplyCSS()  the CSS is
> recursively applied to the Nodes that just had CSS applied!
>
> Am I missing something?
>
> I made a quick test case where I add a VBox containing another VBox
> containing a Rectangle to the Scene when I press a button.  I can confirm
> that reapplyCss() is called THREE times for the Rectangle, twice for the
> "middle" VBox, and once on the "top" VBox.
>
> Obviously the deeper the hierarchy the worse this gets.
>
> Scott



More information about the openjfx-dev mailing list