每个8x8区域就是一个64位无符号整数,使我能够进行位运算,整区域位掩码化和各种其他具有极快速度和低内存计算的低内存算术,完全替代传统的栅格式数据结构维护。
我如何利用位运算:
- 当一个区域分裂时,它仅仅断成一系列互不相连的64位整数,这些整数都覆盖着它们共享的区域。最棒的事情是,当检测到分裂子域时,我可以缓存区域的状态(这 traditionally 的时昂贵的扩散填充基于操作必须递归地漫游连接的区块的相关空间来验证是否产生分裂,因为无法连接)。(使用缓存整数状态,我可以通过进行常数时间的整数查询来进行快速Hit/Miss检查,看看是否通过相类似的模式发生了子域分裂,然后取出缓存分裂的子域,而不运行任何昂贵的代码。这缓存的记忆单元是记忆极其小的,在内存方面);
- 合并子域是通过执行两个整数之间位加法实现的。
- 维护动态的连接(邻区域能)非常迅速,通过使用行向位位移和列向位移;这些栅格式位位移可以创建有用的位掩码,从而允许在单一操作中进行多区块的查询。例如,如果我想检查一个子域是否与它包含的区域的边界/边缘接触,我只需使用一个缓存的整数进行掩码,整数中仅仅是改变了沿区域边缘的“1”位,然后看一下子域(掩码后)是否为非零。检查一个连接/可行的邻居使用区域边缘掩码后的子域反射,即刻会显示一个邻居整数如果同区域边缘有位时会立即显示。
使用此方案整个自定义导航网格的内存容量非常小(每块仅1位),一些额外的内存用于存储含有这些划分区域和存储用于在世界空间中作为参考点的区域 坐标的数据结构。此外,您还可以将整个栅式图像压入数据缓冲区并将其传递给GPU以执行并行计算。
用途方面,这个系统就是一个功能性超级动态式的低内存自定制导航网格用于栅格。这主要是为了便宜地维护和跟踪在动态地变更的地图上改变的可行栅格空间,从而降低定制复杂的寻径所需的计算要求。
评论 (0)