1

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

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

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

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

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

[编辑 4 月 28 日]

我正在制作的游戏中的对象以非常类似于网格的格式组织。这包括瓷​​砖、玩家和所有其他游戏对象。

4

2 回答 2

1

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

我肯定知道您的代码的一件事:您正在使用链表。链表,尤其是当您从中间添加和删除内容时,速度很慢。原因是内存(或缓存)局部性。当他们说计算机以指数级速度增长时,他们的意思是处理器是。您的数据需要从其在内存中的位置传输到另一个位置,再到可以使用的地方。当需要数据时,由总线传输,同时也带来相邻数据。(请注意,“总线”实际上是组件的技术名称。)链接列表,尤其是您如何使用它们,以破坏数据邻域的方式操作数据。结果,公共汽车本质上变成了“出租车”,一次获取一个数据。根据图表,公共汽车的速度比 1980 年代的计算机快了惊人的 10 倍(请记住,图表具有指数规模)。

你的巴士很慢

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

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

您可能想查看这些页面:

关于内存局部性的问题。

关于链表和内存局部性的问题

解释缓存位置和图片来源的网站。

关于慢速图形循环的问题。

Code Review 是获取代码反馈的好地方。

游戏开发将给出更多基于游戏的答案。

于 2016-03-28T17:14:32.613 回答
0

在这样一个有组织的环境中,我认为很明显,制作块(保存瓷砖/游戏对象)和巨型块(保存块,块仍然运行缓慢)将是一个明确的解决方案,特别是在这样的有组织的环境中. 就像这里有人说的那样,显然不是所有事情都需要一次处理,甚至不是一次全部存在。

这是我认为块有用的方式。

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

于 2016-04-28T01:57:03.983 回答