- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以,我正在用 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/
在我的方法 doWork() 中,我调用 SwingUtilities.invokeLater(new Runnable(){ public void run() { button.setBackgr
我怎么感觉SwingUtilities.invokeLater()在任何swing应用中的必要性。请给出一些代码示例。 最佳答案 每当您需要更新 GUI 中的某些内容时,您应该通过 AWT 事件线程
.addActionListener(new ActionListener(){ public void actionPerformed (ActionEvent e){
我有这个代码片段 import javax.swing.SwingUtilities; public class Client1 { public static void main( Stri
我一直在阅读 SwingUtilities.invokeLater() 方法,并且我在很大程度上理解了它的用途。在处理 GUI 组件时,这些组件上的所有操作都需要在同一个事件线程上完成,以避免竞争等。
我的问题与 SwingUtilities.invokeLater 有关。我应该什么时候使用它?每次需要更新 GUI 组件时都必须使用吗?它究竟是做什么的?是否有替代方案,因为它听起来不直观并且添加了看
我有一个问题,关于使用 SwingUtilities 的 invokeLater 方法的正确做法是什么。 因此,首先,我想确认我的理解是否正确。 据我所知,必须在 EDT 上更改 GUI,因为 Swi
以下代码运行良好 abstract class FunctionRunnable implements Runnable { protected abstract V calculate();
我有一个线程使用 SwingUtilities.invokeLater 在我的 JFrame 上显示更新。线程的速度是可调的,当它设置为全速(更新之间没有 sleep )时,我的程序会严重减慢。我想问
我从来不理解SwingUtilities.invokeLater,这就是我一直避免使用它直到现在的原因。但是确保 Swing Thread 安全非常重要。好吧,请原谅,因为这是我第一次这样做。我试图在
这个问题已经有答案了: What does SwingUtilities.invokeLater do? [duplicate] (5 个回答) SwingUtilities.invokeLater
I had a problem earlier我试图将对象添加到 Canvas 中,但 SwingUtilities.invokeLater 尚未真正完成其工作。我确实需要能够可靠地向此 JPanel
我正在尝试保存 JFrame 的 .PNG 图像。在 JFrame 中,我有两个 Plot3DPanel 对象。很可能是因为同步错误,在保存 .PNG 时左侧尺寸的框架是不可见的。 因此,我使用以下代
我在 JButton“支持”上的 ActionListener 中有以下代码。 cl.across.text 是我的 GUI 中的另一个 JTextArea。问题在于点 pt1 给出的结果。 Fram
我有这段代码 import javax.swing.SwingUtilities; public class Client1 { public static void main( String
Java Swing 的 SwingUtilities.invokeLater() 允许您在处理完最后一个 AWT 事件(用户手势)后将线程排入队列以运行。 invokeLater() 是否保证等到拖
run() 方法中的代码未被执行。谁能告诉我为什么? startButton.addActionListener(new ActionListener() { public v
我正在使用 Swing 来创建一个小型 Java 2D 游戏。我只尝试显示图像。因为我不在 EDT 上,所以我使用 SwingUtilities.invokeLater() 来做这些事情。当我使用它时
我想使用 SwingUtilities.invokeLater 方法,以便我的程序的所有 Swing 组件都由事件调度线程更新,因为这是一个很好的做法. 但是如果我将 main 方法的所有代码包装在
我正在开发一个用 Java 编写的并发 Canvas ,这将使用户认为他们是在 Canvas 上并行绘图。 为了实现用户感知的并行性,我让他们创建这些 Runnable 对象,我继续使用 SwingU
我是一名优秀的程序员,十分优秀!