java - 如何使用线程根据相机位置生成地形而不会出现突然的延迟?

标签 java multithreading

这是交易。我的游戏根据相机的位置(二维等距)生成随机生成的地形 block 。当从一个 block 移动到另一个 block 时,总会有一个微小的延迟爆发,这会导致一点跳跃,因为游戏必须等待地形生成才能进一步移动相机。根据我对线程的理解,它们可以用来在主线程像平常一样移动相机的同时生成地形。我只是不太确定该怎么做。也许是这样的?

Update(){
if(cam != prevcam)
{
thread.start();
}
}

然后,在另一个线程完成生成后,它会以某种方式暂停自身,并在下次相机位置发生更改时重新启动。请注意,相机位置是指相机所在的 block 。如果它以 block 40,42 为中心,那么它将是 1,1

最佳答案

您可以使用线程来解决这个问题,并且它可能会起作用,但是您将引入一整套问题,这些问题(a)可能仍然会导致延迟,并且(b)将更难修复.

不要误会我的意思,我喜欢线程,但我不会使用它们来解决这个特定问题,特别是在大多数游戏中紧密的输入/逻辑/渲染循环中。

之所以会出现延迟,是因为帧渲染之间需要完成的工作量需要足够长的时间,以至于您会注意到帧速率下降了。您真正想做的是找到一种方法,将地形生成切成适合单帧渲染内部的更小的 block /任务,然后根据需要将地形生成分散到尽可能多的帧渲染上,以在不丢失帧的情况下完成任务率低于用户会注意到的值。

更深入一点,我可以理解为什么您可能会想使用线程来解决这个问题。问题是,当您有工作要做时,线程是最好的,并且您不太关心它们完成需要多长时间,或者您确实需要运行两段或更多代码同时地。在同时运行代码的情况下,线程也不总是最佳解决方案。有时产生一个单独的进程,并将多任务调度留给操作系统(调度程序是一段经过大量专业工程师高度优化的代码)通常是更好的答案。

通过将线程引入游戏循环,线程的工作仍然需要在非常小的、明确定义的时间窗口内完成,这意味着它需要与应用程序的其余部分同步工作,这意味着没有任何好处在多个线程中运行,因为您仍然像单线程应用程序一样运行。

唯一的异常(exception)是,如果您确实需要利用多核。请注意,添加线程虽然非常棒,但在大多数情况下会增加不必要的复杂性。

在说了所有这些之后,为了回答您最初的问题,您可以使用线程来完成此操作,方法是将其切成小块的工作,并让线程尽快处理这些 block ,而无需花费太多时间大量 CPU 时间远离对时间敏感的线程,例如渲染线程。

我希望看到更多游戏利用线程。问题在于,大多数游戏本质上都是模拟,几乎所有内容都与中央时钟相关(动画、声音、AI 计算等),并且只有在用户没有注意到的情况下才能删除与中央时钟的直接连接它。这方面的例子可能包括:

  • 预先计算随机天气(只有计算出天气后,用户才能看到任何东西),并且实际天气何时出现并不重要(就游戏玩法而言)
  • 路径查找,但前提是游戏中的角色有时需要比其他时候更长的时间来计算路径。

由于线程不会按照已知的顺序或在一定时间内启动/停止执行,这意味着有时需要 1/10 秒,但如果 CPU 繁忙,可能总共需要 1/10 秒2 秒,与 CPU 的可用性有关。

无论如何 - 祝你游戏顺利!

关于java - 如何使用线程根据相机位置生成地形而不会出现突然的延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8350343/

相关文章:

java - Tomcat 中的 NIO 连接器

java - [Java]indexOf是否使用equals?

java - Android:SQL - 代码行为不同

c# - 使用程序集引用 dll 的某些方法时用户界面停止

vb.net - 在每个循环上等待一秒钟

multithreading - 解决死锁: Lock Ordering

java - maven-deploy-plugin 不知道我在其中将其声明为构建插件的 pom 吗?

java - 在 Glassfish 3.1.2 上使用 WebService 客户端代码部署 Ear 时出现 AbstractMethodError

java - 什么时候 1 个线程比同时运行的多个线程运行得更快

multithreading - 如何在Delphi中使用管道模式