javafx.scene.shape.Path (memory) inefficient PathElements

Kevin Rushforth kevin.rushforth at oracle.com
Thu Jul 27 12:07:03 UTC 2017


No, this fix hasn't yet been reviewed and pushed. When it is it will go 
into JDK 10.

-- Kevin


Jose Martinez wrote:
> Just curious, did this make it to the 8u144 release?  If not, any idea which release (or when) we can expect it?
> Thank youjose
>
>
> On ‎Wednesday‎, ‎May‎ ‎24‎, ‎2017‎ ‎08‎:‎38‎:‎41‎ ‎PM‎ ‎EDT, Jim Graham <james.graham at oracle.com> wrote:
>
> Thanks Tom, I've already posted a patch for 8180938 (lazy property creation).  Check it out and let me know how it 
> performs for you.
>
> I have a couple of changes to make to it (and an independent memory usage test to write) before I send it out for formal 
> review...
>
>             ...jim
>
> On 5/24/17 3:42 AM, Tom Schindl wrote:
>   
>> Hi,
>>
>> I created:
>> - https://bugs.openjdk.java.net/browse/JDK-8180935
>> - https://bugs.openjdk.java.net/browse/JDK-8180938
>>
>> I'll work on a showcase to find out how much memory one can save.
>>
>> Tom
>>
>> On 04.05.17 23:33, Jim Graham wrote:
>>     
>>> Hi Tom,
>>>
>>> Those look like good suggestions.  I would file bugs in JBS and create
>>> them separately:
>>>
>>> - Bug for lazy property creation in path elements
>>> - Feature request for lower-memory paths
>>>
>>> Did you benchmark how much the lazy properties, on their own, would save
>>> your application?
>>>
>>>                   ...jim
>>>
>>> On 5/4/17 2:22 PM, Tom Schindl wrote:
>>>       
>>>> Hi,
>>>>
>>>> We are currently working on a PDF-Rendering library in JavaFX and we
>>>> need to draw glyphs using the JavaFX Path API (there are multiple
>>>> reasons why we don't use the Text-Node and or Canvas).
>>>>
>>>> When drawing a page full of Text this means that we have a Path-Object
>>>> with gazillions of MoveTo and CubicCurveTo elements who sum up to 30MB
>>>> just to represent them in the SG because PathElements store their
>>>> information in properties and forcefully intialize them in their
>>>> constructor.
>>>>
>>>> The only public API to work around this problem is to construct a
>>>> StringBuffer and use SVGPath which means:
>>>> * it takes time to construct the SVG-Path-String
>>>> * it takes time to parse the SVG-Path-String in JavaFX
>>>>
>>>> As an experiment (and because we are still on Java8 we can easily do
>>>> that) was that we created our own Shape-Subclass who:
>>>> * uses floats (there's no reason to use double in the SG when the
>>>>     backing API - Path2D - is float based)
>>>> * passes the floats directly to the Path2D/NGPath API
>>>>
>>>> Guess what: We now need 2.5MB / page which means 27.5MB is the overhead
>>>> added by the current Path-API - ouch!
>>>>
>>>> I think a fairly low hanging memory optimization for the PathElement
>>>> would be to create properties lazy (only if someone access the property).
>>>>
>>>> For MoveTo this would mean the following minimal change (eg for the
>>>> x-value):
>>>>
>>>> private DoubleProperty x;
>>>> private double _x;
>>>>
>>>> public final void setX(double value) {
>>>>     if (x != null) {
>>>>       xProperty().set(value);
>>>>     } else {
>>>>       _x = value;
>>>>       u();
>>>>     }
>>>> }
>>>>
>>>> public final double getX() {
>>>>     return x == null ? _x : x.get();
>>>> }
>>>>
>>>> public final DoubleProperty xProperty() {
>>>>     if (x == null) {
>>>>       x = new DoublePropertyBase(_x) {
>>>>
>>>>         @Override
>>>>         public void invalidated() {
>>>>           u();
>>>>         }
>>>>
>>>>         @Override
>>>>         public Object getBean() {
>>>>           return MoveTo.this;
>>>>         }
>>>>
>>>>         @Override
>>>>         public String getName() {
>>>>           return "x";
>>>>         }
>>>>     };
>>>>     }
>>>>     return x;
>>>> }
>>>>
>>>> I guess 99% of the code out there never access the Property so the small
>>>> footprint added by the primitive field is justifiable.
>>>>
>>>> This still has the overhead of all the needless PathElement objects
>>>> hanging around so another idea is to have a 3rd SG-Path-Type who
>>>> strictly uses the float-Primitives with a similar API to Path2D (in fact
>>>> it only acts as a public API to Path2D).
>>>>
>>>> Thoughts?
>>>>
>>>> Tom
>>>>
>>>>         
>>     


More information about the openjfx-dev mailing list