2013-03-16 69 views
0

我一直在想这个问题。我不知道如何在同一时间发生事情。如何同步东西

我想知道如何在没有单独线程的情况下在java中同步。例如,在一个真实的视频游戏中,没有单独的线程的情况下,事情如何同时发生?
一个人在游戏中如何同时移动双肢?
我怎么能在java中做到这一点?

+0

据我知道你不能,这就是为什么我们有线程,因为其他的东西是连续的,所以你必须要等待一个操作到另一个开始之前结束.. – 2013-03-16 01:28:14

+0

我想我现在理解你的评论。这是有道理的 – 2013-03-16 01:32:34

+0

1)在不同的位置绘制双臂到用于屏幕的图像。 2)'repaint()' – 2013-03-16 01:32:43

回答

1

通常他们没有。视频游戏中的这些更新通常都是一次完成,然后在一个帧中一次完成。所以有一个状态更新步骤,然后是一个渲染步骤。

在更新步骤中,例如手臂骨骼的位置将根据它们应该如何移动(可能是响应从键盘或鼠标接收的输入)而更新,然后整个场景再次以新的位置呈现。

没有线程,事情就不会(在技术上)完全同时发生。通常情况下,程序会等待来自某个东西(用户或网络,​​或者您每隔100毫秒设置为关闭的计时器)的输入,并且程序的一部分正在等待,另一部分可能会跑。

这些情况通常都是由事件驱动的 - 请参阅Observer Pattern以获取有关如何处理该问题的指南。您将有一些等待输入的内容,然后触发相应的响应事件,这些响应事件由“等待”该事件发生的任意数量的对象“侦听”。

这通常会导致同时发生的事情出现,因为您试图保持在这些事件上运行的代码很小 - 它非常快,您无法区分差异。

如果你真的想要的东西却在同一时间运行的,你只是需要使用线程(或进入显卡编程 - 这是很多的乐趣:d)

+0

这非常有帮助。所以处理器比渲染要快得多,所以用户不会注意到任何东西。 – 2013-03-16 01:37:23

+0

@HarrisonBergeron是的。那么,这取决于你想要做多少处理 - 如果处理器要慢或需要做很多事情,它就不会经常得到。这有时候是为什么你得到帧率下降(其他原因是显卡的处理过多,我认为这可能通常更普遍) – Jeff 2013-03-16 01:39:28

+0

是的,这是完美的感觉:) – 2013-03-16 01:53:21

0

标准的软件架构是一个游戏循环。它基本上是这样的:

while the game is running 
    for each object in the game 
     check for interactions with other objects 
     update the objects position 
    draw the game state to a hidden surface 
    copy the hidden surface to the screen