网站推广方案模板建设通网站是免费的吗

web/2025/10/9 13:25:09/文章来源:
网站推广方案模板,建设通网站是免费的吗,seo是干什么的,网站怎么做充值系统下载【分析】 如果行为树的节点很多#xff0c;那么会存在要经过很多节点才会走到动作节点的情况。显然#xff0c;性能上不如状态机。 每帧都需要重新遍历一系列节点才会走到动作节点#xff0c;而实际上很多条件节点在数帧内不会有变化#xff0c;这是造成性能问题的重要原…【分析】 如果行为树的节点很多那么会存在要经过很多节点才会走到动作节点的情况。显然性能上不如状态机。 每帧都需要重新遍历一系列节点才会走到动作节点而实际上很多条件节点在数帧内不会有变化这是造成性能问题的重要原因。 行为树每帧的Update其实就是在轮询这些条件为避免轮询我们自然而然的希望在一帧直接执行动作节点。 为此需要将在Running状态的动作节点缓存直接执行直到成功。 这种方式引起的问题是动作节点不一定总是会执行成功可能在某一帧某些条件改变了动作需要被打断。 为了解决该问题就需要给动作节点引入一些事件当特定事件发生时在动作节点内接收该事件直接结束动作节点的运行返回失败。 随后重新开始整个行为树的轮询找到下一个动作节点。 这就是事件和轮询混合驱动的行为树。 事件本质上就是直接调用当经过动作节点的路径较长也即影响该动作节点的条件过多时不可避免要通过代码调用发多种消息,这就失去了配置的意义。 需要将打断动作节点及节点的逻辑做成单独的Conditional节点这些节点接收消息或监听变化以决定是否打断其子节点。 通过轮询这些Conditional节点以简化发多种消息的调用。 当打断发生时需要重新运行被打断节点的父节点确定新的分支走向。为此需要将路径上所有节点做缓存。 这里要对控制节点做特殊处理控制节点会控制自身的子节点运行其状态受子节点影响当打断存在时子节点可能不需要再次运行因此控制节点在控制子节点运行前需要知道当前是否被打断。 【代码实现】 public class BehaviorTree{public string btName;public int btId;public UpdateType updateType;public DrivenType drivenType;public float updateTime;private float curTime;public GameObject owner;private Node rootNode;private ListNode allNodes new ListNode();private Dictionaryint,Node id2Node new Dictionaryint,Node();private Dictionaryint,NodeInfo id2NodeInfo new Dictionaryint,NodeInfo();private DictionaryType, Dictionarystring, Delegate eventDic new DictionaryType, Dictionarystring, Delegate();private Node curActionNode;private StackNode activeNodes new StackNode();private ListConditionalNode conditionalNodes new ListConditionalNode(); public static Funcstring, BehaviourTreeData loadFunc null;public void Init(GameObject owner, string path, Funcstring, BehaviourTreeData loadFunc){this.owner owner;//这里省略部分边界情况检查的逻辑if (!string.IsNullOrEmpty(path)){var data loadFunc?.Invoke(path);btId owner.GetInstanceID();updateType data.updateType; updateTime data.updateTime;drivenType data.drivenType;//通常初始化有两种写法一种是在管理者中完成管理者自身以及被管理者的数据初始化另一种是管理者完成自身的初始化后将被数据传递给被管理者被管理者自身完成初始化//第二种方式更加灵活可变且不需要关注行为树结构是怎么样的只需每个节点做好自身的初始化//在第二种方式下涉及如何将数据递归传递的问题为统一获取将数据记录在管理者上被管理者根据Id从管理者中获取初始化后可选择将数据释放foreach (var item in data.nodes){id2NodeInfo[item.nodeId] item;}var rootData data.nodes[0];//默认第一个是rootNode数据rootNode new RootNode();rootNode.Init(rootData, this);id2NodeInfo.Clear();//也可以保留}}public void Update(float time){if(drivenType DrivenType.Polling){PollingUpdate(time);}else if(drivenType DrivenType.PollingAndEvent){if (curActionNode ! null){var actionStatus curActionNode.Update();if(actionStatus ! NodeStatus.Running){curActionNode null; PollingUpdate(time);}else{if (updateType UpdateType.FixedTime){curTime time;}}}else{PollingUpdate(time);}}else if(drivenType DrivenType.EventDriven){EventUpdate(time);}}private void PollingUpdate(float time){if (updateType UpdateType.EveryFrame){Update();}else if (updateType UpdateType.FixedTime){curTime time;if (curTime updateTime){curTime 0;Update();}}}private void EventUpdate(float time){int index -1;for (int i 0; i conditionalNodes.Count; i){if (conditionalNodes[i].ConditionChanged()) //当条件节点条件改变其后所有节点都需要重新计算,动作节点需要被打断{index i;break;}}if (index ! -1){ while(activeNodes.Count 0 activeNodes.Peek().nodeId ! conditionalNodes[index].nodeId)//移除其后所有Active节点{PopNode(activeNodes.Peek());}conditionalNodes[index].Update();//重新运行该节点if (conditionalNodes[index].StatusChanged(out var curStatus)){ var curNode (Node)conditionalNodes[index];var parent conditionalNodes[index].parent;while (parent is ControlNode)//如果父节点是控制节点其状态会与子节点相关,这里简化处理直接重新运行{curNode parent;parent parent.parent;}if(curNode ! conditionalNodes[index]){while (activeNodes.Count 0 activeNodes.Peek().nodeId ! curNode.nodeId){PopNode(activeNodes.Peek());}curNode.Update();}}}else{var state activeNodes.Peek().Update();//没有打断再次运行末尾的动作节点if(state ! NodeStatus.Running)//运行结束重新从根节点开始运行也可以选择回退到上一个节点开始运行{activeNodes.Clear();conditionalNodes.Clear();rootNode.Update();}}}public void PushNode(Node node){if (drivenType ! DrivenType.EventDriven)return;activeNodes.Push(node);if(node is ConditionalNode conditionalNode){conditionalNodes.Add(conditionalNode);}}private void PopNode(Node node){if (drivenType ! DrivenType.EventDriven)return;node.End();activeNodes.Pop();if(node is ConditionalNode conditionalNode){conditionalNodes.Remove(conditionalNode);}}public NodeStatus Update(){var status rootNode.Update();if(status ! NodeStatus.Running){rootNode.End();}return status;}public void Destroy(){foreach (var item in allNodes){item.Destroy();}allNodes.Clear();id2Node.Clear();id2NodeInfo.Clear();}public NodeInfo GetNodeInfo(int nodeId){return id2NodeInfo[nodeId];}public void AddNode(Node node){allNodes.Add(node);id2Node[node.nodeId] node;}public void SetActionNode(Node node){curActionNode node;}private void RegisterEvent(string eventName, Delegate handler){if (drivenType DrivenType.Polling)return;if (!eventDic.TryGetValue(handler.GetType(), out var dic)){dic new Dictionarystring, Delegate();eventDic[handler.GetType()] dic;}if (!dic.TryGetValue(eventName, out var value)){dic[eventName] handler;}else{dic[eventName] Delegate.Combine(value, handler);}}public void RegisterEvent(string eventNmae,Action action){RegisterEvent(eventNmae, (Delegate)action);}public void RegisterEventT(string eventNmae, ActionT action){RegisterEvent(eventNmae, (Delegate)action);}public void RegisterEventT1,T2(string eventNmae, ActionT1,T2 action){RegisterEvent(eventNmae, (Delegate)action);}public void RegisterEventT1, T2,T3(string eventNmae, ActionT1, T2,T3 action){RegisterEvent(eventNmae, (Delegate)action);}private Delegate GetDelegate(string eventName,Type type){if (drivenType DrivenType.Polling)return null;if (eventDic.TryGetValue(type, out var dic)){if (dic.TryGetValue(eventName, out var handler)){return handler;}}return null;}public void SendEvent(string eventName){ if(GetDelegate(eventName, typeof(Action)) is Action action){action();}}public void SendEventT(string eventName, T t){if (GetDelegate(eventName, typeof(ActionT)) is ActionT action){action(t);}}public void SendEventT1,T2(string eventName, T1 t1,T2 t2){if (GetDelegate(eventName, typeof(ActionT1,T2)) is ActionT1,T2 action){action(t1,t2);}}public void SendEventT1, T2,T3(string eventName, T1 t1, T2 t2,T3 t3){if (GetDelegate(eventName, typeof(ActionT1, T2,T3)) is ActionT1, T2,T3 action){action(t1, t2,t3);}}}public enum DrivenType{Polling,PollingAndEvent,EventDriven} public class Node{public string nodeName;public int nodeId;public NodeStatus status;public BehaviorTree owner;public Node parent;public void Init(NodeInfo nodeInfo, BehaviorTree owner){this.owner owner;this.nodeName nodeInfo.nodeName;this.nodeId nodeInfo.nodeId;OnInit(nodeInfo);owner.AddNode(this);//对于字段的配置可以通过字段名反射获取字段然后设置值但这里允许的值是有限的我们直接在每个节点写对应的处理}public NodeStatus Update(){owner.PushNode(this);return OnUpdate();}public void End()//方法名字叫Exit也是一样的{OnEnd();}protected virtual void OnInit(NodeInfo nodeInfo){}protected virtual NodeStatus OnUpdate(){return NodeStatus.Success;}protected virtual void OnEnd(){}public virtual void Destroy(){}}public class ConditionalNode:Node{public Node subNode;protected override void OnInit(NodeInfo nodeInfo){if (nodeInfo.subNodes.Count 0){var subNodeInfo owner.GetNodeInfo(nodeInfo.subNodes[0]);Type type Type.GetType(subNodeInfo.nodeType);subNode (Node)Activator.CreateInstance(type);subNode.Init(subNodeInfo, owner);subNode.parent this;}}protected override NodeStatus OnUpdate(){return subNode.Update();}public virtual bool ConditionChanged(){return false;}public virtual bool StatusChanged(out NodeStatus status){status NodeStatus.Success;return false;}public class ActionNode:Node{private bool start;private bool stop;protected override NodeStatus OnUpdate(){if (!start){Start();start true;}var res base.OnUpdate();if(stop){res NodeStatus.Failure;}if (res NodeStatus.Running){owner.SetActionNode(this);}return res;}private void Start(){OnStart();}protected virtual void OnStart(){//各动作节点自定义注册事件}protected override void OnEnd(){start false;stop false;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/89653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

