ds_map是否会破坏子地图?

时间:2016-04-20 01:56:48

标签: memory data-structures hashmap game-maker gml

我正在尝试在Game Maker中制作一个照明系统,并构建我想要包含ds_map中所有灯光的系统。我希望ds_map保存在包含系统中所有灯光的第二个ds_map中

lights {
"l-01": {"x":20, "y":40, "radius":15},
...
}

我对清理系统的问题: 我是否必须遍历地图摧毁所有子地图然后摧毁地图,当光照地图被摧毁时,Game Maker会自动销毁子地图吗?

ds_map_destroy(lights); // do the sub maps ("l-01") also get destroyed?

或者我必须这样做:

var k = ds_map_find_first(lights);
repeat(ds_map_size(lights)){
    ds_map_destroy(lights[? k]);
    k = ds_map_find_next(lights, k);
}

继第一个问题之后,如果我删除一个键,游戏制作者会破坏子地图

ds_map_delete(lights, "l-01") // will this destroy the map indexed under "l-01"

您可能会问:“为什么使用ds_map来保存一堆ds_maps,为什么不创建一个地图列表?

答案来自第二个问题。如果我将列表保存在列表中,并且我需要删除其中一个映射,则列表将在删除映射时调整大小,从而抵消所有其他索引值 第二个原因是在Game Maker中,ds_maps比ds_lists快得多

我希望我的问题清楚,你们中的一个人有答案。

1 个答案:

答案 0 :(得分:1)

如果您将添加的数据结构标记为列表/地图(使用ds_list_mark_as_map()ds_list_mark_as_list()ds_map_add_list()ds_map_add_map()),则会自动将其删除。否则你需要自己删除它。

有关ds_list_mark_as_list()的文档:

  

注意:一旦ds_list中有一个标记为另一个列表或地图的值,销毁列表也会破坏标记的列表和地图。这意味着在销毁" parent"之前,您不必手动浏览列表内容并单独销毁标记的数据结构。列表。

ds_map_add_list()

  

如果ds_map以这种方式添加了列表,则销毁父映射也会破坏包含的列表并释放其内存。

如果您有疑问可以检查,是否存在数据结构,使用ds_exists()