gpt4 book ai didi

java - 在 Java 游戏中渲染比更新更快有什么好处?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:30 26 4
gpt4 key购买 nike

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

第二个循环更新、渲染,然后 hibernate 一会儿,让主线程完全空闲。如果其他线程影响变量,您必须等到调用 render() 的线程完成 hibernate 并使用 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。什么是更好的方式去? (利弊?)

最佳答案

第一组代码的重点不是呈现比更新更频繁,而是允许更新比呈现更频繁。例如,如果更新需要 1/80 秒,而渲染需要 1/80 秒,那么您就没有时间为每 1/60 秒的帧进行更新和渲染。第一组代码将允许更新以预期的速度发生——每一帧——同时在有时间的时候渲染——在这种情况下,每三帧。帧速率下降,但 Action 继续以正常的预期速度进行。

使用相同的参数——更新需要 1/80 秒,渲染需要 1/80 秒——第二种情况会越来越落后于 Action ,每 1/需要 1/40 秒第二帧60。您的游戏就像慢动作一样。

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

关于java - 在 Java 游戏中渲染比更新更快有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22286862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com