7

我一直在尝试如何存储 2D 游戏世界的不同想法。我对在管理可见的集合(比如说 100,000 个方块)的同时存储大量对象的技术很感兴趣。显然,这些技术可能会根据游戏渲染该空间的方式而有所不同。

让我们假设我们描述的是一个滚动的 2d 游戏世界,而不是基于屏幕的游戏,因为你可以很容易地从这样的设置中进行基于屏幕的渲染,而反之则有点混乱。

在这里寻找与语言无关的解决方案,以便对其他人更有帮助。

编辑:我认为这里的一个好的答案是对考虑这一点时要考虑的想法进行一般性回顾,正如一些响应者所尝试的那样,但也开始解释不同的解决方案将如何应用于这些场景。这是一个有点复杂的问题,所以我希望有一个很好的答案来反映这一点。

4

5 回答 5

7

四叉树是一种相当有效的解决方案,用于存储有关大型二维世界和其中的对象的数据。

于 2009-08-02T06:09:56.477 回答
2

将世界分成更小的区域,并处理它们。这个问题的任何解决方案都将归结为这个概念(例如四叉树,在另一个答案中提到)。不同之处在于它们如何细分世界。

每个图块存储多少数据?玩家在全球范围内移动的速度有多快?屏幕外的 NPC 等的行为是什么?当玩家回来时它们是否会重置(就像旧的塞尔达游戏一样)?他们只是恢复到原来的位置吗?他们会做某种追赶脚本吗?

不同区域需要多少不同的渲染数据?

一次可以看到世界的多少?

所有这些问题都会影响您的解决方案以及平台的功能。在不合理了解这些参数的情况下为这些问题提出一般性答案将有点困难。

于 2009-08-02T06:37:36.580 回答
2

您可能会从一些空间数据结构(如范围或 kd 树)中获得一些关于如何实现这一点的想法。

但是,这个问题的答案会因游戏的运行方式而有很大差异。

我们是在谈论一个 2D 平台游戏,屏幕上有 10 个敌人,还有 20 个在屏幕外但“活跃”,还有一个未知数字更“不活跃”?如果是这样,您可能可以将整个关卡存储为一系列“屏幕”,您可以在其中操作离您最近的那些。

或者你的意思是真正的 2D 游戏也有很多上下移动?您可能需要在这里更加小心。

该平台也具有一定的重要性。如果您正在为台式 PC 实现一个简单的平台游戏,您可能不必像在嵌入式设备上那样担心性能。这不是天真的借口,但你也不必非常聪明。

这是一个我认为有点有趣的问题。大概比我更聪明的人在实施平台游戏方面已经考虑过这些事情了。

于 2009-08-02T05:30:06.760 回答
1

假设您的游戏只会更新可见内容和可见内容周围的某些区域,只需将世界划分为“屏幕”(“屏幕”是瓷砖地图上可以填满整个屏幕的矩形区域)。将可见区域周围的“屏幕”保留在内存中(如果您想更新靠近角色的实体,还有更多的“屏幕” - 但没有理由更新那么远的实体)并将其余部分保存在磁盘上并带有缓存避免在您四处走动时装载/卸载经常访问的区域。一些设置,如:

+---+---+---+---+---+---+---+
|FFF|FFF|FFF|FFF|FFF|FFF|FFF|
+---+---+---+---+---+---+---+
|FFF|NNN|NNN|NNN|NNN|NNN|FFF|
+---+---+---+---+---+---+---+
|FFF|NNN|NNN|NNN|NNN|NNN|FFF|
+---+---+---+---+---+---+---+
|FFF|NNN|NNN|VVV|NNN|NNN|FFF|
+---+---+---+---+---+---+---+
|FFF|NNN|NNN|NNN|NNN|NNN|FFF|
+---+---+---+---+---+---+---+
|FFF|NNN|NNN|NNN|NNN|NNN|FFF|
+---+---+---+---+---+---+---+
|FFF|FFF|FFF|FFF|FFF|FFF|FFF|
+---+---+---+---+---+---+---+

其中“V”部分是中心(英雄或其他)所在的“屏幕”,“N”部分是附近并具有活动(更新)实体、检查碰撞等的部分,“F”部分是可能不经常更新并且容易被“交换”出去(存储到磁盘)的远部分。当然,您可能想要使用比两个更多的“N”个屏幕:-)。

请注意,由于 2D 游戏通常不会保存太多数据,而不是将远处的部分保存到磁盘,您可能只想将它们压缩在内存中。

于 2009-08-05T05:10:46.763 回答
0

您可能想要使用链接到块类型的单个 int 或 byte 数组。如果您需要从那里进行更多优化,那么您需要链接到更复杂的数据结构,例如数组中的八叉树。Java 游戏论坛上有一个很好的讨论:http://www.javagaming.org/index.php/topic,20505.30.html text

任何带有链接的东西都会变得非常昂贵,因为指针每个占用 8 个字节,具体取决于语言,因此取决于您的世界的人口数量,它可能会很快变得昂贵(8 个指针,每个 8 个字节是每个项目 64 个字节,并且字节数组是每个项目 1 个字节)。所以除非你世界的 1/64 是空的,否则字节数组将是一个更好的选择。每当您进行碰撞查找或其他任何事情时,您还需要花费大量时间遍历树 - 字节数组将是即时查找。

希望这对您来说足够详细。:-)

于 2009-08-19T03:09:15.087 回答