I just wanted to add, do you really need to have two _translucent_ images the size of the screen? Why not render directly to the back-buffer?
Thanks, Dmitri On Thu, Apr 27, 2006 at 02:11:23PM -0700, Chet Haase wrote: > Hi, > > I talked about the tearing issue in my blog entry and article > on choppy animations: > http://weblogs.java.net/blog/chet/archive/2006/02/make_your_anima.html > http://today.java.net/pub/a/today/2006/02/23/smooth-moves-solutions.html > > You're basically running into a vertical refresh artifact. > > Running fullscreen with a BufferStrategy is a decent way to > work around this; depending on the platform and the situation, > we will usually give you a Flip strategy, which is (usually) > synchronized with the vertical refresh of the display to avoid > tearing. > > There are some things that might contribute to this not working, > however: > - What platform are you running on? It's possible that the > Flip strategy on your particular platform is actually doing a > copy behind the scenes, which would be the same as the BltBufferStrategy, > which runs smack into the refresh artifact. > - What pipeline are you using? The default? Are you specifying > OpenGL? or Direct3D? What release are you using? These can > all affect how we are implementing the buffer strategy under > the hood. > - The graphics operations you do to the back buffer could > actually impact things as well; it's possible that we would > punt the buffer to system memory in some situations because > the operations you are doing (apart from the flip/blt) are > faster in software. This is particularly the case for > translucency; reading from video memory is an amazingly > slow operation, and we do not necessarily support translucency > through hardware on all platforms. > > Anyway, hopefully this helps you track things down a bit... > > Chet. > > > [EMAIL PROTECTED] wrote: > >I've been trying to work around an issue involving tearing during a > >buffered rendering process in my code. Im using a buffer strategy to page > >flip to BufferedImages to conduct a animation. The problem is that on > >every interation of the render the square box that I render it tearing. I > >have purchased multiple books and have visted multiple web sites on how to > >solve the tearing problem. And I in NO MEANS want to copy or use someone > >elses code. Pasted below is the code that I developed. Any suggestions are > >welcome. Thanks. > > > >import java.awt.*; > >import java.awt.image.*; > >import java.awt.event.*; > >import javax.swing.*; > >import java.io.*; > >import java.awt.geom.*; > > > >public class GameEngine implements Runnable > >{ > > > > private GraphicsConfiguration[] gc; > > private GraphicsDevice gd; > > private GraphicsEnvironment ge; > > private DisplayMode dm; > > private DisplayMode dms[]; > > private JFrame frame; > > private Container c; > > private File file; > > private FileWriter writer; > > private BufferCapabilities buffercap; > > private ImageCapabilities imagecap; > > private Window window; > > private BufferStrategy bufstrat; > > private Thread t; > > private int x = 0; > > private BufferedImage back1; > > private BufferedImage back2; > > > > public GameEngine() > > { > > > > t = new Thread(this,"Game Loop"); > > > > try > > { > > > > SwingUtilities.invokeAndWait(new Runnable(){ > > > > > > public void run() > > { > > > > try > > { > > > > initGraphics(); > > init(); > > > > } > > catch(Exception e) > > { > > > > e.printStackTrace(); > > } > > > > } > > > > > > > > }); > > > > } > > catch(Exception e) > > { > > > > e.printStackTrace(); > > } > > > > > > } > > > > public void initGraphics() > > { > > > > ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); > > gd = ge.getDefaultScreenDevice(); > > dm = gd.getDisplayMode(); > > gc = gd.getConfigurations(); > > dms = gd.getDisplayModes(); > > back1 = new > > > > BufferedImage(dm.getWidth(),dm.getHeight(),BufferedImage.TYPE_INT_ARGB); > > back2 = new > > > > BufferedImage(dm.getWidth(),dm.getHeight(),BufferedImage.TYPE_INT_ARGB); > > > > > > try > > { > > > > file = new File("C:/GraphicsInfo.txt"); > > writer = new FileWriter(file); > > > > > > writer.write("Ideology Software Corporation\n"); > > writer.write("Sample Game Information\n\n"); > > writer.write("Display Information"); > > writer.write("\n\n"); > > writer.write("Width " + dm.getWidth()); > > writer.write("Height " + dm.getHeight()); > > writer.write("\n\n"); > > writer.write("Supported Display Modes"); > > writer.write("\n\n"); > > > > > > for(int k = 0;k < dms.length;k++) > > { > > writer.write("\n\n"); > > writer.write("Display Mode " + k); > > writer.write("\n\n"); > > writer.write("Width " + dms[k].getWidth()); > > writer.write("\n"); > > writer.write("Height " + > > dms[k].getHeight()); > > writer.write("\n"); > > writer.write("Bit Depth " + > > dms[k].getBitDepth()); > > writer.write("\n"); > > writer.write("Refresh Rate " + > > dms[k].getRefreshRate()); > > writer.write("\n"); > > > > } > > > > > > > > for(int i = 0;i < gc.length;i++) > > { > > > > > > Rectangle rect = gc[i].getBounds(); > > buffercap = gc[i].getBufferCapabilities(); > > imagecap = gc[i].getImageCapabilities(); > > writer.write("\n\n"); > > writer.write("Graphics Configuration " + > > i); > > writer.write("\n\n"); > > writer.write("Configuration Width " + > > rect.width); > > writer.write("\n"); > > writer.write("Configuration Height " + > > rect.height); > > writer.write("\n"); > > writer.write("Configuration x " + rect.x); > > writer.write("\n"); > > writer.write("Configuration y " + rect.y); > > rect = ge.getMaximumWindowBounds(); > > writer.write("Max Window > > Configuraiton\n\n"); > > writer.write("\n"); > > writer.write("Max Window Width " + > > rect.width); > > writer.write("\n"); > > writer.write("Max Window Height " + > > rect.height); > > writer.write("\n\n"); > > writer.write("Buffer Capabilities"); > > writer.write("\n"); > > writer.write("FullScreen Required " + > > buffercap.isFullScreenRequired()); > > writer.write("\n"); > > writer.write("MultiBuffer Support " + > > buffercap.isMultiBufferAvailable()); > > writer.write("\n"); > > writer.write("Page Flipping Support " + > > buffercap.isPageFlipping()); > > writer.write("\n\n"); > > writer.write("Image Capabilities"); > > writer.write("\n"); > > writer.write("Acceration Support " + > > imagecap.isAccelerated()); > > writer.write("\n"); > > writer.write("Volatile Image Support " + > > imagecap.isTrueVolatile()); > > writer.write("\n\n"); > > > > > > > > } > > > > writer.close(); > > > > > > > > > > } > > catch(Exception e) > > { > > > > > > e.printStackTrace(); > > > > } > > > > > > > > } > > > > public void init() > > { > > > > frame = new JFrame(); > > frame.setSize(800,800); > > frame.setTitle("Game Application"); > > frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); > > frame.setIgnoreRepaint(true); > > frame.setUndecorated(true); > > c = frame.getContentPane(); > > c.setLayout(null); > > c.setBackground(new Color(0,0,0)); > > frame.setResizable(true); > > frame.setVisible(true); > > > > if(gd.isFullScreenSupported()) > > { > > > > gd.setFullScreenWindow(frame); > > > > } > > > > > > window = gd.getFullScreenWindow(); > > window.createBufferStrategy(2); > > bufstrat = window.getBufferStrategy(); > > t.start(); > > > > } > > > > public boolean renderBackOne() > > { > > if(back1 != null) > > { > > > > Graphics2D backg1 = back1.createGraphics(); > > backg1.setColor(new Color(255,255,255)); > > backg1.fillRect(x,100,100,100); > > > > > > return true; > > > > } > > else > > { > > > > return false; > > } > > > > } > > > > public boolean renderBackTwo() > > { > > > > if(back2 != null) > > { > > > > Graphics2D backg2 = back2.createGraphics(); > > backg2.setColor(new Color(255,255,255)); > > backg2.fillRect(x,100,100,100); > > > > return true; > > > > } > > else > > { > > > > return false; > > } > > > > > > > > > > } > > > > > > public void update() > > { > > > > > > > > if(!bufstrat.contentsLost()) > > { > > > > > > bufstrat.show(); > > > > > > } > > > > } > > > > public void render() > > { > > > > Graphics2D g2 = (Graphics2D)bufstrat.getDrawGraphics(); > > g2.setColor(new Color(255,255,255)); > > > > if(g2 != null) > > { > > > > if(renderBackOne()) > > { > > > > g2.drawImage(back1,new > > > > AffineTransformOp(g2.getTransform(),g2.getRenderingHints()),0,0); > > } > > else > > { > > g2.drawImage(back2,new > > > > AffineTransformOp(g2.getTransform(),g2.getRenderingHints()),0,0); > > > > } > > > > > > > > > > } > > > > > > > > > > } > > > > public void run() > > { > > > > try > > { > > > > for(;;) > > { > > > > Thread.sleep(750); > > update(); > > render(); > > x++; > > > > > > } > > > > > > } > > catch(Exception e) > > { > > > > e.printStackTrace(); > > } > > } > > > > public static void main(String args[]) > > { > > > > GameEngine gameengine = new GameEngine(); > > } > >} > >[Message sent by forum member 'xeondeveloper' (xeondeveloper)] > > > >http://forums.java.net/jive/thread.jspa?messageID=108465 > > > >=========================================================================== > >To unsubscribe, send email to [EMAIL PROTECTED] and include in the body > >of the message "signoff JAVA2D-INTEREST". For general help, send email to > >[EMAIL PROTECTED] and include in the body of the message "help". > > =========================================================================== > To unsubscribe, send email to [EMAIL PROTECTED] and include in the body > of the message "signoff JAVA2D-INTEREST". For general help, send email to > [EMAIL PROTECTED] and include in the body of the message "help". =========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA2D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".