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

How to implement properly a layer system using Graphics

所以我在 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 个缓冲图像来做到这一点,考虑到游戏大约是 60fps 并且我有 18 个层,我每秒创建 1000 个缓冲图像...不是最理想的:')

我怎样才能以更恰当的方式实现缓冲区的想法?我听说过 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

好吧,我通过列出要绘制的东西而不是缓冲图像来绕过这个问题