C# 如何存储二维平铺贴图?

C# 如何存储二维平铺贴图?,c#,storage,tiles,C#,Storage,Tiles,考虑一下《塞尔达传说:与过去的联系》中的瓷砖和图层。在平铺编辑器中存储此地图的理想方式是什么?目前,我使用一个多维矩形数组作为一个单层。这些平铺层的列表由地图组成。每个矩形都与tileset中的矩形相对应。但是,问题是编辑地图时应允许编辑地图大小、宽度、高度和图层数 目前,当有人编辑地图的尺寸时,我只是用指定的尺寸创建一个新数组。这一切都很好,但现在我添加了撤销和重做支持,这开始使事情复杂化,因为每次用户更改地图的尺寸,我都必须在每次更改之前存储整个地图的副本。现在我正在考虑其他方法 是否最好只

考虑一下《塞尔达传说:与过去的联系》中的瓷砖和图层。在平铺编辑器中存储此地图的理想方式是什么?目前,我使用一个多维矩形数组作为一个单层。这些平铺层的列表由地图组成。每个矩形都与tileset中的矩形相对应。但是,问题是编辑地图时应允许编辑地图大小、宽度、高度和图层数

目前,当有人编辑地图的尺寸时,我只是用指定的尺寸创建一个新数组。这一切都很好,但现在我添加了撤销和重做支持,这开始使事情复杂化,因为每次用户更改地图的尺寸,我都必须在每次更改之前存储整个地图的副本。现在我正在考虑其他方法

是否最好只使用一个最大映射大小,并在启动时将数组设置为该大小,这样我就不必创建新数组并如此频繁地复制数据?使用列表的列表而不是多维数组怎么样


我不确定我对目前的设置感觉如何。起初我对它很满意,但现在我有了新的想法。我现在根本没有注意到减速,所以也许我在做过早的优化,这当然是不好的,应该忘掉这篇文章。我不确定。我很想听听大家的想法。

出于撤消/重做操作的目的,您可以放心地假设,出于以下原因,不需要进行优化

1通常不会使用撤消/重做操作来更改地图尺寸。通常,编辑地图时,标注不会经常更改

2即使使用了撤消/重做操作,重新创建阵列也不一定是一个大问题

可以将平铺存储为自己的对象,并使数组中的每个元素都是对平铺对象的引用。在32位计算机上,256x256映射需要256KB用于磁贴引用,1024x1024映射需要4MB用于磁贴引用。磁贴中的数据本身可以保留在内存中,不能移动

在现代计算机上,4 MB阵列拷贝不会占用任何明显的时间


如果数据大小必须更大,那么最好的解决方案是警告用户无法撤消对维度的更改。用户应在更改尺寸之前保存地图副本。同样,尺寸不会经常变化,而且由于尺寸变化后地图通常会发生根本性的变化,因此用户可能倾向于使用以前版本的副本。

我会使用四叉树,非常适合二维空间分割。您的平台是什么?银灯?wpf?winforms?在本项目的源代码中,您将发现一个保存和搜索二维矩形的四叉树的c实现。这不是你想要的吗?