答案:即使没有调用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。什么是更好的方式去? (利弊?)
答案 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();
}
让一个偶尔在后台睡觉的线程不会改变任何东西。