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.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
>>>
> 
> 

Reply via email to