所以我在jpanel上使用自定义重绘进行游戏,实现如下
public synchronized void paintComp(Graphics g) {
//Buffer is a BufferedImage and it Graphics object
EnumMap<Layer,Buffer> buffers = new EnumMap<>(Layer.class);
for (Layer layer : Layer.values()) {
buffers.put(layer, new Buffer(fsize.x, fsize.y));
}
this.ltime = System.currentTimeMillis();
//there i draw all the game content on buffers' g
this.scene.render(this, buffers, ltime, 0, 0);
//then i draw all layers in the right order
for (Buffer buf : buffers.values()) {
buf.g.finalize();
g.drawImage(buf.img, offset.x, offset.y, null);
}
}
基本上,因为游戏内容被组织成一棵树,我想在图层上绘制内容,然后在屏幕上绘制这些图层,以便有更好的排序
问题是,我只知道如何做到这一点,每次调用该函数时,每层实例化1个bufferedmage,考虑到游戏速度约为60fps,我有18层,我每秒创建1000个bufferidimage。。。是次优的:'(
我如何才能以更恰当的方式实现缓冲区的想法?我听说过Rasters
、VolatileImage
和BufferStrategy
,但我就是找不到我需要的信息,也无法通过javadoc
好吧,我通过绘制事物列表而不是对进行缓冲来绕过这个问题
以下是一些想法(未经测试(:
- 使用
CardLayout
使每个面板不不透明 - 使用
BetterGlassPane
,在paintComponent
方法中,使用for循环来使用Graphics
对象绘制所有层。https://github.com/kristian/better-glass-pane/blob/master/src/main/java/lc/kra/swing/BetterGlassPane.java - 使用
JLayeredPane
https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayeredPane.html - 使用
JLayer
https://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayer.html