我正在尝试使用Java和Swing制作2D游戏,并且窗口刷新太慢。但是,如果我移动鼠标或按键,则窗口刷新的速度应尽可能快!
这是一个GIF,显示仅当我移动鼠标时窗口如何快速刷新。
为什么窗口会像这样缓慢刷新?为什么鼠标和键盘会影响其刷新率?如果可能,如何使它始终保持快速刷新?
我使用javax.swing.Timer每1/25秒更新一次游戏状态,然后在游戏面板上调用repaint()重新绘制场景。
我知道计时器可能不会总是延迟精确到1/25秒。
我也了解调用repaint()只是要求尽快重新绘制窗口,而不是立即重新绘制窗口。
我的图形卡不支持OpenGL 2+或硬件加速的3D图形,这就是为什么我不使用libgdx或JME进行游戏开发的原因。
该Stack Overflow用户描述了我遇到的相同问题,但是据报道,作者通过在单独的计时器上反复调用repaint()解决了该问题。我试过了,它的确使窗口刷新有些快,但即使这样它也比我想要的要慢。在这种情况下,在窗口上摆动鼠标仍然可以提高刷新率。因此,该帖子似乎并没有真正解决问题。
另一个Stack Overflow用户也遇到了此问题,但是他们在游戏循环中使用连续的while循环而不是Timer。显然,此用户通过在while循环中使用Thread.sleep()解决了该问题。但是,我的代码使用Timer完成延迟,所以我不知道Thread.sleep()如何解决我的问题,甚至不知道该放在哪里。
我通读了《用AWT和Swing进行绘画》,以弄清是否误解了重新绘画的概念,但是该文档中没有任何内容可以为我阐明问题。每当游戏更新时,我都会调用repaint(),并且只有在发生鼠标或键盘输入时,窗口才会快速刷新。
我已经在网上搜索了几天,试图找到答案,但似乎无济于事!
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
class Game {
public static final int screenWidth = 160;
public static final int screenHeight = 140;
/**
* Create and show the …Run Code Online (Sandbox Code Playgroud)