Xcos: reduce the lag at the first DnD 09/17509/4
Clément DAVID [Fri, 27 Nov 2015 17:25:16 +0000 (18:25 +0100)]
The first DnD of a block is laggy as the Java classloader have to load
Batik and most the Java2D stack while Dragging. We can limit this effect by
rendering a dummy style on a worker thread at Xcos startup.

Change-Id: I5037526a176960e602598242188cca53caebe8f0

scilab/modules/xcos/src/java/org/scilab/modules/xcos/Xcos.java

index d067957..e845f76 100644 (file)
@@ -70,6 +70,9 @@ import com.mxgraph.model.mxICell;
 import com.mxgraph.util.mxEvent;
 import com.mxgraph.util.mxEventObject;
 import com.mxgraph.view.mxStylesheet;
+import javax.swing.SwingWorker;
+import org.scilab.modules.graph.ScilabCanvas;
+import org.scilab.modules.xcos.graph.swing.GraphComponent;
 
 /**
  * Xcos entry point class
@@ -114,6 +117,22 @@ public final class Xcos {
         });
 
         XConfiguration.addXConfigurationListener(new XcosConfiguration());
+
+        /*
+         * Load some classes in the background to avoid any lag on the first drag'n drop.
+         *
+         * This will setup the whole rendering stack by dummy rendering a block' style
+         */
+        (new SwingWorker<Void, Void>() {
+            @Override
+            protected Void doInBackground() throws Exception {
+                Map<String, Object> style = Xcos.getInstance().getStyleSheet().getCellStyle("CLOCK_c", new HashMap<>());
+                ScilabCanvas canvas = new GraphComponent(null).createCanvas();
+                canvas.paintSvgForegroundImage(1, 1, canvas.getImageForStyle(style));
+                return null;
+            }
+
+        }).execute();
     }
 
     /*