我在使用Java2D时遇到了奇怪的现象.我知道sun.java2d.opengl VM参数可以为2D启用3D加速,但即使使用它也有一些奇怪的问题.
以下是我运行的测试结果:
在JComponent
Image 1 = .bmp格式上绘制具有32x32像素图块的25x18地图,图像2 = A .png格式
120 FPS使用.BMP图像1
13 FPS使用.PNG图像2
12 FPS使用.BN图像1
700 FPS使用.PNG图像2
如果没有加速,我假设每次使用drawImage()我都会在软件中进行某种转换,并且在.PNG的情况下大大降低了FPS.但是,为什么加速时,结果会切换(而PNG实际上表现得更快)?!疯狂!
.BMP图像1被转换为TYPE_INT_RGB的图像类型..PNG图像2被转换为TYPE_CUSTOM的图像类型.为了在有和没有opengl加速的情况下获得一致的速度,我必须创建一个图像类型为TYPE_INT_ARGB的新BufferedImage,并将Image 1或Image 2绘制到这个新图像.
以下是运行的结果:
120 FPS使用.BMP图像1
120 FPS使用.PNG图像2
700 FPS使用.BN图像1
700 FPS使用.PNG图像2
我真正的问题是,我可以假设TYPE_INT_ARGB将是所有系统和平台的本机图像类型吗?我假设这个值可能不同.有没有办法让我获得原生值,以便我总能创建新的BufferedImages以获得最佳性能?
提前致谢...
我想我通过研究太多谷歌搜索并将点点滴滴放在一起找到了解决方案.
在这里,评论和所有:
private BufferedImage toCompatibleImage(BufferedImage image) { // obtain the current system graphical settings GraphicsConfiguration gfxConfig = GraphicsEnvironment. getLocalGraphicsEnvironment().getDefaultScreenDevice(). getDefaultConfiguration(); /* * if image is already compatible and optimized for current system * settings, simply return it */ if (image.getColorModel().equals(gfxConfig.getColorModel())) return image; // image is not optimized, so create a new image that is BufferedImage newImage = gfxConfig.createCompatibleImage( image.getWidth(), image.getHeight(), image.getTransparency()); // get the graphics context of the new image to draw the old image on Graphics2D g2d = newImage.createGraphics(); // actually draw the image and dispose of context no longer needed g2d.drawImage(image, 0, 0, null); g2d.dispose(); // return the new optimized image return newImage; }
在我之前的文章中,GraphicsConfiguration保存了在系统上创建优化图像所需的信息.它似乎工作得很好,但我会认为Java会自动为你做这件事.显然你对Java不太满意.:)我想我最终回答了自己的问题.哦,好吧,希望它能帮助你们中的一些人,我曾经尝试过将Java用于2D游戏.