Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 处理大型运行时生成的平铺贴图的有效方法?_Objective C_C_Performance_Memory Management - Fatal编程技术网

Objective c 处理大型运行时生成的平铺贴图的有效方法?

Objective c 处理大型运行时生成的平铺贴图的有效方法?,objective-c,c,performance,memory-management,Objective C,C,Performance,Memory Management,我正在编写一个基于二维平铺(正交平铺)的iPhone游戏。所有关卡都是在应用程序首次播放时按程序生成的,然后一直保存到用户需要新地图为止。地图相当大,宽度和高度都有1000块,地形是可破坏的。目前,情况与之相当相似,但这将改变 为了保存贴图/平铺信息,我目前正在使用几个二维c样式数组。这很好,但我担心这会占用多少内存,因为数组都被定义为短数组[1000][1000],它会占用(1000*1000*sizeof(short))字节的空间 当iPhone没有难以置信的大容量内存可供使用时,尤其是当用

我正在编写一个基于二维平铺(正交平铺)的iPhone游戏。所有关卡都是在应用程序首次播放时按程序生成的,然后一直保存到用户需要新地图为止。地图相当大,宽度和高度都有1000块,地形是可破坏的。目前,情况与之相当相似,但这将改变

为了保存贴图/平铺信息,我目前正在使用几个二维c样式数组。这很好,但我担心这会占用多少内存,因为数组都被定义为
短数组[1000][1000]
,它会占用(1000*1000*sizeof(short))字节的空间

当iPhone没有难以置信的大容量内存可供使用时,尤其是当用户同时处理多个任务时,这一点并不特别理想。主要问题是,我无法使用特定的平铺贴图格式,如.tmx,因为所有级别都是按程序生成的。性能也可能是一个问题,因为如果一个磁贴在索引(x,y)处被破坏,那么我需要更改该索引中的数据。我还考虑过将平铺贴图数据写入文本文件,但我认为在访问或更改数据时会有困难或性能问题


记住这一切,什么样的方法可以高效快速地处理我的磁贴数据?

我的直觉是核心数据的结构,这样每个磁贴元素都与周围的磁贴有关系。这里有一些不平凡的开销,但优点是,您可以从内存中释放屏幕上没有的磁贴,并在需要时将其修复。当您朝某个方向移动时,您可以查询该方向的磁贴,并且当您在后台时,您可以相当便宜地转储内存。这将消除“几个”2D数组,并将所有数据移动到单个对象中。原则上,网格可以是无限大的,因为一切都是通过关系而不是坐标


同样,您可以使用SQLite来解决这个问题,查询给定范围内的行和列。您可以将对象标记为
NSDiscardableContent
,并将其放入
NSCache
,这可以显著提高内存性能。只要允许坐标同时为正和负,您仍然可以生成一个有效的无限网格。

如果是按程序生成的,为什么不能在需要时生成平铺值,而不是预先生成整个网格?这是一个很好的观点:这主要是由于过程。我的地图使用了一种放置一些瓷砖的方法;我不知道我将如何做到这一点,除了一次,只是由于过程的性质。这听起来很有希望!考虑到我已经很多年没有编程了,你认为这两个选项中哪一个更好?(如果需要的话,哪一个更容易实现和扩展?)我可能会倾向于核心数据,因为他们已经为您做了很多艰苦的工作和优化,特别是如果您对SQLite还不是很熟悉的话。我只是查看了核心数据,这似乎很有希望。谢谢你指给我看!我把这当作我的答案。