临沂市兰山区建设局网站做的好的茶叶网站

文章目录 1.简介2.组成参考文献 1.简介 MySQL Cluster 是官方推出的基于 NDB(Network DataBase)存储引擎的高可用和可伸缩的分布式数据库系统。 以下是 MySQL NDB Cluster 的主要特点和能力: 高可用:MySQL Cluster 具有内置的高…

多语言网站系统轻创网

前言: 本人一度被Python的虚拟环境的配置所困扰,前段时间抽空学习了一下,现在总结一下方法,供大家参考。 先使用winr打开命令行窗口。 展示所有虚拟环境 conda env list 创建虚拟环境 例如我们创建一个叫做py_sk的虚拟环境 …

龙岩网站报价抖音代运营需要什么

1.Dubbo是什么? Dubbo 是一个分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成。 RPC 指的是远程调用协议,也就是说两个服务器交互数据。 2.Dubbo的由来&…

led网站制作seo比较好的优化

可见性得以保障,并不意味着是的,所以可以说您正在编写一个Spring MVC应用程序,然后您决定:“我想做一些单独的封装算法,这些算法可以互换来执行特定的行为”。 对此的经典回应是“您需要一个战略模式男孩!”。 所以&a…

高端网站开发哪家专业做网站需要懂程序吗

