时隔半年又一次更新
概述
这次主要说说红石系统是怎么构建出来的,这对红石玩家应该没啥帮助,唯一的作用也就是解释一下为什么有些无方块实体的红石电路为何产生卡顿。
在上一篇中给了游戏1gt更新的顺序表,这个表中的第18项也就是更新红石系统依赖是我没怎么提的,因为当时不懂相关的细节,这次把这个部分补充一下,讲述一下玩家放下红石和打掉红石游戏会进行哪些计算。
红石系统
首先必须清楚的是,在代码层面电路原件(CircuitComponent)和红石相关的方块不是一个东西,这两个是分别维护的,红石相关的状态都存在电路原件里面,和方块无关。每个维度有且仅有一个红石系统,这个系统存储了所有的电路原件以及它们之间的相互关系(相关关系上一篇中的无向图),具体主要有下面这几项:
缓存
当玩家放下红石相关方块的时候,游戏不会立即将其变成红石原件,而是把目标位置放入等待添加列表中。同上,当玩家移除红石相关方块的时候,游戏也不会立即将红石原件移除,而是把目标位置放入等待移除列表中
处理
游戏在运行到第18项也就是更新红石系统依赖这一项的时候,会集中处理这三个列表(还有个暂时没说的等待更新列表):
问题
初看这些东西都没啥问题,很合理的算法。但是怪就怪在上面的原件信号源列表以及其它一些会频繁随机增删查改的列表的内部数据结构是vector.在vector上进行随机增删会产生不小的开销。这也直接导致了某些表面上平平无奇的红石电路实际上奇卡无比。