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

在Java游戏中,渲染速度比更新速度快有什么好处?,java,performance,loops,timer,game-loop,Java,Performance,Loops,Timer,Game Loop,答:第一个循环是不断渲染的,即使没有调用update(),因此除非有其他线程影响变量,而不是调用update(),否则它会渲染相同的内容几次,直到再次更新。主循环以最大速度运行,这会导致更高的CPU使用率 第二个循环更新、渲染,然后休眠一段时间,使主线程完全空闲。如果其他线程影响变量,则必须等待调用render()的线程使用update()完成休眠和更新,以便render()最终可以渲染新屏幕,具体取决于其他线程如何影响它 如果你正在制作一个由多线程组成的大型游戏,第一个循环更好,第二个循环更适

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

第二个循环更新、渲染,然后休眠一段时间,使主线程完全空闲。如果其他线程影响变量,则必须等待调用
render()
的线程使用
update()
完成休眠和更新,以便
render()
最终可以渲染新屏幕,具体取决于其他线程如何影响它

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


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

我知道,对于这样更复杂的循环,您可以做一些事情,比如在再次更新之前查看是否有时间渲染另一个屏幕等等

我的问题是渲染速度比更新速度快有什么意义?为什么这样的东西不能更有效:

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。有什么更好的方法吗?(利弊?)

标准软件工程可能不适用于游戏开发,但通常情况下,您的目标是MVC。控制器更改模型,视图渲染模型。如果可以选择,您还需要事件驱动代码,但看起来您是在轮询,而不是使用回调

因此,如果这是pong,那么控制器将输入'up',在update()中,将'y'变量增加1,然后render()将其增加一个像素

因此,简单地考虑一下,你会期望它是这样的……我认为基于投票机制,你不会得到任何更好的结果

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

拥有一个偶尔在后台休眠的线程不会改变任何事情。

第一组代码的要点不是渲染比更新更频繁,而是允许更新比渲染更频繁。例如,如果更新需要1/80秒,渲染需要1/80秒,那么您只需在上,我们没有时间对第二帧的每1/60执行更新和渲染。第一组代码将允许更新以预期的速度进行-每帧-在有时间进行渲染时-在这种情况下,每三帧。帧速率下降,但操作将以正常预期的速度继续

使用相同的参数-更新时间为1/80秒,渲染时间为1/80秒-第二种情况会越来越落后于动作,每1/60帧需要1/40秒。您的游戏将表现为慢动作


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

是的,我有这样的系统在运行(更新会影响我的对象,渲染会看到它并渲染它)。我的问题是CPU使用量的巨大差异。使用
线程。睡眠(#)
方法节省了我大量的CPU,而第一个循环平均占用了25%。即使在渲染/更新的同时进行(使用第一个循环),它占用了大量CPU。第二个循环会给我带来任何问题吗?如果我同时进行更新/渲染,它会导致与某些内容冲突吗?我宁愿使用第二个循环,因为我节省了多少CPU。嗯,让我快速检查一下……我不认为后台线程睡眠会产生任何积极的影响。如果你愿意,我会我会为这两个都写一个演示,并把它贴在我的问题上,你可以测试(节省你的时间)好吧,这可能不是必需的…如果你去掉休眠线程,你的CPU使用率将回到25%。我认为,对于休眠线程,你的CPU有空闲的时间,没有效率。方法1和方法2之间的主要区别在于第一种方法有轮询时间,而第二种方法的轮询时间设置为“as”“当渲染完成时显示”。
while(running) {
    if (pollTime) update();
    render();    
}