Keep track of whether or not anything was painted each frame and avoid the
extra effort of copying the back buffer to the screen if nothing actually changed. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2322 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -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;
|
package com.threerings.media;
|
||||||
|
|
||||||
@@ -422,12 +422,18 @@ public class FrameManager
|
|||||||
|
|
||||||
// paint our frame participants (which want to be handled
|
// paint our frame participants (which want to be handled
|
||||||
// specially)
|
// specially)
|
||||||
_participantPaintOp.setGraphics(_bgfx);
|
_participantPaintOp.init(_bgfx);
|
||||||
_participants.apply(_participantPaintOp);
|
_participants.apply(_participantPaintOp);
|
||||||
|
boolean ppart = _participantPaintOp.paintedSomething();
|
||||||
|
|
||||||
// repaint any widgets that have declared they need to be
|
// repaint any widgets that have declared they need to be
|
||||||
// repainted since the last tick
|
// 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) {
|
if (_displayPerf && _perfLabel != null) {
|
||||||
// render the current performance status
|
// render the current performance status
|
||||||
@@ -683,9 +689,19 @@ public class FrameManager
|
|||||||
* Sets the graphics context to which the frame participants
|
* Sets the graphics context to which the frame participants
|
||||||
* render themselves.
|
* render themselves.
|
||||||
*/
|
*/
|
||||||
public void setGraphics (Graphics g)
|
public void init (Graphics g)
|
||||||
{
|
{
|
||||||
_g = 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
|
// documentation inherited
|
||||||
@@ -693,7 +709,7 @@ public class FrameManager
|
|||||||
{
|
{
|
||||||
FrameParticipant part = (FrameParticipant)observer;
|
FrameParticipant part = (FrameParticipant)observer;
|
||||||
Component pcomp = part.getComponent();
|
Component pcomp = part.getComponent();
|
||||||
if (pcomp == null) {
|
if (pcomp == null || !part.needsPaint()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -726,6 +742,7 @@ public class FrameManager
|
|||||||
_g.translate(_bounds.x, _bounds.y);
|
_g.translate(_bounds.x, _bounds.y);
|
||||||
pcomp.paint(_g);
|
pcomp.paint(_g);
|
||||||
_g.translate(-_bounds.x, -_bounds.y);
|
_g.translate(-_bounds.x, -_bounds.y);
|
||||||
|
_painted++;
|
||||||
|
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
String ptos = StringUtil.safeToString(part);
|
String ptos = StringUtil.safeToString(part);
|
||||||
@@ -754,6 +771,9 @@ public class FrameManager
|
|||||||
/** The graphics context to which the participants render. */
|
/** The graphics context to which the participants render. */
|
||||||
protected Graphics _g;
|
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
|
/** A handy rectangle that we reuse time and again to avoid having
|
||||||
* to instantiate a new rectangle in the midst of the core
|
* to instantiate a new rectangle in the midst of the core
|
||||||
* rendering loop. */
|
* rendering loop. */
|
||||||
|
|||||||
@@ -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;
|
package com.threerings.media;
|
||||||
|
|
||||||
@@ -20,6 +20,13 @@ public interface FrameParticipant
|
|||||||
*/
|
*/
|
||||||
public void tick (long tickStamp);
|
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
|
* If a frame participant wishes also to be actively rendered every
|
||||||
* frame rather than use passive rendering (which for Swing, at least,
|
* frame rather than use passive rendering (which for Swing, at least,
|
||||||
|
|||||||
@@ -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;
|
package com.threerings.media;
|
||||||
|
|
||||||
@@ -216,13 +216,15 @@ public class FrameRepaintManager extends RepaintManager
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Paints the components that have become dirty since the last tick.
|
* 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) {
|
synchronized (this) {
|
||||||
// exit now if there are no dirty rectangles to paint
|
// exit now if there are no dirty rectangles to paint
|
||||||
if (_dirty.isEmpty()) {
|
if (_dirty.isEmpty()) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// otherwise, swap our hashmaps
|
// otherwise, swap our hashmaps
|
||||||
@@ -416,6 +418,8 @@ public class FrameRepaintManager extends RepaintManager
|
|||||||
|
|
||||||
// clear out the mapping of dirty components
|
// clear out the mapping of dirty components
|
||||||
_spare.clear();
|
_spare.clear();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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;
|
package com.threerings.media;
|
||||||
|
|
||||||
@@ -223,9 +223,21 @@ public class MediaPanel extends JComponent
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// documentation inherited from interface
|
||||||
* Returns this component, as we want to be painted with the tick.
|
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 ()
|
public Component getComponent ()
|
||||||
{
|
{
|
||||||
return this;
|
return this;
|
||||||
@@ -271,14 +283,6 @@ public class MediaPanel extends JComponent
|
|||||||
_tickPaintPending = false;
|
_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 we have no invalid rects, there's no need to repaint
|
||||||
if (!_remgr.haveDirtyRegions()) {
|
if (!_remgr.haveDirtyRegions()) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user