Skip to main content



      Home
Home » Eclipse Projects » Sirius » AbstractTransparentImage keeps the bitmap of the image in memory
AbstractTransparentImage keeps the bitmap of the image in memory [message #1844134] Thu, 02 September 2021 08:22 Go to next message
Eclipse UserFriend
Hi,

I have discovered that Sirius keeps a bitmap of the image set on a Node in memory. The class org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.AbstractTransparentImage has a field imageData that is the bitmap of the image set on the node. This field is kept in memory to avoid too many invocations to Image.getImageData when Sirius tries to find the first opaque pixel when computing source and target anchors (see org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.util.OpaquePixelFinder)

It is problematic when the end user uses images with very high resolution. There are many potential optimizations:



  1. Sharing the cached ImageData between all instances of AbstractTransparentImage which use the same Image.
  2. Keeping the image data only when source or target anchor position is computed.
  3. Using a BitSet or a boolean array representing the alpha pixels instead of the whole bitmaps.
  4. Downsizing the cache to the real size of the image on the diagram (but this cache must be invalidated as soon as the user resizes the image).
  5. Instructing the user to not use images with high resolution


The attached Ecore Modeling Project allows to reproduce the problem. If you open the only one diagram and capture an heapdump, you can see that the bigger objects are the bitmaps kept in memory.
The attached screenshot of VisualVM highlights the issue.

The sample diagram has only 7 classes but the bitmaps (instances of ImageData) weight more than 200Mo.

Should I open an issue on the bugzilla?

Have a nice day,
Yann
Re: AbstractTransparentImage keeps the bitmap of the image in memory [message #1844261 is a reply to message #1844134] Tue, 07 September 2021 06:00 Go to previous messageGo to next message
Eclipse UserFriend
Hi Yann!

Yes, please open a bugzilla. A patch on Gerrit would be even better :)
At first glance, optimizations 1 + 3 look like they could improve the situation without adding too much complexity in terms of data lifecycle, but I have only taken a quick glance at the code.

Re: AbstractTransparentImage keeps the bitmap of the image in memory [message #1844406 is a reply to message #1844261] Mon, 13 September 2021 05:28 Go to previous message
Eclipse UserFriend
Hi Pierre-Charles

I hope you are well!

Thank you for the answer. I think I can come up with a patch using a BitSet, this will almost divide the memory consumption by 24 for images that use 3 bytes for each pixel. Delaying the computation of the BitSet on the first call of AbstractTransparentImage.getImageAlphaValue (int, int) can also provide benefits to nodes that have a border or do not have source / target edges.

Sharing the BitSet for all figures is more tricky and I don't know how to do it without another global map. The obvious candidate for keys is ImageDescriptor but the values should be WeakReferences to not retain BitSets instances into memory.

So, I will try to replace the ImageData with a BitSet and I will provide some measurements.

Have a nice day,
Yann
Previous Topic:Sirius web - how to download/upload models
Next Topic:the function [Export representations as images]of arid file
Goto Forum:
  


Current Time: Sat Nov 08 05:59:08 EST 2025

Powered by FUDForum. Page generated in 0.03710 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top