【问题标题】:Java Swing or AWT repaint frequencyJava Swing 或 AWT 重绘频率
【发布时间】:2022-04-03 03:48:27
【问题描述】:

我尝试用 Java 制作一个简单的游戏,最后得到了这段代码

@Override
public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    ball.paint(g2d);
}

...

while (true) {
    repaint();
    Thread.sleep(10);
}

它重绘的频率不够。但是,如果我将鼠标移到窗口顶部,它会开始更频繁地重新绘制。按下键盘上的按钮也会加快速度。

我将 Arch 与 i3wm 一起使用。

【问题讨论】:

  • @peeskillet 感谢Timer,但这并没有帮助。仍然是相同的行为。
  • @peeskillet 抱歉。我问了一个愚蠢的问题。我现在将发布答案

标签: java


【解决方案1】:

不要相信互联网上的指南。有时想想自己。

这是有错误的指南。问题是算法是错误的。我们只需要更频繁地绘制而不是更新我们的世界。

这是一个愚蠢的实现。就并发而言,它可能真的是错误的。

Timer timer1 = new Timer(1, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        game.repaint();
    }
});
timer1.start();

Timer timer2 = new Timer(10, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        game.move();
    }
});
timer2.start();

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题。两个计时器对我不起作用。我设法通过添加渲染提示并在我的主要对象之前绘制一个空矩形来顺利移动对象:

    public void paintComponent(Graphics g) {
        g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.WHITE)
        g2d.fillRect(0, 0, getWidth, getHeight)
    
        // paint your object here   
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-04
      • 2010-10-07
      • 2015-04-24
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多