在游戏中,NavData 是通过使用一个或多个数据库在运行时管理的。数据库是负责为共享相同物理维度和移动模型的角色维护相关 NavData 集的对象。
如果您已学完了本文档中的集成教程(请参见将 Navigation 集成到游戏引擎),应熟悉数据库在运行时加载和卸载 NavData 的基本用法。此页面以及此部分中的其他主题提供了一些其他详细信息和注意事项。
创建世界时,必须指定世界应创建和维护的数据库数量。请参见集成阶段 1c:设置世界。
每个数据库只能加载使用同一组配置参数创建的 NavData。如果角色的物理维度或移动功能有很大差异以至于它们不能共享相同的 NavData,则您将需要为世界设置多个数据库。详细信息请参见使用多个数据库。
为了将地形或地形中某个地块的 NavData 添加到数据库中,首先必须创建一个 NavData 对象,通过从文件或内存缓冲区读取数据以使用这些数据设置 NavData,然后使用管理 NavData 的数据库对其进行初始化。
有关说明如何从文件加载的代码示例,请参见集成阶段 3:加载和卸载 NavData。
有关说明如何从内存缓冲区加载的代码示例,请参见集成阶段 6a:将 NavData 集成到资源管线。
如果要将 NavData 添加到数据库中以使其可用于寻径、路径跟随和查询系统,或者当游戏中不再需要 NavData 时将其从数据库中移除,您可以选择两种方法:即时或异步。
这是添加和移除 NavData 的最简单的方法。使用以下 NavData 类方法:
通过此方法,将立即启动数据库的完全更新,并阻止调用线程,直到更新完成。在更新期间,新数据将完全缝合到现有 NavData 中或完全与其余 NavData 脱离。
在确保人物和查询可用的数据始终与最近一次添加或移除保持同步方面,此方法具有明显的优势。但是,由于此方法会致使在当前帧期间完成整个更新,因此在实际产品中使用大型数据集时可能会引起 CPU 峰值。此外,该方法还需要您注意多线程;如果您在另一个线程中执行查询,修改这些查询所依赖的数据可能会导致意外结果,甚至会出现崩溃。因此,即时方法主要适用于初始集成和生成原型阶段,并期望您最终会采用异步方法来添加和移除数据。
使用此方法时,将注册添加或移除 NavData 的请求,并在更新世界期间在后续帧中处理这些请求。
数据库可应对所有涉及跟踪数据添加和移除过程的复杂性。但是,跟踪请求状态非常有用,有助于您了解人物和查询是否正在使用数据库中 NavData 集的最新更改。每个 NavData 对象都具有自己的状态值,该值可通过 NavData::m_databaseStatus(表示该 NavData 在其指定数据库内的当前状态)进行访问。