大家好!
我正在编写一款游戏。由于游戏板块的变化不多,我开始对其进行缓冲,并定期复制。然而,前景内容仍在不断变化,因此我需要高帧率。同时,我还想要进行缩放操作,这就是问题所在:为了节省内存,我重复使用缓冲区。每当我进行缩放操作时,应用程序会出现延迟,然后才能正常运行。
经过性能测试,我发现了两个性能杀手:
清除背景缓冲区(4000x4000像素需要约29毫秒。为了保持透明度,我使用g.fillRect)
将缓冲区复制回实际图像(当然不是实时的,但再次从getBufferStrategy()获取)。这需要300毫秒,下一次大约需要150毫秒,然后从第三帧开始就可以平稳运行。
为了阐明可能存在的问题,下面是一些代码。我按照以下方式创建自己的缓冲区:
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device = env.getDefaultScreenDevice();
GraphicsConfiguration config = device.getDefaultConfiguration();
image = config.createCompatibleImage(width, height,Transparency.TRANSLUCENT);
现在是将缓冲区复制回图像的部分。请注意,我需要剪切掉缓冲区的一些部分,这就是为什么我选择了最大参数调用。
g.drawImage(image, vs.boardOffsetX, vs.boardOffsetY, targetWidth, targetHeight, 0, 0, sourceWidth, sourceHeight, null);
最后,关于我的另一个问题:我按以下方式清除图像:
Graphics2D g = (Graphics2D) image.getGraphics();
Color transparent = new Color(0, 0, 0, 0);
g.setColor(transparent);
g.setComposite(AlphaComposite.Src);
g.fillRect(0, 0, image.getWidth(null), image.getHeight(null));
非常感谢!我已经被卡住了很长时间。如果您对我的方法有风格上的建议,请不要害羞,这是我第一次尝试图形处理。
谢谢!
编辑:我真正不理解的部分是,完全相同的操作需要非常不同的时间。除了我的线程之外,只有AWT-Thread在运行时,我会得到两个大约为300毫秒的时间,然后它就下降到像10微秒这样令人难以置信的速度!!!这对于复制1600万像素来说非常快速。有人理解这种效果吗?也许知道“预优化”这种行为的方法?