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

用户名

因此,我正在用JAVA创建一个等距游戏;简而言之,它有一个由图块组成的地图,当用户在屏幕上拖动鼠标时,地图就会移动。为了给大家一个主意,目前看起来像这样:

在实际的原型版本之前,我构建了一个小的Java应用程序,该应用程序本身没有“ Game Loop”。唯一更新平铺地图位置的事件是鼠标拖动的事件侦听器,并且在移动更新后调用了repaint()方法。它工作正常,我可以选择“图块”并移动地图而不会出现问题。

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

    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()方法,因此我可以像较早的原型一样绘制地图。当我在屏幕上拖动鼠标以使地图可以移动时,发生了问题。动画变得非常怪异,在某种程度上,我实际上可以看到在所有图块的最终位置之前,图块之间的黑色背景在移动。

起初,我认为问题出在Game Loop线程和主类的事件侦听器之间并发,因为可以在JPanel试图绘制地图时调用mouseDragged事件。然后我在游戏循环代码中对此进行了测试:

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

现在,原型可以正常工作了。

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

obs:这是我制作的整个类,其中包含游戏循环:http : //pastebin.com/RMRHYc5X

obs2:如果有人感兴趣,那么我从事的游戏循环逻辑是基于pj644制作的YouTube Java教程,名为“ Java 2D Game Programming”。

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

B队

Swing并不是真正的写游戏技术,它更新缓慢且在很多方面受到限制。

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

在进一步介绍之前,我确实建议您看一下2d或3d java图形和游戏框架。这样一来,您将可以获得更好的结果,并且在设置游戏循环,更新,管理帧频等方面的许多工作都将为您完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用通用的FindViewById是一种不好的做法吗?

使用 Firestore 封装集合是一种不好的做法吗?

在Java Swing Elements中使用HTML样式是一种不好的做法吗?

在React中使用键重新创建组件是一种不好的做法吗?

在python中使用具有非整数类型的枚举是一种不好的做法吗?

在析构函数中使用空条件运算符是一种不好的做法吗?

在Android中使用负边距是一种不好的做法吗?

在辅助程序中使用实例变量是一种不好的做法吗?

在if语句中使用input()是一种不好的做法吗?

为什么要在main方法中使用SwingUtilities.invokeLater?

java:将文件流存储在数据库中是一种不好的做法吗?

Java-没有类构造函数是一种不好的做法吗?

使用exec()执行从文本文件读取的代码是一种不好的做法吗?

使用大量 AngularJS 和 JavaScript 对网站来说是一种不好的做法吗?

使用“类型”作为属性名称是一种不好的做法吗?

在POST请求中混合使用查询参数和主体参数是一种不好的做法吗?

在SQLalchemy中混合使用ORM和显式SQL是一种不好的做法吗?

为CSV特殊字符使用临时占位符是一种不好的做法吗?

使用标称值为PK的单列表是一种不好的做法吗?

使用相同的私钥生成证书链是一种不好的做法吗

使用有状态组件绕过redux是一种不好的做法吗?

使用Maven settings.xml构建Docker映像-这是一种不好的做法吗?

对许多元素使用 bind() 方法是一种不好的做法吗?

PHP,使用对象构建SQL语句是一种不好的做法吗?

使用发布请求进行搜索是一种不好的做法吗?

Flutter BLoC:使用嵌套StreamBuilders是一种不好的做法吗?

与在Java Swing程序中使用SwingUtilities.invokeLater()方法有关的一些疑问

使用Java标准密钥库是一种不好的做法

Java:即使使用SwingUtilities.invokeLater,线程也不会修改GUI