我目前正在使用我设计的动画引擎,它接受Drawable类型的对象并将它们添加到List中。 Drawable是一个具有一种方法的接口:
public void draw(Graphics2D g2d);
扩展动画管理器遍历此列表并在每个对象上调用draw()方法,传递从Swing组件获取的Graphics2D对象。
这种方法起初似乎运作良好,但正如我所担心的,从长远来看似乎无法处理多个对象。
只注册了两个Drawable,两个都在屏幕上绘制图像,30-60秒后我看到有点闪烁。
有没有办法优化这种方法?它当前调用AWT线程(invokeLater)来处理所有任务。并发绘图实际上不是一个选项,因为这几乎总是会导致Swing / AWT出现问题,这在很大程度上是由于Graphics不同步。
如果这只是一种不好的动画制作方法,那么当你有多个对象需要用自己的特定变量渲染的东西时,有什么更好的方法咳嗽游戏咳嗽
任何帮助将不胜感激。谢谢!
编辑:
我不能使用repaint()因为我的引擎已经调用了AWT线程来绘制东西。如果我从AWT线程调用invokeLater,图像永远不会被绘制出来。
我还应该补充一点,我正在使用ticks和fps系统。 60滴@ 120 fps。
每个刻度都会更新游戏逻辑,而每个帧渲染调用绘制在帧管理器上。
这是个坏主意吗?我应该只使用FPS而不是滴答声吗?
答案 0 :(得分: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();
}
}