达到1.5Gb时,应用程序崩溃。
这强烈表明您未正确表示图块,因为这意味着每个图块的大小约为80个字节。
您需要了解的是,图块的游戏概念与用户看到的可视图块之间必须有分隔。这两个概念不是一回事。
以Terraria为例。最小的Terraria世界占用了4200x1200的图块,即500万个图块。现在,代表那个世界需要多少内存?
好吧,每个瓷砖都有一个前景层,一个背景层(背景墙),一个用于放置电线的“电线层”和一个用于放置家具的“家具层”。每个磁贴占用多少内存?再说一次,我们只是在概念上而不是视觉上说话。
前景图块可以轻松存储在无符号的short中。最多有65536种前景图块类型,因此使用更多的内存没有意义。背景图块很容易以无符号字节为单位,因为少于256种不同类型的背景图块。导线层是纯二进制的:图块中有导线,也可能没有。因此,每个磁贴只有一比特。家具层又可以是一个无符号字节,具体取决于有多少种不同的家具。
每个图块的总内存大小:2字节+1字节+1位+1字节:4字节+1位。因此,小的Terraria映射的总大小为20790000字节,即〜20MB。(注意:这些计算基于Terraria 1.1。自那时以来,游戏进行了很多扩展,但即使是现代Terraria,每个图块位置也可以容纳8个字节,约40MB。仍然可以忍受)。
您永远不要将这种表示形式存储为C#类的数组。它们应该是整数数组或类似的东西。AC#结构也可以正常工作。
现在,当需要绘制地图的一部分时(请注意重点),Terraria需要将这些概念图块转换为实际图块。每个磁贴实际上需要选择一个前景图像,背景图像,一个可选的家具图像,并具有一个有线图像。这就是XNA带有各种Sprite表等的地方。
您需要做的是将概念图的可见部分转换为实际的XNA Sprite工作表图块。您不应该尝试一次转换整个事情。您存储的每个图块都应该只是一个索引,表明“我是图块类型X”,其中X是整数。您可以使用该整数索引来获取用于显示它的精灵。而且,您可以使用XNA的Sprite工作表,使其比绘制单个四边形更快。
现在,需要将图块的可见区域分解为不同的块,以使您不必在相机移动时就不断构建精灵表。因此,您可能拥有64x64的精灵块。从玩家当前摄像机位置可见的世界上任何64x64块都是您绘制的块。其他任何块都没有子画面。如果某个块从屏幕上掉落,则将其扔掉(注意:您并未真正删除它;而是保留它并为以后可能会看到的新块重新指定它)。
我希望至少在服务器应用程序(如果可能的话,在客户端)上处理整个地图。
您的服务器不需要了解或关心图块的外观。它只需要关心概念表示即可。用户在此处添加图块,因此它会更改该图块索引。