1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
/* * @(#)BufferStrategy.java 1.11 06/02/14 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.awt.image; import java.awt.BufferCapabilities; import java.awt.Graphics; import java.awt.Image; /** * The <code>BufferStrategy</code> class represents the mechanism with which * to organize complex memory on a particular <code>Canvas</code> or * <code>Window</code>. Hardware and software limitations determine whether and * how a particular buffer strategy can be implemented. These limitations * are detectible through the capabilities of the * <code>GraphicsConfiguration</code> used when creating the * <code>Canvas</code> or <code>Window</code>. * <p> * It is worth noting that the terms <i>buffer</i> and <i>surface</i> are meant * to be synonymous: an area of contiguous memory, either in video device * memory or in system memory. * <p> * There are several types of complex buffer strategies, including * sequential ring buffering and blit buffering. * Sequential ring buffering (i.e., double or triple * buffering) is the most common; an application draws to a single <i>back * buffer</i> and then moves the contents to the front (display) in a single * step, either by copying the data or moving the video pointer. * Moving the video pointer exchanges the buffers so that the first buffer * drawn becomes the <i>front buffer</i>, or what is currently displayed on the * device; this is called <i>page flipping</i>. * <p> * Alternatively, the contents of the back buffer can be copied, or * <i>blitted</i> forward in a chain instead of moving the video pointer. * <p> * <pre> * Double buffering: * * *********** *********** * * * ------> * * * [To display] <---- * Front B * Show * Back B. * <---- Rendering * * * <------ * * * *********** *********** * * Triple buffering: * * [To *********** *********** *********** * display] * * --------+---------+------> * * * <---- * Front B * Show * Mid. B. * * Back B. * <---- Rendering * * * <------ * * <----- * * * *********** *********** *********** * * </pre> * <p> * Here is an example of how buffer strategies can be created and used: * <pre><code> * * // Check the capabilities of the GraphicsConfiguration * ... * * // Create our component * Window w = new Window(gc); * * // Show our window * w.setVisible(true); * * // Create a general double-buffering strategy * w.createBufferStrategy(2); * BufferStrategy strategy = w.getBufferStrategy(); * * // Main loop * while (!done) { * // Prepare for rendering the next frame * // ... * * // Render single frame * do { * // The following loop ensures that the contents of the drawing buffer * // are consistent in case the underlying surface was recreated * do { * // Get a new graphics context every time through the loop * // to make sure the strategy is validated * Graphics graphics = strategy.getDrawGraphics(); * * // Render to graphics * // ... * * // Dispose the graphics * graphics.dispose(); * * // Repeat the rendering if the drawing buffer contents * // were restored * } while (strategy.contentsRestored()); * * // Display the buffer * strategy.show(); * * // Repeat the rendering if the drawing buffer was lost * } while (strategy.contentsLost()); * } * * // Dispose the window * w.setVisible(false); * w.dispose(); * </code></pre> * * @see java.awt.Component * @see java.awt.GraphicsConfiguration * @see VolatileImage * @author Michael Martak * @since 1.4 */ public abstract class BufferStrategy { /** * Returns the <code>BufferCapabilities</code> for this * <code>BufferStrategy</code>. * * @return the buffering capabilities of this strategy */ public abstract BufferCapabilities getCapabilities(); /** * Creates a graphics context for the drawing buffer. This method may not * be synchronized for performance reasons; use of this method by multiple * threads should be handled at the application level. Disposal of the * graphics object obtained must be handled by the application. * * @return a graphics context for the drawing buffer */ public abstract Graphics getDrawGraphics(); /** * Returns whether the drawing buffer was lost since the last call to * <code>getDrawGraphics</code>. Since the buffers in a buffer strategy * are usually type <code>VolatileImage</code>, they may become lost. * For a discussion on lost buffers, see <code>VolatileImage</code>. * * @return Whether or not the drawing buffer was lost since the last call * to <code>getDrawGraphics</code>. * @see java.awt.image.VolatileImage */ public abstract boolean contentsLost(); /** * Returns whether the drawing buffer was recently restored from a lost * state and reinitialized to the default background color (white). * Since the buffers in a buffer strategy are usually type * <code>VolatileImage</code>, they may become lost. If a surface has * been recently restored from a lost state since the last call to * <code>getDrawGraphics</code>, it may require repainting. * For a discussion on lost buffers, see <code>VolatileImage</code>. * * @return Whether or not the drawing buffer was restored since the last * call to <code>getDrawGraphics</code>. * @see java.awt.image.VolatileImage */ public abstract boolean contentsRestored(); /** * Makes the next available buffer visible by either copying the memory * (blitting) or changing the display pointer (flipping). */ public abstract void show(); /** * Releases system resources currently consumed by this * <code>BufferStrategy</code> and * removes it from the associated Component. After invoking this * method, <code>getBufferStrategy</code> will return null. Trying * to use a <code>BufferStrategy</code> after it has been disposed will * result in undefined behavior. * * @see java.awt.Component#createBufferStrategy * @see java.awt.Component#getBufferStrategy * @since 1.6 */ public void dispose() { } }