作者developers (戒 定 慧)
看板GameDesign
标题[程式] 行为树 behavior tree
时间Sun Aug 19 10:25:30 2012
小弟目前已在游戏产业工作二年
敝公司主要是用unity引擎来开发游戏
小弟的工作主要是写程式
为了把游戏的架构流程设计视觉化并且重复使用
我们使用一个model叫behavior tree
它其实有点类似state machine
并且有阶层的概念
因此它又叫hierarchical state machine
它最原先的目的是被用来设计AI character的行为
因此叫行为树
Halo这个游戏正是使用行为树来设计AI
这里有一个大陆人写的简介
http://blog.csdn.net/akara/article/details/6084786
目前市面上似乎有二到三个behavior tree library 的plugin
可以在unity store里面找到
我们自己当初是跟另一间小公司买他们的bt library
但他们的library并没有支援parallel node
(这个部分应该是整个bt library最难实现的部分)
不知道板上有人也在用这个概念设计AI游戏吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 50.140.5.33
1F:推 cowbaying:要平行只能加个积分制的东西 08/19 13:19
2F:→ cowbaying:要平行只能加个积分制的东西node 设定事件积分 08/19 13:20
3F:→ cowbaying:一次执行所有node 08/19 13:20
没错,那是基本的概念
我的实现方式是使每个child node都用一条独立的thread来执行
一次执行所有node 然後记录所有child node的回传状态
再根据所有状态的总合来判断是否可以往上层回传结果(SUCCESS/FAILURE)
或是再要求新的执行来执行那些回传EXECUTING的node
如果整个tree中只有一层的parallel node
那实现起来并不困难
真正困难的是当整个tree中有"多层的parallel node"
并且每个child node都有三种回传结果
SUCCESS/FAILURE: 结果确定,不须再执行
EXECUTING: 要求再执行一次
这会使得parallel node 里的critical section设计变的相当复杂
因为在最底层的某一个node的执行thread可能穿越中间多层的parallel node
到上层某一个parallel node的critical section
如何设计不同的条件来对应每条thread随机进入critical section的顺序
是最困难的部分
※ 编辑: developers 来自: 50.140.5.33 (08/19 23:43)
4F:推 littleshan:你需要的是「逻辑上的平行」而不是「时间上的平行」 08/20 14:19
5F:→ littleshan:可以考虑把 thread 改成 coroutine 08/20 14:19
6F:→ littleshan:这样就避开许多 race condition 造成的 bug 08/20 14:20
用coroutine的确是比较快的方法
而且在unity里,所有的Update function are getting called sequentially
即使我的行为树dll(用c++写成的dll当成plugin)是时间上的平行
最後指令传到unity里
全部都变sequential的东西
因为unity并不支援concurrency,也不是thread save
所以不管是用逻辑上的平行,或是时间上的平行……都没差
但我的想法是
写一个真正是时间上平行的行为树
以後可以支援那些有threading的引擎
但是也相对比较困难就是了
※ 编辑: developers 来自: 76.108.235.49 (08/23 11:23)
7F:→ cowbaying:时间上真正要平行 首先机器要能够这麽做才行吧 08/23 19:40
目前市面上多核的处理器都有支援平行处理
时间上的平行早已经是主流
当cpu的极速到达瓶颈无法再上升时
就是往横向发展
※ 编辑: developers 来自: 76.108.235.49 (08/30 10:34)
8F:→ cowbaying:那如果同时有100个事件要判断 你要几核的电脑? 08/30 12:01
9F:→ cowbaying:目前都还是以多执行绪为主 08/30 12:03
要开100条thread不是问题
thread数目的上限是受限於address space的大小
如果能够增加每条process里的address space
就能增加thread的数目
根据小弟之前实验的结果
在Windows7 intel i7 990 cpu 可用记忆体空间5G的电脑上
最多可以开到1411条thread
但小弟不知道如何修改address space 的大小
所以最多就是1411条
还请高人指点一下如何改address space
谢谢
※ 编辑: developers 来自: 98.77.182.140 (08/31 21:00)