Games104现代游戏引擎笔记高级ai

Hierarchical Task Network 层次任务网络

在这里插入图片描述
在这里插入图片描述
World State是一个主观的对世界的认知,并不是一个真实世界的描述
Sensors负责从游戏环境中抓取各种状态
在这里插入图片描述
HTN Domain 存放层次化的树状结构Task和之间的关联关系1
Planner 根据World State从 Domain 里规划 task
Plan Runner 根据 Planner 设定的计划执行 Task,当 Task 执行过程中发生了很多其他问题,Plan Runner 会监控所有的状态并且告知Planner规划另一系列Task (Re-plan)
在这里插入图片描述
primitive:单个动作
compound:复合任务
在这里插入图片描述
在这里插入图片描述
preconditions:检测world state中哪些state条件符合,才会执行,否则返回false,
检查task执行中间是否失败 (对世界的读操作)
effects:task执行完后修改world state (对世界的写操作)
在这里插入图片描述
在这里插入图片描述
task由一堆Method构成,每个method都有一组属于自己的Precondition, Method自上而下就是优先级 Priority,类似于BT selector功能,
每个method都要执行一系列task、,全部完成,类似于BT selector的Sequence。
在这里插入图片描述
在这里插入图片描述
HTN Domain需要定义一个Root Stask作为根节点,也就是核心节点
在这里插入图片描述
在这里插入图片描述
根据 World State, 从Root Task开始选择当前目标的task,依次展开
在这里插入图片描述
Plan展开的过程是非常的快的,但是因为每一个Primitive Task 都是有个对于world state修改的Effect,但是并不会真的修改到World State 上,然而这可能会影响到后面的task。 所以这里的方法是将World State复制一下,然后对于这个拷贝进行修改和推演,自Planning一步步展开
相当于对于World State进行一个预演并且假设所有的Task都会成功。
Replaning就是处理如果Task不成功的情况在这里插入图片描述
计划中如果发生Precondition不符合,只能返回False,并且一路返回直到Root Task
在这里插入图片描述
在这里插入图片描述
最后相当于搜索完domain并输出一串Primitive Task
在这里插入图片描述

<think>嗯,用户遇到了C++编译器静态断言失败的错误,具体是Serializer::read<T>未实现的问题,而且提到了Piccolo引擎。我需要根据提供的引用信息来帮助解决这个问题。首先,看看用户提供的引用内容,特别是引用[1]和[2],里面提到使用nlohmann::json库的adl_serializer来处理第三方类型的序列化和反序列化。这可能与当前的问题相关,因为静态断言失败通常是因为缺少特定类型的序列化或反序列化方法。 用户的问题提示Serializer::read<T>的静态断言失败,说明在尝试序列化或反序列化某个类型T时,编译器找不到对应的实现。这可能是因为用户的自定义类型没有为Serializer提供适当的read方法。根据引用[1]中的方法,需要为自定义类型实现特定的序列化函数,比如to_json和from_json,或者通过ADL(参数依赖查找)来让库找到这些函数。 在引用[4]中提到,JSON的值可以是任意类型,对应C++中的map<string, variant>,但用户可能在使用自定义类型时没有正确配置序列化器。因此,解决方案可能类似于引用[2]中的示例,为类型T实现序列化和反序列化的函数,并通过adl_serializer来适配。 另外,用户提到了Piccolo引擎,可能需要检查该引擎的序列化框架是否要求特定的接口或宏定义。如果Piccolo引擎使用的是类似的模式,可能需要显式地为类型T特化序列化器,或者注册类型到序列化系统中。 可能的解决步骤包括:确认类型T是否缺少序列化方法,为类型T实现read和write函数,使用ADL或特化模板,并确保这些函数在正确的作用域内可见。同时,检查是否有遗漏的命名空间或头文件包含,导致编译器无法找到对应的实现。此外,参考错误信息中的静态断言消息,可能需要查看Serializer::read<T>的具体要求,比如是否需要特定的模板特化或静态成员函数。 总结来说,用户需要为其自定义类型提供Serializer::read<T>和Serializer::write<T>的实现,或者通过类似nlohmann::json的adl_serializer机制来适配第三方类型,从而解决静态断言失败的问题。</think>要解决C++中`Serializer::read<T>`静态断言失败的错误,需根据序列化框架要求实现特定类型的序列化逻辑。以下是分步解决方案: ### 1. 理解错误原因 编译器提示`static_assert failed`,说明当前类型`T`未实现序列化框架所需的`Serializer::read<T>`方法。例如在Piccolo引擎中,序列化器要求对自定义类型实现以下接口: ```cpp template <> struct Serializer<YourType> { static YourType read(DataStream& ds); static void write(DataStream& ds, const YourType& value); }; ``` ### 2. 实现序列化方法 参考nlohmann/json的ADL序列化模式[^1],为自定义类型实现读写方法: ```cpp // 头文件中声明 namespace YourNamespace { struct CustomType { int id; std::string data; }; // 序列化实现 void to_json(nlohmann::json& j, const CustomType& t) { j = {{"id", t.id}, {"data", t.data}}; } // 反序列化实现 void from_json(const nlohmann::json& j, CustomType& t) { j.at("id").get_to(t.id); j.at("data").get_to(t.data); } } ``` ### 3. 注册类型特化 若框架要求显式模板特化(如Piccolo引擎): ```cpp template <> struct Serializer<YourNamespace::CustomType> { static YourNamespace::CustomType read(DataStream& ds) { int id = ds.read<int>(); std::string data = ds.read<std::string>(); return {id, data}; } static void write(DataStream& ds, const YourNamespace::CustomType& t) { ds.write(t.id); ds.write(t.data); } }; ``` ### 4. 检查类型可见性 确保类型和序列化方法在正确的作用域: - 序列化函数应放在与自定义类型相同的命名空间 - 头文件需要包含序列化函数的声明 - 使用`friend`声明处理私有成员访问: ```cpp struct PrivateType { private: int secret; friend void to_json(nlohmann::json& j, const PrivateType& t); }; void to_json(nlohmann::json& j, const PrivateType& t) { j = {{"secret", t.secret}}; // 可访问私有成员 } ``` ### 5. 验证实现 通过单元测试验证序列化结果: ```cpp TEST(Serialization, CustomType) { CustomType original{42, "test"}; DataStream ds; Serializer<CustomType>::write(ds, original); CustomType restored = Serializer<CustomType>::read(ds); ASSERT_EQ(original.id, restored.id); ASSERT_EQ(original.data, restored.data); } ``` ### 常见问题排查 1. **未实现特定方法**:确认是否遗漏`read`/`write`中的一个 2. **模板特化位置错误**:特化必须放在全局或类型所在命名空间 3. **类型不匹配**:检查`DataStream`的读写方法是否支持成员字段的类型 4. **版本兼容性**:序列化格式变更时需处理版本标记
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值