<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>优化 &#8211; behaviac</title>
	<atom:link href="/language/zh/tag/%E4%BC%98%E5%8C%96/feed/" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>Tencent behaviac, Game AI, Behavior Tree, Finite State Machine, Hierarchical Task Network, BT FSM HTN, 腾讯开源, 游戏AI, 行为树,有限状态机,分层任务网络</description>
	<lastBuildDate>Thu, 23 Feb 2017 08:05:20 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.4.1</generator>
	<item>
		<title>关于性能优化的说明</title>
		<link>/opt_practice/</link>
					<comments>/opt_practice/#comments</comments>
		
		<dc:creator><![CDATA[jonygli]]></dc:creator>
		<pubDate>Thu, 23 Jun 2016 03:25:55 +0000</pubDate>
				<category><![CDATA[文章]]></category>
		<category><![CDATA[优化]]></category>
		<guid isPermaLink="false">/?p=717</guid>

					<description><![CDATA[概述 behaviac作为图形化的脚本，设计上是用来调用代码（c++，c#）提供的方法，在调用这些方法的时候会有些额外消耗，该消耗已经被充分优化，可以参考消耗。<a class="moretag" href="/opt_practice/">Read More...</a>]]></description>
										<content:encoded><![CDATA[<h2><span class="ez-toc-section" id="i">概述</span></h2>
<p>behaviac作为图形化的脚本，设计上是用来调用代码（c++，c#）提供的方法，在调用这些方法的时候会有些额外消耗，该消耗已经被充分优化，可以参考<a href="/language/zh/tutorial10_performence/">消耗</a>。</p>
<p>实践中，要尽量把需要计算的操作由代码实现，通过方法提供给behaviac，behaviac只是去<strong>选择</strong>这些方法，behaviac作为<strong>选择者</strong>，发挥behaviac灵活直观的优势。</p>
<h2><span class="ez-toc-section" id="i-2">设计</span></h2>
<p>要想高效的使用behaviac，首先要有好的设计，需要什么Agent，Agent需要有什么属性，什么方法，有一个好的接口。所谓好，是指不能太底层，也不能太高层。</p>
<ul>
<li>太底层，意味着需要进行很多小的计算</li>
<li>太高层，意外着失去了灵活性</li>
</ul>
<p>底层的计算要尽量在代码（c++或c#）实现。behaviac用来做策略选择。</p>
<p>behaviac虽然提供了Assignment，Compute，Compare，IfElse等节点，允许做一些“小的”计算，允许就像写代码一样进行if else的基本选择，但不鼓励这样做。鼓励使用Selector，Sequence，前置，后置等节点及附件。</p>
<h2><span class="ez-toc-section" id="i-3">持续运行的动作</span></h2>
<p>Agent提供的方法，最好是能够持续运行的方法，比如，播放动画，移动一段距离，都是持续很多帧的动作；而不是只是返回某个值，然后再需要在行为树里根据该值做比较，进行计算，再执行其他小的一帧触发的方法。</p>
<p>持续运行的节点在下一帧会被持续继续执行，behaviac不会愚蠢的每一帧都从根节点重新执行。但是，不好的行为树（只是简单的成功或失败，没有返回运行的节点）就会迫使behaviac每一帧都不得不从根节点重新选择。可以参考行为树的<a href="/language/zh/concepts/">基本概念及进阶</a>。</p>
<p>持续运行的动作往往需要大量计算，由代码（c++或c#）实现，behaviac只是在高层去选择使用它，避免大量的计算。这样子，利用behaviac的灵活直观的优势而不会有性能的损失。</p>
<h2><span class="ez-toc-section" id="i-4">并行及选择检测节点</span></h2>
<p><a href="/language/zh/selectormonitor/">选择监测节点</a>以及<a href="/language/zh/parallel/">并行</a>节点用起来很方便，但是需要提醒的是，相比其他节点，这两个节点比较费。</p>
<p><a href="/language/zh/parallel/">并行</a>节点每次更新都会更新它所有的子节点（子树），<a href="/language/zh/selectormonitor/">选择监测节点</a>也是如此。不仅如此，这两个节点还会导致接管所在树对处于运行状态节点的控制，形成多一级的控制。（不理解没关系，总之，比其他节点更费。）</p>
<p>不是说这两个节点不能用，但是使用起来请注意其性能，特别的不能滥用，最好不要嵌套这两个节点。</p>
<h2><span class="ez-toc-section" id="i-5">发布版</span></h2>
<p>当发布版本或测量性能的时候，可以定义宏BEHAVIAC_RELEASE关闭开发功能，这样子性能是最优的。或者可以保留开发功能但使用<a href="/language/zh/config/">功能开关</a>有选择的关闭或打开开发功能。</p>
<p>关于BEHAVIAC_RELEASE可以参考<a href="/language/zh/tutorial10_performence/">优化及性能</a></p>
]]></content:encoded>
					
					<wfw:commentRss>/opt_practice/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>优化及性能</title>
		<link>/performence/</link>
					<comments>/performence/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 13 May 2016 02:39:39 +0000</pubDate>
				<category><![CDATA[文章]]></category>
		<category><![CDATA[连调]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[编译构建]]></category>
		<category><![CDATA[运行时]]></category>
		<guid isPermaLink="false">/?p=300</guid>

					<description><![CDATA[优化及性能 宏BEHAVIAC_RELEASE定义的时候是最终版，BEHAVIAC_RELEASE没有定义的时候是为开发版。 在debug版中，BEHAVIAC<a class="moretag" href="/performence/">Read More...</a>]]></description>
										<content:encoded><![CDATA[<h2 id="section">优化及性能</h2>
<p>宏BEHAVIAC_RELEASE定义的时候是最终版，BEHAVIAC_RELEASE没有定义的时候是为开发版。</p>
<ul>
<li>在debug版中，BEHAVIAC_RELEASE缺省下没有定义的。诸如logging、socketing、热加载等开发功能是有效的。可以通过behaviac::Config::IsLogging和behaviac::Config::IsSocketing来控制是否要Log到文件或是否与编辑器的连接。</li>
<li>在release版中，BEHAVIAC_RELEASE缺省是有定义的。诸如logging、socketing、热加载等开发功能都是没有定义的。</li>
</ul>
<div class="note info">
<h5>BEHAVIAC_RELEASE缺省下是否定义的说明</h5>
</div>
<p>BEHAVIAC_RELEASE缺省下是否定义可以参考文章《<a href="/language/zh/build/">构建说明</a>》。</p>
<p>简单来说对于Cpp，当使用CMake的时候，BEHAVIAC_VERSION_MODE用来控制BEHAVIAC_RELEASE是否定义：</p>
<ol>
<li>Default：缺省模式是Debug下BEHAVIAC_RELEASE没有定义，而Release下BEHAVIAC_RELEASE有定义</li>
<li>ForceUseDev：强制不定义BEHAVIAC_RELEASE</li>
<li>ForceUseRelease：强制定义BEHAVIAC_RELEASE</li>
</ol>
<p>而当BEHAVIAC_RELEASE有定义的最终版里，logging和socketing是关闭的，也不支持连接编辑器。</p>
<p>具体可以参考文章《<a href="/language/zh/config/">开发功能开关</a>》。</p>
<p>总之，针对效率可以有下述选择：</p>
<ol>
<li>定义BEHAVIAC_RELEASE，从而不编译诸如logging、socketing、热加载等开发功能，提供最高效率，也不支持连调功能。
<ul>
<li>C++下，在_config.h中定义BEHAVIAC_RELEASE为1</li>
<li>C#下，在Assets目录下的smcs.rsp文件中，定义BEHAVIAC_RELEASE</li>
<li>如果想选择打开或关闭调试功能而不是完全的关闭，则不需要修改任何关于BEHAVIAC_RELEASE的定义，通过behaviac::Config::SetLogging和behaviac::Config::SetSocketing来控制是否打开logging和socketing。</li>
</ul>
</li>
<li>不使用xml或bson格式，而是使用C++或C#格式
<ul>
<li>C#下，还需要那些在行为树中使用到的Agent的成员都是public的（非public的成员即使通过C#代码访问也需要使用反射系统来进行，会导致GC Alloc以及性能损失）。</li>
</ul>
</li>
</ol>
<div class="note info">
<h5>overhead</h5>
</div>
<p>behaviac可以导出xml(bson)，或者源码（cpp/c#），源码的效率要优于数据（xml/bson）的执行效率。实际上这里的效率都是指的behaviac本身的overhead，如果提供的<code class="highlighter-rouge">方法</code>本身效率很低，运行很慢，behaviac本身的overhead就可以忽略不计了，无论是选用导出何种格式都遇事无补，这个时候，最需要解决的是优化方法的执行效率。</p>
<p><img src="/img/references/overhead.png" alt="overhead" /><br />
如上图，尽管xml格式是cpp格式的大约2倍，但这个overhead实际上是非常小的，只有0.0000269秒，0.0269毫秒。（具体数据会因为测试环境的不同有差异）。</p>
]]></content:encoded>
					
					<wfw:commentRss>/performence/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
