我将开始研究一款新游戏,其中一件我想要完成的事情是一个动态阵列系统,可以保存地图数据。游戏将自上而下2d,并使用XNA 4.0和C#制作。您将从随机区域开始,该区域基本上是基于区块的。因为这样的二维数组将是通过保持对应于纹理列表的数值来实现此目的的一种方式,并且将是如何绘制该随机创建的地图。问题是我只想在你开始的地方创建一个区域,他们可以冒险进入他们想要的方向。这意味着我必须在他们去的方向上填充更多随机数据的地图数组。我可以创建一个非常大的数组,并使用它的中心,其余的将是预期要制作的新内容,但这看起来效率非常低。
我想当他们开始一个新游戏时,我可以通过一次性地图创建过程来创建一个随机生成的大型地图数组,但是在任何时候保持所有内存似乎也效率低下。也许如果有一种方法我一次只能在内存中保存部分地图数据,并且不知何故不能将其余部分保留在内存中。最后我只需要在内存中有一块地图与它们有点接近,所以也许你们中的一些人可能会有很好的方法来处理这种随机地图和动态数组问题。它不需要是一个动态数组类型的东西,如果我做它,以便它拉入附近的地图数据,然后一旦离开屏幕,不需要它可以某种方式摆脱那种方式,我不会有一个巨大的阵列占用了大量的内存。
答案 0 :(得分:2)
我只是一名学生,并且没有任何游戏编程经验,但据我所知,你不能在使用它时扩展阵列。我想你需要在九个缓冲区之间来回移动资源(每个缓冲区是一个2-D阵列,每个NSEW和对角线方向一个),每个缓冲区都有9个瓦片。
例如:
玩家加载到一个区域,并且位于3x3图块阵列的中间,这样他们就可以在每个方向上看到图块。在后台,您可以计算周围缓冲区的纹理ID并准备好它们。
[ CENTER ]
+---+---+---+
| | | |
+---+---+---+
| | X | |
+---+---+---+
| | | |
+---+---+---+
当玩家离开中心区域时,例如,东方,它们将位于中心缓冲区的东边缘。
[ CENTER ]
+---+---+---+
| | | |
+---+---+---+
| | | X |
+---+---+---+
| | | |
+---+---+---+
此时,沿着中心缓冲区的边缘放置为东方向准备的缓冲区,使得区块重叠一个。
[ EAST ]
[ CENTER ]
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
| | | X | | |
+---+---+---+---+---+
| | | | | |
+---+---+---+---+---+
这允许玩家能够进入东部缓冲区。在那里,东部缓冲区成为中心缓冲区,旧的中心缓冲区作为新的Western缓冲区重新循环。旧的西部缓冲区(以及与其垂直相邻的缓冲区)也可以回收利用,成为新的东北,东部和东南部缓冲区。
[ CENTER ]
+---+---+---+
| | | |
+---+---+---+
| | X | |
+---+---+---+
| | | |
+---+---+---+
当然,你需要试验一下你需要多少缓冲区,每个缓冲区有多少个区块,以及适当的回收/预处理时间对于性能的影响,但我想这会有用。
答案 1 :(得分:2)
在你确定问题确实存在之前,我觉得你正试图解决问题。
你是否真的尝试过简单的方法(只是在内存中加载所有内容)并看到它使用了太多内存? Quoth Knuth,“Premature optimization is the root of all evil”。
重点是,首先关注你想要完成的独特事情,这就是你创造这个游戏的原因 - 肯定会有足够的东西让你在那里忙碌。除非你有一些疯狂的范例转换自上而下的2D滚动器,内存利用率可能不是一个限制因素 - 即使在像智能手机这样受限制的环境中。
如果您完成游戏开发并发现内存利用率实际上是一个问题,那么将是开始优化的最佳时机。不要只关注你在问题中假设的解决方案(时间缓存和预取),而是要开始寻找程序使用它不需要的内存的其他方法。