在Java中制作动画的最佳方式?

bgr*_*nks 2 java graphics animation swing

我目前正在使用我设计的动画引擎,它接受Drawable类型的对象并将它们添加到List中.Drawable是一个有一个方法的接口:

public void draw(Graphics2D g2d);
Run Code Online (Sandbox Code Playgroud)

扩展动画管理器遍历此列表并在每个对象上调用draw()方法,传递从Swing组件获取的Graphics2D对象.

这种方法起初看起来效果很好,但正如我所担心的,从长远来看似乎无法处理多个对象.

只有两个Drawables注册,两个都在屏幕上绘制图像,我看到30-60秒后有点闪烁.

有没有办法优化这种方法?它当前调用AWT线程(invokeLater)来处理所有任务.并发绘图实际上不是一个选项,因为这几乎总是会导致Swing/AWT出现问题,这在很大程度上是由于Graphics不同步.

如果这只是一种不好的动画制作方法,那么当你有多个对象需要用自己特定的变量来渲染咳嗽游戏咳嗽时,更好的方法是什么?

任何帮助,将不胜感激.谢谢!

编辑:

我不能使用repaint()因为我的引擎已经调用了AWT线程来绘制东西.如果我从AWT线程调用invokeLater,图像永远不会被绘制出于某种原因.

我还应该补充一点,我正在使用ticks和fps系统.60蜱@ 120 fps.

每个刻度都会更新游戏逻辑,而每个帧渲染调用绘制在帧管理器上.

这是一个坏主意吗?我应该只使用FPS而不是滴答声吗?

use*_*457 5

我认为覆盖paintComponent(Graphics g)并定期调用JPanel上的重绘方法或者使用Timer绘制的任何内容更合适.你的问题可能是由于你试图绘制然后Swing做它自己的绘制.

public class Main {
public static void main(String[] args) {
    JFrame frame = new JFrame();
    JPanel panel = new JPanel() {
        public void paintComponent(Graphics g) {
            //draw here
        }
    };
    panel.setPreferredSize(800, 600);
    frame.add(panel);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true)

    new Timer(16, new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            panel.repaint();
        }
    }).start();
}
}
Run Code Online (Sandbox Code Playgroud)