As mentionned at the beginning of the thread, in FX8 you can roll your
custom implementation. I did not yet had the time to test the changes
Jim made :-(

Tom

On 27.07.17 13:41, 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 you
> jose
> 
> 
> ------------------------------------------------------------------------
> On ‎Wednesday‎, ‎May‎ ‎24‎, ‎2017‎ ‎08‎:‎38‎:‎41‎ ‎PM‎ ‎EDT, Jim Graham
> <james.gra...@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
>>>>
>>
>>


-- 
Thomas Schindl, CTO
BestSolution.at EDV Systemhaus GmbH
Eduard-Bodem-Gasse 5-7, A-6020 Innsbruck
http://www.bestsolution.at/
Reg. Nr. FN 222302s am Firmenbuchgericht Innsbruck

Reply via email to