我该怎么做才能减少游戏中大量物体的延迟?

时间:2016-03-16 06:29:44

标签: java swing java-canvas

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

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

我根据RealTutsGML的教程设计我的游戏。在某些问题上,我必须解决他的构建游戏的方法,但我想出来了。

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

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

[编辑4月28日]

我正在处理的游戏中的对象是以类似网格的格式组织的。所以这包括瓷砖,播放器和所有其他游戏对象。

2 个答案:

答案 0 :(得分:1)

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

我确切地知道您的代码有一点:您正在使用链接列表。链接列表,特别是当你从中间添加和删除东西时,很慢。原因是内存(或缓存)局部性。当他们说计算机以指数级增长时,它们意味着处理器。您的数据需要从其内存中的内存传输到另一个位置,以便可以使用。当需要数据时,它由总线传输,总线也带来相邻数据。 (注意"总线"实际上是组件的技术名称。)链接列表,尤其是您如何使用它们,以破坏数据邻域的方式操纵数据。结果,公共汽车基本上变成了出租车,一次获得一个数据。根据图表,总线比1980年代的计算机快10倍(请记住,图表具有指数级别)。

Your bus is slow

另外,在我看来,你可能不需要在每个帧中勾选每个对象。是的,一些物体,如小怪,需要勾选每一帧(如果它们足够接近活动)。从我假设你的游戏看起来,你有每一块草是自己的对象,并勾选每一帧。别再看草长了。

例如,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.

答案 1 :(得分:0)

在这样一个有组织的环境中,我认为很明显,制作块(保存图块/游戏对象)和大块(保持块,块仍然运行缓慢)将是一个明确的解决方案,尤其是在有组织的像这样的环境。就像在这里的人所说的那样,显然不是所有东西都需要立即处理,甚至不能同时存在。

以下是我看待块有用的方法。

我尝试了这个,但没有看到太大的区别,所以我将尝试制作块以保留块,希望这会有所帮助。