Need advice on Active Rendering. Please help

I dont have that much experience in Java, and only a few days ago I realised that I need to use Active rendering instead of passive rendering for my pacman game. The game runs fine when I run it on my own PC (P4 2Ghz 512 ram) and I get around 33 fps. But if I run it on computers with lower specs (below 1Ghz) the game runs really slow (about 17 fps). I know this could be because of passive rendering since pacman is not really a processor hungry application to use all of the system’s recources.

The problem is I can’t really find much information on active rendering (except the article on Sun’s website). Could you point my to some tutorials or examples on active rendering. (or if you could give me some guidelines)

Thanx

It’s not clear what your problem is. But obviously you have one. Pacman should easily perform with 500fps on a modern box, even with Java.

Have you looked into the demos around?

Well the problem is that in my game, almost all the logic is performed in the paint/paintComponent method. From what I read in Sun’s website, this is passive rendering and is not really good idea to use for a game.

But the problem is I have not been able to find much information and tutorials about active rendering. So I don’t exactly know how to use it for my game.

Pacman should easily perform with 500fps on a
modern box, even with Java.

500 fps, wow!!! and I thought getting 33 fps is ideal.

I got an emulated pacman running at 60fps on a 266Mhz laptop once 8)

For a simple active rendering example, look into http://java.sun.com/docs/books/tutorial/extra/fullscreen/example-1dot4/MultiBufferTest.java
and replace the painting of the colored background (lines 43 and 44) with your own code.

But maybe you have another problem. Profile your code with the -Xprof switch.

Greetings,
Erik

The first step you need to do is to call setIgnoreRepaint(true) on your main frame. From then on, you know that when you’re seeing something on the screen, you’re active rendering :smiley:

One straightforward way (untested, but should work) of getting some active rendering would be to put this in your run loop of the main frame…


public void run() {
    while(true) {
        if(buffer == null) {
            buffer = new Image(640, 480); // where this number is the size of your window - Insets
            continue;
       }
       Graphics bufferG = buffer.getGraphics();
       getContentPane().paintComponent(bufferG);
       getContentPane().paintChildren(bufferG);
       getContentPane().getGraphics().paint(buffer, getInsets().left, getInsets().top);
    }
}

private Image buffer;

I have spent the past week trying to convert my code but without success. To be honest, I don’t have that much experience in java, and this thing is giving me a headache. I am totally confused.

below is a simple animation code in passive rendering (similar to the code that I use in my game). Can you please help me to convert it to active rendering. If you have the time to help me with this, then I am sure I will be able to do it for the rest of my game. I hope I’m not asking for too much.

Thanx

The below code uses 7 GIF images for pacman animation.


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class PacmanM extends JPanel implements ActionListener
{
      private ImageIcon images[];
      private static final int TOTAL_IMAGES=7, ANIM_DELAY=50;
      private int currentImage = 0;
      private Timer animationTimer;
      private int delay = 0;

      public PacmanM(int delay)
      {
            this.delay = delay;
            setupAnimation();
            
      }
      
      public PacmanM()
      {
            setupAnimation();
      }
      
      public void setupAnimation()
      {
            this.setSize(this.getPreferredSize());
            this.images = new ImageIcon[TOTAL_IMAGES];
            

            for (int i = 0; i < images.length; i++)
            {
                  images[i] = new ImageIcon("pac"+i+".gif");
            }
            startAnimation();
      }
      
      public void paintComponent(Graphics g)
      {
            super.paintComponent(g);
            g.setColor(Color.blue);
            g.fillRect(0,0,this.getWidth(), this.getHeight());
            if (images[currentImage].getImageLoadStatus() == MediaTracker.COMPLETE)
            {   
                  images[currentImage].paintIcon(this, g, 0, 0);
                  currentImage = (++currentImage) % TOTAL_IMAGES;
            }      
      }
      
      public void startAnimation()
      {
            if (animationTimer == null)
            {
                  currentImage = 0;
                  animationTimer = new Timer( ANIM_DELAY + delay, this);
                  animationTimer.start();
            } 
            else 
            {
                  if (!animationTimer.isRunning())
                  animationTimer.restart();
            }
      }
      
      public void stopAnimation (){ animationTimer.stop(); }
      public void actionPerformed(ActionEvent e){ repaint(); }
      public Dimension getMinimumSize() { return getPreferredSize(); }
      public Dimension getPreferredSize (){return new Dimension(400,400);}
      
      public static void main(String[] args )
      {
            PacmanM PacMan = new PacmanM();
            JFrame main = new JFrame("PacMan");
            main.getContentPane().add(PacMan, BorderLayout.CENTER);
            
            main.addWindowListener(new WindowAdapter()
            {
                  public void windowClosing(WindowEvent e)
                  {
                        System.exit(0);
                  }
            });
                  main.pack();
                  main.show();
      }    
}

anyone?