这是一个合适的Android游戏循环吗?

时间:2012-10-12 02:28:04

标签: java android

我从我正在学习的书中抓住了这个。

public void run()
{
    // this is the method that gets called when the thread is started.

    // first we get the current time before the loop starts
    long startTime = System.currentTimeMillis();

    // start the animation loop
    while (running)
    {
        // we have to make sure that the surface has been created
        // if not we wait until it gets created
        if (!holder.getSurface ().isValid())
            continue;

        // get the time elapsed since the loop was started
        // this is important to achieve frame rate-independent movement,
        // otherwise on faster processors the animation will go too fast
        float timeElapsed = (System.currentTimeMillis () - startTime);

        // is it time to display the next frame?
        if (timeElapsed > FRAME_RATE)
        {
            // compute the next step in the animation
            update();

            // display the new frame
            display();

            // reset the start time
            startTime = System.currentTimeMillis();
        }
    }

    // run is over: thread dies
}

它是否正确地解释了滞后并且是最佳的?

我的意思是,如果视频无法每秒更新60次,那么update()会被称为每秒60次吗?

由于

1 个答案:

答案 0 :(得分:2)

  

如果视频无法每秒更新60次,那么update()会被称为每秒60次吗?

答案是否定的。在每个游戏循环开始时,您可以计算自上次游戏循环以来的持续时间。您将其存储在“timeElapsed”中。

从这里,您将其与“FRAME_RATE”进行比较。 “FRAME_RATE”是一个误导性的名称,因为在您的情况下,它不是您的帧速率。您希望帧速率为60.为了等待适当的时间,FRAME_RATE应为1000(毫秒)/ 60(每秒帧数)。

现在,在每次迭代开始时,您将花费经过的时间并测试是否是下一帧的时间。如果不是,则跳过任何实际处理或渲染,然后再次运行循环。

当经过的时间最终超过FRAME_RATE(实际上是帧延迟)时,执行处理并渲染帧。理想情况下,执行此操作所需的时间将少于帧延迟,从而允许您的下一次迭代按计划开始。只要是这种情况,update()和display()将被调用大约每秒60次。

但是,如果渲染和处理帧所需的时间更长而不是帧延迟,那么下一帧将在下一次迭代时处理,它将是。在这种情况下,update()和display()的调用次数将少于每秒60次。