Sorry dude, didn’t mean for my reply to be so hard to follow. 
As Abuse pointed out, rendering directly using the BufferStrategy will hardware accelerate the operations on a modern VM.
For Windows, a modern VM is 1.6u10+
http://java.sun.com/javase/6/webnotes/6u10.html
BufferedImages are “managed” by default. “Managed” images are cached in VRAM when they are drawn. If the image is later altered, the cached copy is discarded. Since the example code alters the image every frame, a cached VRAM copy is never used.
http://java.sun.com/j2se/1.5.0/docs/guide/2d/new_features.html
This snippet draws a blue box in a random location each frame, and is NOT accelerated:
BufferedImage img = gc.createCompatibleImage( 640, 480 ); //whole screen buffer
while (true){
Graphics gfx = img.getGraphics();
gfx.setColor(Color.BLACK);
gfx.fill(640,480); //oops, image content altered..., VRAM cache discarded if present.
int x = rand.nextInt(256);
int y = rand.nextInt(256);
gfx.setColor(Color.BLUE);
gfx.fillRect(x,y,50,50); //draw blue box in random location on large image
gfx.dispose();
Graphics bufGfx = bufferStrategy.getDrawGraphics();
bufGfx.drawImage(img,0,0,null); //draw large image, always modified since last draw, must copy from system RAM to VRAM
bufGfx.dispose();
bufferStrategy.show();
// sleep, yield, etc...
}
This snippet does the same, but uses BufferStrategy acceleration and BufferedImage caching:
BufferedImage img = gc.createCompatibleImage( 50,50 ); //small image of a blue box, so only 50x50.
Graphics gfx = img.getGraphics();
gfx.setColor(Color.BLUE);
gfx.fillRect(0,0,50,50); //image is rendered only once.
gfx.dispose();
while (true){
Graphics bufGfx = bufferStrategy.getDrawGraphics();
bufGfx.setColor(Color.BLACK);
bufGfx.fill(640,480); // direct call on buffer, accelerated by DirectX or OpenGL
int x = rand.nextInt(256);
int y = rand.nextInt(256);
bufGfx.drawImage(img,x,y,null); //draw small image at random location. image not modified, so quick copy from VRAM is possible
bufGfx.dispose();
bufferStrategy.show();
// sleep, yield, etc...
}
Admittedly, for just drawing a blue box, there isn’t much value in caching the image. I was just trying to show how to properly use a BufferedImage to take advantage of hardware acceleration.
manasink