我对Swing还是很陌生,我正在尝试制作一个简单的游戏,在该游戏的当前阶段,您用w-a-s-d移动一个框,并且它面对鼠标光标。在这些功能方面,我没有任何问题。 不幸的是,我在执行少量动作时出现应用程序停顿的问题。
例如,如果我四处移动方框,但光标仍然静止,则游戏开始严重卡死。但是,如果我摇动光标,则游戏运行正常。
经过研究,看来该问题与Swing的Component.repaint()
有关。在实现了我对此的理解之后,口吃的问题并没有改变。
我实现它的方法是让我的抽象基础GameObject类扩展Component,游戏中显示的所有对象都是该类的后代。
在游戏类(应用程序的主类)中,运行功能负责更新游戏中的对象。
long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
long timer = System.currentTimeMillis();
int frames = 0;
while (running) {
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while (delta >= 1) {
tick();
delta--;
}
if (running) {
render();
}
frames++;
if (System.currentTimeMillis() - timer > 1000) {
timer += 1000;
System.out.println("FPS: " + frames);
frames = 0;
}
}
stop();
}
tick()
和render()
函数调用处理程序,该处理程序处理所有对象。
private void tick() {
handler.tick();
}
Handler类,并添加了重新绘制对象的内容。在调用对象的tick和render函数之后,我添加了重新绘制,但是都没有任何主要作用。
public class Handler {
LinkedList<GameObject> objects = new LinkedList<GameObject>();
public void tick() {
for (int i = 0; i < objects.size(); i++) {
GameObject object = objects.get(i);
object.tick();
object.repaint();
}
}
public void render(Graphics g) {
for (int i = 0; i < objects.size(); i++) {
GameObject object = objects.get(i);
object.render(g);
object.repaint();
}
}
}
因此,尽管这些更改似乎并没有帮助解决程序中的卡顿现象,但还有其他事情-运行函数中的打印语句,打印了一个简单的字符串。 我一生都无法想像这可能会影响到什么,它当然不是永久性的解决方法,因此对这种情况的任何建议将不胜感激