gpt4 book ai didi

java - 在 Java 游戏循环中使用 "SwingUtilities.invokeLater()"是一种不好的做法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:56 24 4
gpt4 key购买 nike

所以,我正在用 JAVA 创建一个等距游戏;简单来说,它有一张由瓦片拼成的 map ,当用户在屏幕上拖动鼠标时, map 就会移动。为了给你们一个想法,它目前看起来像这样:

在实际原型(prototype)版本之前,我构建了一个本身没有“游戏循环”的小型 Java 应用程序;唯一更新 tile-map 位置的是鼠标拖动的事件监听器,它在移动更新后调用 repaint() 方法。它运行良好,我可以选择 Tiles 并毫无问题地移动 map 。

从那时起,我重建原型(prototype)思维,开发更像真实游戏引擎的东西,带有游戏状态管理器和真实游戏循环;游戏循环代码如下所示:

    init();

long start;
long elapsed;
long wait;

while(running){
start = System.nanoTime();

update();
draw();
drawToScreen();

elapsed = System.nanoTime() - start;
wait = targetTime - elapsed / 1000000;

if(wait < 0)wait = 5;
try{
Thread.sleep(wait);
} catch(Exception e) {
e.printStackTrace();
}

}

GameStateManager 可以使用 update() 和 draw() 方法访问,因此我可以像旧原型(prototype)一样绘制 map 。当我在屏幕上拖动鼠标以使 map 可以移动时出现问题;动画变得非常不稳定,以至于我实际上可以看到瓷砖之间的黑色背景在所有瓷砖的最终位置之前移动。

起初我认为问题出在游戏循环线程和主类的事件监听器之间的并发性,因为在 JPanel 试图绘制 map 刚才的样子时可以调用 mouseDragged 事件;然后我在我的游戏循环代码上测试了这个:

        SwingUtilities.invokeLater(new Runnable(){
public void run(){
draw();
drawToScreen();
}
});
//draw();
//drawToScreen();

现在原型(prototype)工作得很好。

那么,我的问题是,这种性能是否很重,或者只是 Java 中的一种不良做法?另外,我的“并发”假设是否正确?这是我第一次在 Java 中处理线程,所以我真的不知道我是否以正确的方式处理了这个问题。

obs:这是我创建的整个类,游戏循环位于其中: http://pastebin.com/RMRHYc5X

obs2:如果有人感兴趣的话,我研究的游戏循环逻辑是基于 pj644 制作的名为“2D Game Programming in Java”的 youtube java 教程。

obs3:对不起,如果问题太大了,这是我第一次在这个网站上发帖!

最佳答案

Swing 并不是真正用于编写游戏的出色技术,它更新缓慢并且在很多方面都非常有限。

话虽如此,当您的游戏线程完成其工作时,调用 invokeLater 或使用 SwingWorker 是更新屏幕的正确方法。

在你走得更远之前,我真的建议你看看 2d 或 3d java 图形和游戏框架。您将能够通过这种方式获得更好的结果,并且在设置游戏循环、更新、管理帧速率等方面的大量工作将为您完成。

关于java - 在 Java 游戏循环中使用 "SwingUtilities.invokeLater()"是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24883018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com