Some more information for Windows platform: The FX thread is woken up by the pulse mechanism, and then will pin down a time using `System.nanoTime`. However, the wake up process on Windows can take anywhere from 1-30 milliseconds as it by default uses a 64 Hz clock for scheduling purposes. This means that the frame time you receive for animation callbacks is wildly inaccuratel. One way to significantly improve this (on Windows) is to have your application change the timer resolution -- it can be set as high as 2000 Hz -- allowing threads (like the FX thread) to be scheduled much more quickly in response to a pulse. This is however a native call (timeBeginPeriod), and is a global change for the system (it can't be done per application).
On a Windows system, setting pulse to 120 Hz by itself probably will not show significant improvement as the animation calculations are likely still using badly calculated frame times, resulting in the animation to look stuttery. One way to improve this may be to also set "-D-com.sun.scenario.animation.fixed.pulse.length=true", but I'm not entirely sure it works in conjunction with setting the pulse duration. See https://bugs.openjdk.org/browse/JDK-8339606 for more detailed information. --John On 26/02/2025 21:33, Kevin Rushforth wrote: > Yes, I think that's the best advice for now. > > Really, though, a good RFE would be to provide a way to adapt to the > refresh rate of the monitor when vsync is being used. That's really > the point of doing vsync in the first place. > > -- Kevin > > On 2/26/2025 10:17 AM, Johan Vos wrote: >> Hi Glavo, >> >> I believe setting the javafx.animation.pulse is indeed the best way >> to increase the render frequency (or to minimize the time between 2 >> pulses). It is independent of the hardware/pipeline being used. >> Of course, you may see a higher load in the JavaFX Application Thread >> and in the Quantum Renderer, but I guess you're aware of that -- but >> even at 10 fps those threads can be under pressure (same for the GPU >> cache). >> >> - Johan >> >> >> On Wed, Feb 26, 2025 at 7:01 PM Glavo <zjx001...@gmail.com> wrote: >> >> I found that setting `javafx.animation.pulse` to a higher value >> worked for me. >> I considered setting `javafx.animation.pulse` to 120 for all >> users to get smooth animation. >> Is this the most recommended approach at this time? >> >> Glavo >> >> On Wed, Feb 26, 2025 at 3:55 AM Glavo <zjx001...@gmail.com> wrote: >> >> Hi, >> >> Recently I was investigating how to improve the user >> experience of our JavaFX applications. >> I noticed that JavaFX applications seem to be limited to >> 60fps by default, >> which makes JavaFX applications appear to animate less >> smoothly than many other applications >> when users are using high refresh rate monitors. >> In particular, we used a self-drawn title bar, which caused >> users to drag our app more slowly than dragging other >> applications. >> >> I learned that there is an undocumented property >> `javafx.animation.fullspeed` >> and that setting it to true would significantly improve the >> user experience of our application. >> While it works fine on my computer, it seems to have a lot of >> potential problems, >> such as conflicts with vsync, may have significantly higher >> CPU/GPU utilization, and has been less tested, >> so I dare not push it to users. >> There is also a property `javafx.animation.framerate` which >> seems to be safer, but it didn't work for me. >> >> So, what is the best way to get a high frame rate for a >> JavaFX application? >> Can we get more than 60fps in a JavaFX application with vsync >> enabled? >> Is it possible to make JavaFX applications adapt to the >> monitor's refresh rate without us setting it to a fixed value? >> >> Glavo >> >> >