我可以做些什么来减少游戏中大量对象的延迟?

What can I do to reduce lag from large amounts of objects in my game?

澄清一下,我知道为什么我的游戏 运行 速度很慢。我在当前区域有很多不同的对象,它必须勾选并渲染所有这些对象。我只是不知道如何在不减少对象的情况下解决问题。

我正在寻找的答案更多的是关于如何解决这个问题的概念,而不是仅仅制作一堆代码供我粘贴到我的游戏中。

我正在根据 RealTutsGML 的教程设计我的游戏。在那里我不得不使用他构建游戏的方法解决一些问题,但我想通了。

因此,我游戏中的每个滴答声,我都必须查看 所有 当前存在的对象。存在的对象越多,处理所有对象所需的时间就越长。例如,如果这些对象当前不在视图中,我需要找到一种方法来帮助释放内存。我知道像 Minecraft 这样的游戏使用块来释放未使用的内存。 (不生成视距外的方块)我该怎么做才能让环境中有很多物体而不会造成如此多的延迟?我希望能够拥有一个大关卡,而不会因为所有必须勾选和渲染的对象而产生太多延迟。

我要澄清的另一件事是,加载到关卡中的所有对象都保存在一个 LinkedList 中,这样我就可以轻松地创建和销毁对象。每个滴答声,我 运行 一个 for 循环遍历这些链接列表以处理每个对象的行为以及它们的呈现方式。

[编辑 4 月 28 日]

我正在处理的游戏中的对象以非常类似网格的格式组织。所以这包括方块、玩家和所有其他游戏对象。

你没有提供太多关于你的游戏的信息(我也不打算通读教程)。您可能想提供更多背景信息,也许还需要一些代码片段。

关于您的代码,我肯定知道一件事:您使用的是链表。链表,尤其是当你在中间添加和删除东西时,速度很慢。这样做的原因是内存(或缓存)局部性。当他们说 计算机 以指数级速度增长时,他们的意思是 处理器 是。您的数据需要从它在内存中的位置传输到另一个位置,再到可以使用它的地方。当需要数据时,它通过总线传输,总线也带来相邻数据。 (请注意,"bus" 实际上是该组件的技术名称。)链表,尤其是您如何使用它们,以破坏数据邻域的方式操作数据。结果,总线本质上变成了 "taxi",一次获取一个数据。根据图表,总线比 1980 年代的计算机快 10 倍(请记住,该图表具有指数比例)。

此外,在我看来您可能不需要在每一帧都勾选每个对象。是的,有些物体,比如生物,需要每一帧都进行 tick(如果它们足够接近以激活)。从我假设你的游戏的样子来看,你的每一块草都是它自己的对象并且每一帧都在滴答作响。别再看草了。

例如,MineCraft 只会在相邻方块发生变化时勾选沙块(这就是为什么空中生成的沙子只会在受到干扰时掉落)。

您可能想查看这些页面:

Question about memory locality.

Question about linked lists and memory locality

Site explaining cache locality, and source of picture.

Question about slow graphics loop.

Code Review is a good place to get feedback on your code.

Game Development will give more game-based answers.

在这样一个有组织的环境中,我认为制作块(持有 tiles/game 对象)和巨型块(持有块,块仍然 运行 很慢)会很明显成为一个明确的解决方案,尤其是在这样一个有组织的环境中。就像这里有人说的,显然不是所有的东西都需要一次处理,甚至不是一次全部存在。

以下是我如何看待块的有用之处。

我试过了,但没有发现太大的不同,所以我将尝试制作块来容纳块,希望这会有所帮助。