diff --git a/src/java/com/threerings/media/FrameManager.java b/src/java/com/threerings/media/FrameManager.java index fa192757f..58ac4a700 100644 --- a/src/java/com/threerings/media/FrameManager.java +++ b/src/java/com/threerings/media/FrameManager.java @@ -1,5 +1,5 @@ // -// $Id: FrameManager.java,v 1.32 2003/01/15 02:21:07 shaper Exp $ +// $Id: FrameManager.java,v 1.33 2003/03/25 19:06:54 mdb Exp $ package com.threerings.media; @@ -422,12 +422,18 @@ public class FrameManager // paint our frame participants (which want to be handled // specially) - _participantPaintOp.setGraphics(_bgfx); + _participantPaintOp.init(_bgfx); _participants.apply(_participantPaintOp); + boolean ppart = _participantPaintOp.paintedSomething(); // repaint any widgets that have declared they need to be // repainted since the last tick - _remgr.paintComponents(_bgfx, this); + boolean pcomp = _remgr.paintComponents(_bgfx, this); + + // if we didn't paint anything, get the fork out of dodge + if (!(ppart || pcomp)) { + return; + } if (_displayPerf && _perfLabel != null) { // render the current performance status @@ -683,9 +689,19 @@ public class FrameManager * Sets the graphics context to which the frame participants * render themselves. */ - public void setGraphics (Graphics g) + public void init (Graphics g) { _g = g; + _painted = 0; + } + + /** + * Returns true if we painted at least one component in our last + * application. + */ + public boolean paintedSomething () + { + return (_painted > 0); } // documentation inherited @@ -693,7 +709,7 @@ public class FrameManager { FrameParticipant part = (FrameParticipant)observer; Component pcomp = part.getComponent(); - if (pcomp == null) { + if (pcomp == null || !part.needsPaint()) { return true; } @@ -726,6 +742,7 @@ public class FrameManager _g.translate(_bounds.x, _bounds.y); pcomp.paint(_g); _g.translate(-_bounds.x, -_bounds.y); + _painted++; } catch (Throwable t) { String ptos = StringUtil.safeToString(part); @@ -754,6 +771,9 @@ public class FrameManager /** The graphics context to which the participants render. */ protected Graphics _g; + /** The number of participants that were actually painted. */ + protected int _painted; + /** A handy rectangle that we reuse time and again to avoid having * to instantiate a new rectangle in the midst of the core * rendering loop. */ diff --git a/src/java/com/threerings/media/FrameParticipant.java b/src/java/com/threerings/media/FrameParticipant.java index c007b22a6..09ae11f8f 100644 --- a/src/java/com/threerings/media/FrameParticipant.java +++ b/src/java/com/threerings/media/FrameParticipant.java @@ -1,5 +1,5 @@ // -// $Id: FrameParticipant.java,v 1.2 2002/06/18 22:25:33 mdb Exp $ +// $Id: FrameParticipant.java,v 1.3 2003/03/25 19:06:54 mdb Exp $ package com.threerings.media; @@ -20,6 +20,13 @@ public interface FrameParticipant */ public void tick (long tickStamp); + /** + * Called immediately prior to {@link #getComponent} and then {@link + * Component#paint} on said component, to determine whether or not + * this frame participant needs to be painted. + */ + public boolean needsPaint (); + /** * If a frame participant wishes also to be actively rendered every * frame rather than use passive rendering (which for Swing, at least, diff --git a/src/java/com/threerings/media/FrameRepaintManager.java b/src/java/com/threerings/media/FrameRepaintManager.java index 00fbe01ed..29c8a1f20 100644 --- a/src/java/com/threerings/media/FrameRepaintManager.java +++ b/src/java/com/threerings/media/FrameRepaintManager.java @@ -1,5 +1,5 @@ // -// $Id: FrameRepaintManager.java,v 1.16 2002/12/09 05:00:48 shaper Exp $ +// $Id: FrameRepaintManager.java,v 1.17 2003/03/25 19:06:54 mdb Exp $ package com.threerings.media; @@ -216,13 +216,15 @@ public class FrameRepaintManager extends RepaintManager /** * Paints the components that have become dirty since the last tick. + * + * @return true if any components were painted. */ - public void paintComponents (Graphics g, FrameManager fmgr) + public boolean paintComponents (Graphics g, FrameManager fmgr) { synchronized (this) { // exit now if there are no dirty rectangles to paint if (_dirty.isEmpty()) { - return; + return false; } // otherwise, swap our hashmaps @@ -416,6 +418,8 @@ public class FrameRepaintManager extends RepaintManager // clear out the mapping of dirty components _spare.clear(); + + return true; } /** diff --git a/src/java/com/threerings/media/MediaPanel.java b/src/java/com/threerings/media/MediaPanel.java index 7bdb7d4c9..736c34c62 100644 --- a/src/java/com/threerings/media/MediaPanel.java +++ b/src/java/com/threerings/media/MediaPanel.java @@ -1,5 +1,5 @@ // -// $Id: MediaPanel.java,v 1.28 2003/02/04 03:11:43 mdb Exp $ +// $Id: MediaPanel.java,v 1.29 2003/03/25 19:06:54 mdb Exp $ package com.threerings.media; @@ -223,9 +223,21 @@ public class MediaPanel extends JComponent { } - /** - * Returns this component, as we want to be painted with the tick. - */ + // documentation inherited from interface + public boolean needsPaint () + { + // compute our average dirty regions per tick + if (_tick++ == 99) { + _tick = 0; + int dirty = IntListUtil.sum(_dirty); + Arrays.fill(_dirty, 0); + _dirtyPerTick = (float)dirty/100; + } + + return (!_tickPaintPending || _remgr.haveDirtyRegions()); + } + + // documentation inherited from interface public Component getComponent () { return this; @@ -271,14 +283,6 @@ public class MediaPanel extends JComponent _tickPaintPending = false; } - // compute our average dirty regions per tick - if (_tick++ == 99) { - _tick = 0; - int dirty = IntListUtil.sum(_dirty); - Arrays.fill(_dirty, 0); - _dirtyPerTick = (float)dirty/100; - } - // if we have no invalid rects, there's no need to repaint if (!_remgr.haveDirtyRegions()) { return;