澄清一下,我知道为什么我的游戏运行缓慢。我在当前区域中有很多不同的对象,它必须勾选并渲染所有这些对象。我只是不知道如何解决问题,而不仅仅是减少对象。
我正在寻找的答案更多的是我如何解决这个问题的概念,而不仅仅是让我将一堆代码粘贴到我的游戏中。
我根据RealTutsGML的教程设计我的游戏。在某些问题上,我必须解决他的构建游戏的方法,但我想出来了。
因此,在我的游戏中,我必须查看当前存在的所有对象。存在的对象越多,处理所有对象所需的时间就越长。例如,如果这些对象当前不在视图中,我需要找到一种方法来帮助释放内存。我知道像Minecraft这样的游戏会使用块来释放未使用的内存。 (不生成视图距离之外的块)我可以做什么来允许具有许多对象的环境而不会导致如此多的延迟?我希望能够有一个很大的水平,而不会有所有必须勾选和渲染的物体的滞后。
我要澄清的另一件事是,加载到关卡中的所有对象都保存在LinkedList中,这样我就可以轻松地创建和销毁对象。每次打勾,我都会在这些链接列表中运行for循环来处理每个对象的行为以及它们的呈现方式。
[编辑4月28日]
我正在处理的游戏中的对象是以类似网格的格式组织的。所以这包括瓷砖,播放器和所有其他游戏对象。
答案 0 :(得分:1)
您还没有提供太多关于您游戏的信息(我也不会查看教程)。您可能想要提供更多背景信息,也许还有一些代码片段。
我确切地知道您的代码有一点:您正在使用链接列表。链接列表,特别是当你从中间添加和删除东西时,很慢。原因是内存(或缓存)局部性。当他们说计算机以指数级增长时,它们意味着处理器。您的数据需要从其内存中的内存传输到另一个位置,以便可以使用。当需要数据时,它由总线传输,总线也带来相邻数据。 (注意"总线"实际上是组件的技术名称。)链接列表,尤其是您如何使用它们,以破坏数据邻域的方式操纵数据。结果,公共汽车基本上变成了出租车,一次获得一个数据。根据图表,总线比1980年代的计算机快10倍(请记住,图表具有指数级别)。
另外,在我看来,你可能不需要在每个帧中勾选每个对象。是的,一些物体,如小怪,需要勾选每一帧(如果它们足够接近活动)。从我假设你的游戏看起来,你有每一块草是自己的对象,并勾选每一帧。别再看草长了。
例如,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.
答案 1 :(得分:0)