X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scenegraph.profile%2Fsrc%2Forg%2Fsimantics%2Fscenegraph%2Fprofile%2Fcommon%2FProfileObserver.java;h=e3615d4a990a0d79bb3922b7116bd67ef7f82b42;hp=efac19055944c8a2ab3bc713dd3100647755d9f8;hb=ecfd4cc9881712d59ddfc2023db382ad4f3a9be9;hpb=44b3ebb55aec76ee0b583fef45f7215f2ee5d26a diff --git a/bundles/org.simantics.scenegraph.profile/src/org/simantics/scenegraph/profile/common/ProfileObserver.java b/bundles/org.simantics.scenegraph.profile/src/org/simantics/scenegraph/profile/common/ProfileObserver.java index efac19055..e3615d4a9 100644 --- a/bundles/org.simantics.scenegraph.profile/src/org/simantics/scenegraph/profile/common/ProfileObserver.java +++ b/bundles/org.simantics.scenegraph.profile/src/org/simantics/scenegraph/profile/common/ProfileObserver.java @@ -11,8 +11,10 @@ *******************************************************************************/ package org.simantics.scenegraph.profile.common; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -28,9 +30,11 @@ import org.simantics.scenegraph.INode; import org.simantics.scenegraph.g2d.G2DSceneGraph; import org.simantics.scenegraph.profile.EvaluationContext; import org.simantics.scenegraph.profile.ProfileEntry; +import org.simantics.scenegraph.profile.Style; import org.simantics.scenegraph.profile.impl.DebugPolicy; import org.simantics.scenegraph.profile.impl.ProfileActivationListener; import org.simantics.scenegraph.profile.request.RuntimeProfileActiveEntries; +import org.simantics.utils.datastructures.Pair; import org.simantics.utils.datastructures.disposable.IDisposable; import org.simantics.utils.threads.IThreadWorkQueue; import org.simantics.utils.threads.ThreadUtils; @@ -51,9 +55,12 @@ public class ProfileObserver implements EvaluationContext { private final Runnable notification; private final G2DSceneGraph sceneGraph; - private boolean dirty = true; - private boolean disposed = false; + private volatile boolean dirty = true; + private volatile boolean disposed = false; + private List> updates = new ArrayList<>(); + private boolean updateAll; + private ProfileActivationListener activationListener; private Map constants = new HashMap(); @@ -129,12 +136,20 @@ public class ProfileObserver implements EvaluationContext { } @Override - public void update() { + public void update(Style style, Object item) { if (DebugPolicy.DEBUG_PROFILE_OBSERVER_UPDATE) System.out.println("Profile observer marked dirty."); + + updates.add(new Pair<>(style, item)); + //updateAll = true; dirty = true; } + public void update() { + updateAll = true; + dirty = true; + } + private void perform() { dirty = false; if (DebugPolicy.DEBUG_PROFILE_OBSERVER_UPDATE) @@ -175,12 +190,32 @@ public class ProfileObserver implements EvaluationContext { // Variables.init(e, ProfileObserver.this); // } - for(ProfileEntry e : entries) { - if (DebugPolicy.DEBUG_PROFILE_OBSERVER_PERFORM) - System.out.println("Apply profile entry: " + e); - e.apply(ProfileObserver.this); + + long t0 = System.nanoTime(); + + if (updateAll) { + for(ProfileEntry e : entries) { + if (DebugPolicy.DEBUG_PROFILE_OBSERVER_PERFORM) + System.out.println("Apply profile entry: " + e); + e.apply(ProfileObserver.this); + } + updateAll = false; + updates.clear(); + } else { + List> updatesCopy = new ArrayList<>(updates); + updates.clear(); + for (Pair update : updatesCopy) { + Style style = update.first; + Object item = update.second; + + style.apply2(item, ProfileObserver.this); + } } + + long t1 = System.nanoTime(); + System.out.println((t1-t0) / 1e6); + if(dirty) { sceneGraph.setPending(ProfileObserver.this); // System.err.println("setPending, dirty=true");