On Thu, 16 Apr 2020 08:24:16 GMT, dannygonzalez <github.com+6702882+dannygonza...@openjdk.org> wrote:
>> The listeners added by `Node` are apparently internally required for >> internal properties `TreeShowing` and `TreeVisible`, and are used to take >> various decisions like whether to play/pause animations. There is also a >> couple of listeners registering on these properties in turn (in >> `PopupWindow`, `SwingNode`, `WebView` and `MediaView`). >> >> A lot of the checks for visibility / showing could easily be done by using >> the `Scene` property and checking visibility / showing status from there. >> No need for so many listeners. The other classes mentioned might register >> their own listener, instead of having `Node` do it for them (and thus >> impacting *every* node). >> >> Alternatively, `Node` may lazily register the listeners for Scene.Window and >> Window.Showing only when needed (which from what I can see is for pretty >> specific classes only, not classes that you'd see a lot in a TableView...) > > If it is of any help, I have attached a VisualVM snapshot (v1.4.4) where the > ExpressionHelper.removeListener is using 61% of the JavaFX thread whilst > running our application. > > [snapshot-1587024308245.nps.zip](https://github.com/openjdk/jfx/files/4485728/snapshot-1587024308245.nps.zip) > > If you show only the JavaFX Application thread, press the "HotSpot" and > "Reverse Calls" button you can take a look to see which classes are calling > the removeListener function. > >  @dannygonzalez Could you perhaps debug your application and take a look at how large the following array is: a random node -> `scene` -> `value` -> `window` -> `readOnlyProperty` -> `helper` -> `changeListeners`. I just tested this with a custom control displaying 200 cells on screen at once (each cell consisting of about 30 nodes itself), and I saw about 20000 change listeners registered on this single Scene Window property. However, this custom control is not creating/destroying cells beyond the initial allocation, so there wouldn't be any registering and unregistering going on, scrolling was still smooth >30 fps. ------------- PR: https://git.openjdk.java.net/jfx/pull/108