让我们假设我们正在描述一个滚动的2D游戏世界,而不是基于屏幕的,因为你可以从这样的设置中相当容易地进行基于屏幕的渲染,而反过来则要复杂得多。
这里寻找与语言无关的解决方案,以便对其他人更有帮助。
编辑: 我认为一个好的答案应该是对考虑这一点的思路的概括审查,就像一些回答者所尝试的那样,但也要开始解释不同的解决方案如何适用于这些情况。这是一个有些复杂的问题,所以我希望一个好的答案能够反映出这一点。
四叉树是一种相当高效的解决方案,用于存储关于大型二维世界及其中的对象的数据。
你可以从一些空间数据结构(如范围树或kd树)中获取一些实现此功能的想法。
然而,这个问题的答案会因为你的游戏如何工作而有很大的不同。
我们是在讨论一个2D平台游戏吗?场景上有10个敌人,20个在屏幕外但“活跃”,还有一个未知数量的“非活跃”敌人?如果是这样,你可以将整个关卡存储为一个“屏幕”数组,在其中操作最靠近你的部分。
或者你是指真正的2D游戏,同时有很多上下运动?这里可能需要更加小心。
平台的重要性也很大。如果你正在为桌面PC实现一个简单的平台游戏,你可能不必像在嵌入式设备上那样担心性能。这并不是说你可以对它毫不在意,但你可能不必过于聪明。
我认为这是一个有趣的问题。想必比我聪明的已经有经验的平台游戏开发者已经思考过这些问题了。
+---+---+---+---+---+---+---+
|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游戏通常不保存太多数据,因此您可能希望将远离的部分压缩后仅保留在内存中。
你可能想使用一个单一的int或byte数组来链接块类型。如果你需要更多的优化,那么你就需要从数组中链接到更复杂的数据结构,比如八叉树。这里有一个关于Java游戏论坛的好讨论:http://www.javagaming.org/index.php/topic,20505.30.html text
任何带有链接的东西都会变得非常昂贵,因为指针占用了大约8个字节,具体取决于语言,所以根据你的世界有多少人口密集,它很快就会变得非常昂贵(8个指针每个8个字节,每个字节数组是1个字节)。所以除非你的世界中有1/64是空的,否则字节数组将是一个更好的选择。每当你进行碰撞查找或其他操作时,你还需要花费大量时间迭代树 - 字节数组将是即时查找。
希望这对你足够详细了。 :-)