Help! Why so low FPS when i try to draw images

Can anyone here explain why i only get 30FPS when i try to draw my map. The problem is this line:


g.drawImage(image[ (map[y][x][0]) ], (x * 32), (y * 32), null);

If i remove it everything runs fine in around 60FPS wich is what i want. Tile.gif is just a normal 16x16 gif file


import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;

public class T extends JFrame{
	
	BufferedImage[] image = new BufferedImage[1];
	int[][][] map = new int[100][100][1];
	
	T(boolean full) throws Exception{
		super("Game");
		
		BufferedImage bi = ImageIO.read(new File(System.getProperty("java.class.path") + "/tile.gif"));
		image[0] = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB);
		image[0].getGraphics().drawImage(
				bi.getSubimage(0, 0, 16, 16), 0, 0, 32, 32, null);
		
		setUndecorated(full);
		setIgnoreRepaint(true);
		
		if(full){
			GraphicsDevice device = getGraphicsConfiguration().getDevice();
			device.setFullScreenWindow(this);
			device.setDisplayMode(new DisplayMode(640, 480, 16, 0));
		}
		else{
			setSize(640, 480);
			show();
		}
		
		
		createBufferStrategy(2);
		BufferStrategy strategy = getBufferStrategy();
		
		int[] colors = {0x00ffff, 0x000000};
		
		int fps = 0;
		long time = System.currentTimeMillis();
		long runTime = System.currentTimeMillis();
		long lastFps = 0;
		int drFps = 0;
		Graphics2D g;
		
		while(System.currentTimeMillis() - runTime < 10000){
			
			long delta = System.currentTimeMillis() - time;
			time = System.currentTimeMillis();
			lastFps += delta;
			fps++;
			
			if(lastFps >= 1000){
				drFps = fps;
				fps = 0;
				lastFps = 0;
			}
			
			g = (Graphics2D)strategy.getDrawGraphics();
			g.setColor(new Color(0x0000ff));
			g.fillRect(0, 0, 640, 480);
			
			int startx  = 0;
			int maxx = startx + (640 / 32) + 1;
			
			int starty = 0;
			int maxy = starty + (480 / 32) + 1;
			
			for(int y = 0; y < maxy; y++){
				for(int x = startx; x < maxx; x++){
					g.drawImage(image[ (map[y][x][0]) ], (x * 32), (y * 32), null);
				}
			}
			g.setColor(new Color(0xffffff));
			g.drawString("FPS: " + drFps, 2, 40);
			g.dispose();
			strategy.show();
			Thread.yield();
		}

		System.exit(0);
		
	}
	
	public static void main(String[] args) throws Exception{
		new T(true);
	}

}

I guess that problem is that u don’t make your Buffered image using GraphicsConfiguration’s createCompatible image method.
So when java copies your images to graphics it first must make conversion into current config.

But if u are using java 1.5 , almost all images should be menaged…

Id ask this over in the 2D topic, but ask yourself this question: Is there anything very different about this image comapred to the others you draw? In particualr, does it have transparency or is it otherwise ina different pixel format?

Thank you. The problem had to do with transparency. When i changed to , BufferedImage.TYPE_INT_RGB (instead of ARGB) it runs much smoother. Is it supposed to work like that??

There are limits on how Transparency can be acceleerated on Windows. This is due to inherent limits in DirectDraw on which Java2D up to now has been based.

There is work going on to move to a 3D base for the code udnelying Java2D much as WIndows itself is moving to 3D with vista. As that work progresses soem of these limist will vanish.