Why does this flicker so much?

Hi!

This is my first try at writing a game in Java. I’ve tried to set up a buffering strategy for my JFrame and then have an animation thread call repaint on the frame every 20 milliseconds. The contents of the window flickers heavily (much more than if I use an BufferedImage as back buffer for example).


/*
 * Created on Apr 26, 2003
 */
package wizards;

import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;

import wizards.gui.AnimationThread;
import wizards.gui.ImageLibrary;
import wizards.map.Map;
import wizards.map.Scenery;

/**
 * @author Johan Tibell
 */
public class Wizards extends JFrame
{
      public static int MAP_WIDTH = 15;
      public static int MAP_HEIGHT = 15;
      public static int TILE_SIZE = 32;
      
      private Map map;
      private BufferStrategy strategy;
      
      public Wizards()
      {
            // Set the window's title.
            super("Wizards");
            
            // Set the application to exit on window closure.
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            // Some other code removed here!
            
            // Set the window's size.                                    
            setSize(MAP_WIDTH * TILE_SIZE, MAP_HEIGHT * TILE_SIZE);
            setVisible(true);

            // Create a double buffer.
            createBufferStrategy(2);
            strategy = getBufferStrategy();
            
            new AnimationThread(this).start();
      }
      
      public void paint(Graphics g)
      {
            super.paint(g);
            Graphics offscreenGraphics = strategy.getDrawGraphics();
            // Basically draws the same buffered image a couple of times.
            map.draw(offscreenGraphics);
            strategy.show();
      }
      
      /**
       * Entry point of application. Creates a window and starts the application.
       * @param args
       */
      public static void main(String[] args)
      {
            new Wizards();
      }
}

// ************************************************************************

/*
 * Created on Apr 26, 2003
 */
package wizards.gui;

import java.awt.Component;

/**
 * @author Johan Tibell
 */
public class AnimationThread extends Thread
{
      private Component target;
      
      public AnimationThread(Component target)
      {
            this.target = target;      
      }
      
      public void run()
      {
            while(Thread.currentThread() == this)
            {
                  target.repaint();
            
                  try      {
                        Thread.sleep(20);
                  } catch (InterruptedException e) {}
            }
      }
}

That’s because you actually have to use the BufferStrategy once you’ve created it. Change your code to do paint(strategy.getDrawGraphics()) instead of repaint() and you’ll be fine.

Thanks!

I actually added an render() method instead which I had my animation thread call. I’m experiencing some strange behaviour though. Sometimes I get a NullPointerException when starting the application. Can the createBufferStrategy() or getBufferStrategy() fail?

EDIT: After some testing I found that it was my buffer strategy which was a null reference. How’s this possible?

  • Johan