1

我正在尝试使用一些字符串来介绍游戏,我希望一个字符串等待另一个弹出,并且我不想直接使用 Thread.sleep() 让它等待,因为我不确定是否这是最好的选择。除了让线程睡眠之外,还有其他方法可以让某些东西等待,还是我只需要让线程睡眠?

4

4 回答 4

5

如果这是一个游戏,你不应该使用睡眠或计时器。

通常,游戏都有自己的内部时钟机制。这意味着您将尝试尽可能快地渲染帧。您的 OnRender 方法将在游戏的当前时间被调用。您可以使用它来确定是否有足够的时间进入下一个屏幕。

这意味着您将在第 1 帧中获得一个时间点 A。您将在第 2 帧中获得 Delta 或另一个时间点 B。您可以通过使用 delta 或自己计算 delta 来确定经过了多少时间。对于计时情况,这是一种非常有效的机制,并且在游戏是单线程时工作得很好。任何程序的想法是永远不要为任何事情阻塞。

事情通常阻塞的原因是由于 I/O,例如从磁盘、网络读取或将数据放在 GPU 上。在您的情况下,您可以无阻碍地做所有事情。

这是此https://gamedev.stackexchange.com/questions/1589/fixed-time-step-vs-variable-time-step上的一个不错的页面

于 2013-06-30T20:44:35.060 回答
4

为此有一个标准机制:Object.wait()Object.notify()(及其重载/变体)。您只需等待某个事件在一个线程中发生,而其他某个线程负责通知您(或每个人,如果是notifyAll)该事件的发生。

您还可以利用.java.util.concurrent

于 2013-06-30T20:43:15.650 回答
0

如果你在游戏中制作这个,为什么不尝试在 libgdx 中使用 Actions 之类的东西呢?您只需将不同的演员链接在一起。每当诸如可见性或位置之类的属性达到您想要的值时,您就会触发下一个操作。在游戏的每个更新循环期间都会检查属性条件。

或者,如果它是一个摇摆应用程序,请使用计时器来检查这些属性。

于 2013-06-30T20:45:19.077 回答
0
long t1=0,t2=0;
long nanoWaitTime=10000; //to wait at least 10000 nano-seconds
t1=System.nanoTime();
//start waiting
long count=0;
boolean releaseCpuResources=true;
while(Math.abs(t2-t1)<nanoWaitTime)
{
   t2=System.nanoTime(); //needs maybe 1000 cycles of cpu to get this value.
                         //so this is like busy-wait
                         //and minimum step may be 1 micro-seconds or more
   if(releaseCpuResources)
   {
   count++;
   if(count>1000)Thread.sleep(1);//after too many iterations, cpu gets overwhelmed
                                 //so Thread.sleep makes it better for large waiting
                                 //times
                                 //but precision is lost. Like uncertainity principle
                                 //but in a quantized fashion
   }
}
// here continue to work after waiting

分辨率或精度可能不是您想要的所有 CPU。

于 2013-06-30T20:37:34.053 回答