如何使用图形正确地实现图层系统



所以我在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。。。是次优的:'(

我如何才能以更恰当的方式实现缓冲区的想法?我听说过RastersVolatileImageBufferStrategy,但我就是找不到我需要的信息,也无法通过javadoc

好吧,我通过绘制事物列表而不是对进行缓冲来绕过这个问题

以下是一些想法(未经测试(:

  1. 使用CardLayout使每个面板不不透明
  2. 使用BetterGlassPane,在paintComponent方法中,使用for循环来使用Graphics对象绘制所有层。https://github.com/kristian/better-glass-pane/blob/master/src/main/java/lc/kra/swing/BetterGlassPane.java
  3. 使用JLayeredPanehttps://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayeredPane.html
  4. 使用JLayerhttps://docs.oracle.com/en/java/javase/14/docs/api/java.desktop/javax/swing/JLayer.html

最新更新