【问题标题】:Best way to animate in Java?用Java制作动画的最佳方式?
【发布时间】:2015-09-26 21:40:16
【问题描述】:

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

public void draw(Graphics2D g2d);

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

这个方法一开始似乎效果很好,但正如我担心的那样,从长远来看,它似乎无法处理多个对象。

仅注册了两个 Drawable,两个都在屏幕上绘制图像,我看到 30-60 秒后有点闪烁。

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

如果这只是一种糟糕的动画制作方式,那么当您有多个对象都需要使用自己的特定变量渲染的东西时,有什么更好的方法咳嗽游戏咳嗽?

任何帮助将不胜感激。谢谢!

编辑:

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

我还应该补充一点,我正在使用刻度和 fps 系统。 60 滴答声 @ 120 fps。

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

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

【问题讨论】:

    标签: java swing animation graphics


    【解决方案1】:

    我认为重写paintComponent(Graphics g) 并定期调用JPanel 上的repaint 方法或使用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();
    }
    }
    

    【讨论】:

    • 好的。我必须使用计时器吗?或者我可以只使用一个休眠 x 毫秒并调用 repaint() 的线程吗?
    • 你可以做任何你想做的事,但计时器非常好。我相信计时器是在 AWT 事件线程中管理的,所以它看起来像多线程。如果你在 paintComponent 方法中加入了 synchronized(this){wait();} 之类的东西,那么你的整个 GUI 就会停止响应。
    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 2023-03-28
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多