List scrolling is very slow in JavaFX 17

John Hendrikx john.hendrikx at gmail.com
Tue Nov 22 09:58:07 UTC 2022


I took a quick look, I didn't see any Node creation, the updateItem 
calls look pretty normal (setting some labels and a list of tags).

I downloaded the application and installed the application (it's nicely 
packaged) and clicked on "download" which shows the problematic list.  
It indeed performs badly (10 fps orso), even when showing only about 100 
items (of which 6 were visible at a time).  All items are the same 
height.  When turning on another option (snapshots) there are probably 
1000 items or more, still showing at most 6 at a time and FPS drops to 
like 2 or 3; I'd consider it pretty unusable.  It doesn't seem to 
improve after a while either.

I don't like the fact that it seems to get slower with more items in the 
list, but still only 6 showing at a time.

Is there a description somewhere of how the current implementation 
works?   Is it trying to get the sizes of all cells (eventually) to make 
an accurate scroll bar representation?  I don't quite see how that could 
possibly work without querying all cells, as a single cell could be 
large enough to influence the scroll bar size and position significantly 
even among thousands of items...

Thinking further, once a list passes a certain size, the scrollbar thumb 
will be at its minimum size, there is little point to try to get the 
exact relative sizes of position and knob then that may require 
information on all cells. Does the implementation have an option to 
switch to a more simplistic scrollbar representation (1 cell = 1 
position, regardless of size) when the number of visible cells are 
vastly outnumbered by the total number of items?

The fixedCellSize property probably will alleviate the performance 
problems, but I find it hard to use as generally I only know that my 
cells are all the same size, but I don't know what that size actually is 
as it depends on the styles used.

--John

On 22/11/2022 09:48, Johan Vos wrote:
> Hi Glavo,
>
> There are more frequent calls to updateItem() since the VirtualFlow 
> tries to gradually improve its estimation how large the total list 
> size is (rather than assuming all cells have the same size). The major 
> point is that if you override updateItem, it should not do more than 
> strictly needed (e.g. don't create a Node etc). That method should 
> return as fast as possible.
>
> There are many completely different usecases for VirtualFlow in 
> general, and it's not trivial to come up with a single implementation 
> that deals "best" with all usecases. Therefore, I recently 
> solicited for feedback and it might be good if you can give yours too?
> See 
> https://mail.openjdk.org/pipermail/openjfx-dev/2022-September/035851.html 
> for the start of the discussion.
>
> - Johan
>
>
> On Tue, Nov 22, 2022 at 9:24 AM Glavo <zjx001202 at gmail.com> wrote:
>
>     Hi,
>
>     I'm one of the maintainers of the open source project HMCL (Hello!
>     Minecraft Launcher/)/. This is a Minecraft launcher based on JavaFX.
>
>     In the past year, we have received a lot of feedback on
>     performance problems. Through performance analysis, I noticed that
>     from JavaFX 17 ea+8, the performance of list scrolling is terrible.
>
>     I analyzed the method calls and noticed that the updateItem method
>     of ListCell is called 8 times more frequently in JavaFX 17 than in
>     JavaFX 16.
>
>     I guess this is due to the following commit:
>
>     https://github.com/openjdk/jfx/commit/8e547571fb3d40df843c27fc11921b5d4765c481
>
>     I wonder if this is a bug?
>
>     Best regards,
>     Glavo
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20221122/0d22982d/attachment.htm>


More information about the openjfx-dev mailing list