计算机科学中有两个难题。命名,缓存无效和一一错误。
这是一个缓存失效问题。
如果您有“这是里面”的记录,则每当放置或删除一个块时,就很容易通过泛洪填充来更新它及其区域。
要对此进行优化,您可能需要一组“内部”层。
“单元”是被玩家放置的方块(一定大小)包围的区域。
“房间”是带有背景图块的单元格。
“内部”是一间带门,灯和椅子的房间。
放置玩家放置的前景块时,请沿顺时针/逆时针方向走,以查看是否形成了新的单元格。移除放置在播放器上的前景块时,请检查它是否破坏了任何单元格—如果是这样,请查看通过合并这两者而形成的新单元格。
当新的单元格形成或未形成时,请检查其是否为房间或内部。
单元可以跟踪一个房间需要多少背景图块。然后简单地计数一个单元格的形成,在单元格中添加或移除背景图块,就可以确定它是否为房间。
同样,单元可以跟踪其中有多少把椅子和光源(实际上是各种物体)。然后内部检查是微不足道的。
也可以计算入口数。
因此,我们用“单元格”扩充了地图。添加或删除图块时,我们会检查位置的单元格,并增加/减少单元格中的计数。
添加或删除前景块时,请使用顺时针/逆时针行走来定义单元的内部和外部。由于像元的大小有限,因此此步行将采取有限的步骤。
作为奖励,您现在可以以一种便宜的方式谈论“豪华”房间,或“房间被圣泉赐福”,或与房间有关的其他任何东西,因为房间内有每种对象类型的计数。(或者,由于房间的大小有限,只需执行一次迭代;这将删除缓存)。
每个位置最多包含一个单元格,因此您可以在主地图上存储每个位置的单元格ID。