渲染速度比Java游戏中的更新有什么好处?

时间:2014-03-09 19:17:30

标签: java performance loops timer game-loop

答案:即使没有调用update(),第一个循环也在不断渲染,所以除非你有其他线程影响调用update()以外的变量,否则它会渲染相同的东西几次,直到它再次更新。主循环以最大速度运行,这导致更高的CPU使用率。

第二个循环更新,渲染,然后稍微休眠,让主线程完全空闲。如果其他线程影响变量,则必须等到调用render()的线程完成休眠并使用update()进行更新,以便render()最终可以根据其他线程如何影响它来呈现新屏幕。

如果您正在制作由多线程组成的大型游戏,则第一个循环会更好。对于仅使用一个线程来运行整个游戏的游戏,第二个循环更好(因此在更新变量和渲染它们之间没有延迟,因为一个线程游戏只在一个线程上更新,并在更新后立即渲染触发器。


我见过各种不同的循环。我的问题是这两个循环之间有什么区别:(所有参考变量都不需要,但是例如给出)

long starttime = System.nanoTime();
int onesec = 1000000000;
int fps = 60;
double difference = 0;
double updatechecker;

while(true) {
     long currenttime = System.nanoTime();
     difference = (currenttime - starttime);
     updatechecker = difference/(onesec/fps);

     while(updatechecker >= 1) {
          //update() here
          updatechecker = 0;
     }
     //render() here

     starttime = currenttime;
}

据我所知,对于这样的更复杂的循环,你可以做一些事情,比如看看是否有时间在再次更新之前呈现另一个屏幕,什么不是。

我的问题是,渲染速度是否比更新更快?为什么这样的事情不会更有效:

while(running) {
    long starttime = System.currentTimeMillis();
    //update() here
    //render() here
    long endtime = System.currentTimeMillis();

    try {
        Thread.sleep((1000/60) + (starttime - endtime));
    } catch(InterruptedException e) {
        e.printStackTrace();
    }

}

我知道在第一个循环中,你可以做一些事情,比如在更新之前检查是否有时间再次渲染,但在同一时间和不同时间更新/渲染之间是否真的有很大区别? (您也可以使用第一个循环并将渲染方法放在更新的位置)

我发现使用Thread.sleep方法会使我的CPU使用量减少一吨。我通常使用第一个循环平均23-26%cpu(尽可能快地渲染),并且我在第二个循环中平均2-4%cpu。什么是更好的方式去? (利弊?)

2 个答案:

答案 0 :(得分:1)

第一组代码的要点不是比更新更频繁地渲染,而是允许比渲染更频繁地​​进行更新。例如,如果更新需要1/80秒,并且渲染需要1/80秒,那么您就没有时间为每1/60秒的帧执行更新和渲染。第一组代码将允许更新以它们应该的速度发生 - 每帧 - 在有时间的情况下进行渲染 - 在这种情况下,每隔三帧。帧速率下降,但动作仍以正常的预期速度继续。

使用相同的参数 - 更新需要1/80秒并渲染1/80秒 - 第二种情况会在动作上进一步落后,每1 /秒需要1/40秒60秒的第二帧。你的游戏会像慢动作一样。

现在,第一组代码确实使用了更多的CPU。在处理updatechecker案例之前,可以通过更改>= 1以检查零来改进它。如果计算出的updatechecker为零,则可以休眠直到下一次更新的时间 - difference % (onesec/fps) / 1000000毫秒。

答案 1 :(得分:0)

标准软件工程可能不适用于游戏开发者,但通常,您的目标是MVC。控制器更改模型,视图渲染模型。如果它是一个选项,你也需要事件驱动的代码,但它看起来像你正在轮询而不是使用回调。

所以如果这是pong,你的控制器输入'up',而在update()中,你将'y'变量增加1,然后render()将它拉高一个像素。

所以简单地考虑一下,你会期望它就是这样......我认为你不会因为投票机制而变得更好。

while(running) {
    if (pollTime) update();
    render();    
}

让一个偶尔在后台睡觉的线程不会改变任何东西。