0x00 前言 之前对于app反编译的smali汇编语言都是静态分析为主,加上一点ida6.6的动态调试,但是ida的调试smali真的像鸡肋一样,各种不爽,遇到混淆过的java代码就欲哭无泪了。后来知道IDEA用一款插件也可以实现smali的动态调试&a…

涂料网站模版网站平台推广有哪些

目录 实验内容(任务) PCB项目文件及原理图文件的创建及保存: 熟悉窗口界面、主菜单、各工具栏及图纸参数的设置: 首先先通过"纸张选择"做如下修改 修改纸张大小👇 修改标题栏的格式👇 修改…

万网做网站上海家装公司十大排名

一、修改文件/终端的属性1、修改文件创建时间如果蓝队是按照文件修改时间来判断后门的话,比如现在我们上传一个shell,可以看到shell文件与原文件的时间是不同的解决方法:touch -r teamserver shell.php现在再来看原文件与shell文件的修改时间…

科技 响应式网站模板下载一般通过男网友

在许多情况下,Excel记录的数据将按照发生的日期进行记录,但是根据日期记录的数据将非常分散,通常需要每月汇总相应的数据. 在这种情况下,您需要将日期转换为月份. 本文介绍了如何使用SUMPRODUCT函数按月汇总数据.公式提示在SUMPRO…

