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".

Reply via email to