Skip to main content

Graphics Tearing Issue

2 replies [Last post]
xeondeveloper
Offline
Joined: 2004-11-14

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();
}
}

Reply viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
Chet Haase

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.

java2d@javadesktop.org 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 listserv@java.sun.com and include in the body
> of the message "signoff JAVA2D-INTEREST". For general help, send email to
> listserv@java.sun.com and include in the body of the message "help".

===========================================================================
To unsubscribe, send email to listserv@java.sun.com and include in the body
of the message "signoff JAVA2D-INTEREST". For general help, send email to
listserv@java.sun.com and include in the body of the message "help".

Dmitri Trembovetski

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.
>
>
> java2d@javadesktop.org 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 listserv@java.sun.com and include in the body
> >of the message "signoff JAVA2D-INTEREST". For general help, send email to
> >listserv@java.sun.com and include in the body of the message "help".
>
> ===========================================================================
> To unsubscribe, send email to listserv@java.sun.com and include in the body
> of the message "signoff JAVA2D-INTEREST". For general help, send email to
> listserv@java.sun.com and include in the body of the message "help".

===========================================================================
To unsubscribe, send email to listserv@java.sun.com and include in the body
of the message "signoff JAVA2D-INTEREST". For general help, send email to
listserv@java.sun.com and include in the body of the message "help".