自己怎么做网站卖东西网络营销的未来发展趋势

win7 activemqML7上的HL7是可以说HL7协议格式的系统的一种非常常见的传输机制。 JBoss Fuse是一个非常强大的微服务样式集成平台,在为关键医疗保健提供者构建灵活,有弹性,高可用性的集成方案方面拥有良好的经验。 此外,在JCAPS上替…

开发app的网站有哪些网站开发毕业设计收获与体会

传送门 文章目录题意:思路:题意: 思路: 转换一下题意,就是求一个最小公共前后缀,显然可以暴跳nenene数组,复杂度O(n2)O(n^2)O(n2),注意到我们每次都跳的话会跳到很多重复的位置&…

如何手机做网站仿站小工具 wordpress

Sharding-JDBC是当当网开源的适用于微服务的分布式数据访问基础类库,完整的实现了分库分表,读写分离和分布式主键功能,并初步实现了柔性事务。Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。其适用于任何基于…

外综服网站开发青岛网页设计公司哪个最好

即使是对于非常简单的系统来说,也不可能在单一的模型中描述整个架构的要素和细节。如果你试图那么做,最终就会得到“弗兰克斯坦怪物”一样的模型,而且根本无法管理,也无法向任意一位利益相关者展示系统。 管理这种复杂情况的最佳方…

做电影网站视频放在那里济南做网站维护的公司

要在 CentOS 上将系统时间设置为本地时间,可以按照以下步骤进行操作: 1.首先,你需要确定你想要设置的本地时间。例如,如果你想要将系统时间设置为当前时间(假设是北京时间),则可以使用以下命令获…

网站文件怎么做下载手机app安装

阿里妹导读:如何治理测试稳定性问题?很多人会说:环境、流程管控、监控、工具化、加机器、专人负责、等等。这些都是对的。不过这些都是解决方案层面的,而不是方法论和理论体系层面的。今天,阿里研究员郑子颖来说说测试…

大型网站 建设意义山东住房和建设庭官网站官

一、名词解释 Device ID:设备ID。 IMEI:(International Mobile Equipment Identity)国际移动设备标识的缩写。是由15位数字组成的“电子串号”,它与每台手机一一对应,每个IMEI在世界上都是唯一的。 MEID…

网站建设 常见问题阿里云服务器使用教程

实验拓扑 实验要求 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8,分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9,多出口环境基于带宽比例进行选路…

扁平化设计网站建设织梦建站模板

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

在哪里建网站好河北明迈特的网站在哪里做的

1.展开可迭代对象(简单理解为数组和伪数组),如数组、 NodeList 、arguments。 可以通过展开运算符把一个伪数组转换为数组 const a [...document.body.children]; console.log(a); console.log(Array.isArray(a));2.实现数组的浅拷贝 cons…

做网站的图片=gifwordpress 调试php代码

官方文档 使用 Git 进行代码 - Azure DevOps | Microsoft Learn 用ssh远程连接服务器debug 在插件中搜索SSH ,具体步骤可以参考以下步骤 https://cloud.tencent.com/developer/article/1840922

简述在线推广网站的方法中国工厂网站

https://blog.csdn.net/qinxiandiqi/article/details/39155593转载于:https://www.cnblogs.com/Baronboy/p/9206164.html