JavaFX graphics performance
mattias.eliasson at medsa.se
Tue Apr 11 12:49:10 UTC 2017
Excessive memory usage is more of a well documented JDK problem that impacts the performance of many applications. Especially when having a large collection of instances of the same class. In C++ an array of objects are in memory similar to an array of structs. In Java they are arrays of pointers to objects on the heap.
This could of course be worked around by storing data in arrays and using classes to wrap those arrays. In one project I stored X and Y coordinates in an array. I had a class with getter and setters but also with a reference to the array and index. On top of that I had what worked similarly to a standard object pool but in fact only had a few instances of the object, changing index of a free object rather than allocating a new. For simplicity I used an array for X and another for Y.
This pattern can be refined to align data in various ways for better cache performance. And in our case there may be alignments that gives better GPU performance. After all it's usually the GPU that process our data.
Of course it would be best if the JVM had better memory management including something similar to a struct array without pointers to objects. But there would still be need to have refinements. For example is it better to have XXXYYY, XYXYXY, or perhaps YXYXYX? That in turn depends on cache infrastructure, the order data is accessed and other factors.
In order notes the main competition to JavaFX is other Java APIs such as Swing and it's Java2D. When it comes to performance we obviously have a clear winner. But JavaFX isn't shipped within major Linux distributions so it is yet considered experimental by many that use Swing. There are also competition from SWT used by Eclipse and Azureus/Vuze. Packaging is one problem but there are also UI components missing. The SWT on JavaFX implementation has a list of SWT components and their JavaFX counterpart. That list illustrates that there are a lot of work to do.
Of course once SWT on JavaFX is complete SWT will be eliminated as competition. Especially if Eclipse use JavaFX as its SWT backend. It would also mean that JavaFX is better equipped to compete with Swing as SWT already is a strong competitor to Swing.
However SWT has been held back due to stability problems which probably will not be in the way when it's based on JavaFX which is good enterprise code.
I would suggest creating a new fully sandboxed applet technology based on JavaFX instead of AWT/Swing. That of course would be incompatible with classic Applets but those are dead anyway. Make it at least as good as Flash perhaps with an IDE like the commercial flash IDE. I mean activescript vs Hotspot will not be a very fair match.
Another competitor is Unity and similar game engines. As unity is based on mono and MonoDevelop we could do something similar using Java and eclipse.
When it comes to web/client server Vaadin has been gaining a lot of ground. It's model of having a combined client and server code base using byte buddy or ASM to separate client and server into separate executables is impressive. I would like more control such as specifying @client or @server in order to control where execution take place. But more to the point I would like a JavaFX UI.
Let's take the lessons learned from both Flash and Java Applets and make something awesome. That doesn't carry "java" in the name. Like OpenFX? Or "Arrow" (yeah I'm a nerd). This including the creative tools that Flash has but perhaps also with features that Unity has.
Kevin Rushforth <kevin.rushforth at oracle.com> skrev: (10 april 2017 22:08:04 CEST)
>We are planning some performance improvements in JDK 10, mostly in the
>areas of CSS and layout. If you have specific concerns in other areas
>could look into them. Having a specific test case that shows a
>performance problem would be a good start.
>Michael Paus wrote:
>> more and more people ask me why I am still doing GUI development in
>> JavaFX instead
>> of following the mainstream and use some web technology. One of the
>> I could use in the past was performance but nowadays this does not
>> seem to be such
>> a valid argument anymore. Web technologies are catching up quickly
>> JavaFX currently
>> has not much to offer here. Actually the general drawing performance
>> is very bad compared
>> to what is in principle possible with a modern GPU. I even tried to
>> use a TriangleMesh
>> to better exploit the graphics hardware but this approach is also
>> limited by the fact that
>> a TrinangleMesh has an excessive memory usage (about 60 times its
>> nominal memory
>> consumption). I would therefore like to ask whether there are already
>> any plans for Java 10
>> to improve this situation?
Sent from my Android device with K-9 Mail. Please excuse my brevity.
More information about the openjfx-dev