diff options
Diffstat (limited to 'canvas/source/java/perftest/PerfTest.java')
-rw-r--r-- | canvas/source/java/perftest/PerfTest.java | 344 |
1 files changed, 344 insertions, 0 deletions
diff --git a/canvas/source/java/perftest/PerfTest.java b/canvas/source/java/perftest/PerfTest.java new file mode 100644 index 000000000000..715df2559ed5 --- /dev/null +++ b/canvas/source/java/perftest/PerfTest.java @@ -0,0 +1,344 @@ +/************************************************************************* + * + * $RCSfile: PerfTest.java,v $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +import java.awt.*; +import java.awt.image.*; +import java.awt.geom.*; + + +public class PerfTest +{ + // the frame object we're generating. TODO: Remove public access. + private Frame frame; + private boolean fullscreen; + + public PerfTest() + { + fullscreen = false; + + // create a normal Java frame, and set it into fullscreen mode + frame = new javax.swing.JFrame( "PerformanceTest" ); + frame.setBounds( new Rectangle(0,0,1600,1200) ); + frame.setUndecorated( true ); + frame.setVisible( true ); + + Graphics2D graphics = (Graphics2D)frame.getGraphics(); + if( graphics.getDeviceConfiguration().getDevice().isFullScreenSupported() ) + { + System.err.println( "entering fullscreen mode" ); + graphics.getDeviceConfiguration().getDevice().setFullScreenWindow( frame ); + fullscreen = true; + } + else + { + System.err.println( "fullscreen not supported" ); + } + + graphics.dispose(); + } + + //---------------------------------------------------------------------------------- + + public void dispose() + { + if( fullscreen ) + { + Graphics2D graphics = (Graphics2D)frame.getGraphics(); + if( graphics.getDeviceConfiguration().getDevice().isFullScreenSupported() ) + { + System.err.println( "leaving fullscreen mode" ); + graphics.getDeviceConfiguration().getDevice().setFullScreenWindow( null ); + } + graphics.dispose(); + } + + if( frame != null ) + frame.dispose(); + } + + //---------------------------------------------------------------------------------- + + public static void initGraphics( Graphics2D graphics ) + { + if( graphics != null ) + { + RenderingHints hints = new RenderingHints(null); + boolean hq = true; + + if( hq ) + { + hints.add( new RenderingHints( RenderingHints.KEY_FRACTIONALMETRICS, + RenderingHints.VALUE_FRACTIONALMETRICS_ON ) ); +// hints.add( new RenderingHints( RenderingHints.KEY_ALPHA_INTERPOLATION, +// RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY) ); + hints.add( new RenderingHints( RenderingHints.KEY_ALPHA_INTERPOLATION, + RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED) ); +// hints.add( new RenderingHints( RenderingHints.KEY_INTERPOLATION, +// RenderingHints.VALUE_INTERPOLATION_BICUBIC) ); + hints.add( new RenderingHints( RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_BILINEAR) ); +// hints.add( new RenderingHints( RenderingHints.KEY_RENDERING, +// RenderingHints.VALUE_RENDER_QUALITY) ); + hints.add( new RenderingHints( RenderingHints.KEY_RENDERING, + RenderingHints.VALUE_RENDER_SPEED) ); +// hints.add( new RenderingHints( RenderingHints.KEY_STROKE_CONTROL, +// RenderingHints.VALUE_STROKE_NORMALIZE) ); + hints.add( new RenderingHints( RenderingHints.KEY_STROKE_CONTROL, + RenderingHints.VALUE_STROKE_DEFAULT) ); + hints.add( new RenderingHints( RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON) ); + } + else + { + hints.add( new RenderingHints( RenderingHints.KEY_ALPHA_INTERPOLATION, + RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED) ); + hints.add( new RenderingHints( RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_BILINEAR) ); + hints.add( new RenderingHints( RenderingHints.KEY_RENDERING, + RenderingHints.VALUE_RENDER_SPEED) ); + hints.add( new RenderingHints( RenderingHints.KEY_STROKE_CONTROL, + RenderingHints.VALUE_STROKE_DEFAULT) ); + hints.add( new RenderingHints( RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_OFF) ); + } + + // the least common denominator standard + hints.add( new RenderingHints( RenderingHints.KEY_FRACTIONALMETRICS, + RenderingHints.VALUE_FRACTIONALMETRICS_ON) ); + hints.add( new RenderingHints( RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_ON) ); + + graphics.setRenderingHints( hints ); + } + } + + public void run() + { + frame.createBufferStrategy(2); + BufferStrategy bufferStrategy = frame.getBufferStrategy(); + + if( bufferStrategy.getCapabilities().isPageFlipping() ) + System.err.println( "double buffering is using page flipping" ); + else + System.err.println( "double buffering is using blitting" ); + + int width = 1600; + int height = 1200; + Graphics2D graphics = (Graphics2D)frame.getGraphics(); + VolatileImage backBuffer = graphics.getDeviceConfiguration().createCompatibleVolatileImage(width,height); // TODO: size dynamic + BufferedImage buffer = graphics.getDeviceConfiguration().createCompatibleImage(width,height, + Transparency.TRANSLUCENT); + BufferedImage buffer2 = graphics.getDeviceConfiguration().createCompatibleImage(width,height, + Transparency.TRANSLUCENT); + BufferedImage buffer3 = graphics.getDeviceConfiguration().createCompatibleImage(width,height, + Transparency.TRANSLUCENT); + + GraphicsDevice device = graphics.getDeviceConfiguration().getDevice(); + System.err.println( "Images generated. Available vram: " + device.getAvailableAcceleratedMemory() ); + + Graphics2D bufferGraphics = (Graphics2D)buffer.getGraphics(); + Graphics2D buffer2Graphics = (Graphics2D)buffer2.getGraphics(); + Graphics2D buffer3Graphics = (Graphics2D)buffer3.getGraphics(); + Graphics2D backBufGraphics = (Graphics2D)backBuffer.getGraphics(); + + System.err.println( "Image graphics generated. Available vram: " + device.getAvailableAcceleratedMemory() ); + + // init Graphics + initGraphics( graphics ); + initGraphics( bufferGraphics ); + initGraphics( buffer2Graphics ); + initGraphics( backBufGraphics ); + + // init content + Font font = new Font( "Times", Font.PLAIN, 100 ); + Font fpsFont = new Font( "Times", Font.PLAIN, 20 ); + + bufferGraphics.setComposite( AlphaComposite.getInstance(AlphaComposite.CLEAR)); + bufferGraphics.fillRect( 0,0,width,height ); + + bufferGraphics.setComposite( AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); + bufferGraphics.setColor( Color.red ); + bufferGraphics.fillRect( 0,0,width/2,height/2 ); + bufferGraphics.setColor( Color.green ); + bufferGraphics.fillRect( width/2,0,width,height/2 ); + bufferGraphics.setColor( Color.blue ); + bufferGraphics.fillRect( 0,height/2,width/2,height ); + + buffer2Graphics.setColor( Color.red ); + buffer2Graphics.fillRect( 0,0,width/2,height/2 ); + buffer2Graphics.setColor( Color.green ); + buffer2Graphics.fillRect( width/2,0,width,height/2 ); + buffer2Graphics.setColor( Color.blue ); + buffer2Graphics.fillRect( 0,height/2,width/2,height ); + + buffer3Graphics.setColor( Color.blue ); + buffer3Graphics.fillRect( 0,0,width/2,height/2 ); + buffer3Graphics.setColor( Color.white ); + buffer3Graphics.fillRect( width/2,0,width,height/2 ); + buffer3Graphics.setColor( Color.gray ); + buffer3Graphics.fillRect( 0,height/2,width/2,height ); + + backBufGraphics.setColor( Color.white ); + backBufGraphics.fillRect(0,0,width,height); + backBufGraphics.setColor( Color.red ); + backBufGraphics.setFont( font ); + int i, turns=15; + for(i=0; i<turns; ++i) + { + backBufGraphics.drawString( "Crossfade test", width*i/turns, height*i/turns ); + } + + System.err.println( "Images filled with content. Available vram: " + device.getAvailableAcceleratedMemory() ); + + long lastTime = System.currentTimeMillis(); + int turn, numTurns = 100; + for(turn=0; turn<numTurns; ++turn) + { + // fetch the Graphics object to draw into (we're doing double + // buffering here, the content is later shown via + // bufferStrategy.show(). + Graphics2D graph = null; + + try + { + graph = (Graphics2D)bufferStrategy.getDrawGraphics(); + + try + { + // repaint background + graph.setComposite( AlphaComposite.getInstance(AlphaComposite.SRC_OVER) ); + graph.drawImage(backBuffer, 0, 0, null); + + // alpha-composite foreground on top of that + float alpha = turn/(float)numTurns; + graph.setComposite( AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha) ); + + graph.drawImage(buffer, 0, 0, null); + buffer.flush(); + graph.drawImage(buffer2, 100, 100, null); + buffer2.flush(); + + long currTime = System.currentTimeMillis(); + graph.setComposite( AlphaComposite.getInstance(AlphaComposite.SRC_OVER) ); + graph.setFont( fpsFont ); + graph.setColor( Color.black ); + String fps = new String( String.valueOf(1000.0/(currTime-lastTime)) ); + System.err.println( "Images composited. Framerate: " + fps + " fps" ); + graph.drawString( fps.substring(0,5) + " fps", 0, 20); + lastTime = currTime; + + System.err.println( "Available vram: " + device.getAvailableAcceleratedMemory() ); + } + catch( Exception e ) + { + } + + System.err.println( "Turn: " + turn ); + } + finally + { + if( graph != null ) + graph.dispose(); + } + + bufferStrategy.show(); + } + + try + { + Thread.sleep(2000); + } + catch( Exception e ) + { + } + } + + //---------------------------------------------------------------------------------- + + public static void main(String[] args) + { + // now, we're getting slightly system dependent here. + String os = (String) System.getProperty("os.name"); + + System.err.println( "System detected: " + os ); + + // tweak some speed knobs... + if( os.startsWith("Windows") ) + { + System.setProperty("sun.java2d.translaccel", "true"); + System.setProperty("sun.java2d.ddforcevram", "true"); + //System.setProperty("sun.java2d.accthreshold", "0"); + + System.err.println( "Optimizing for Windows" ); + } + else + { + System.setProperty("sun.java2d.opengl", "true"); + + System.err.println( "Optimizing for Unix" ); + } + + PerfTest test = new PerfTest(); + + test.run(); + + test.dispose(); + } + + //---------------------------------------------------------------------------------- + +} |