— AI分享站

Archive
Tag "双缓冲"

记得在以前的一篇文章中谈到了一种类似于双缓冲的AI结构,最近在整理一些东西的时候,发现这样的AI结构具有一定的通用性,而且层与层之间耦合度相对较低,作为一种层次化的AI架构,非常值得一谈。

在我的脑海中,AI一般分为两个部分,一个是决策(Decision)部分,一个是行为(Behavior)部分,决策部分负责做什么,行为部分负责怎么做。在一些国外的公司里,AI程序员也大致分为这两种(不过,一些国内的企业可能就分的没有这么细,一般都是统称为AI程序员,或者有的分的更粗,将一些游戏中的其他游戏逻辑部分一起涵盖,统称为游戏性(Gameplay,GPP)程序员)。正因为这样,所以我们一般希望,在AI架构上,这两个部分的耦合度是相对较低的,这样也便于任务的分工。所谓层次化的AI架构(Layered AI Architeture)也就基于了这样的理念。看下面这个图:

layered-ai-architecture-1

在这样一个层次化的AI框图中,我们定义了“请求(Request)”这样一个概念,请求可以看作是AI决策的结果,或者称之为一个命令,比如,在射击游戏中,请求可能就定义为,射击,移动,逃跑等等,在动作游戏中,请求就会定义成攻击,格挡,跳跃等等。当行为层收到上层的请求后,就会设法去处理该请求的内容,还是以射击游戏为例,当行为层收到射击的指令,就会从射击的动画列表中选择某个射击动画,然后转向目标,播放动画等等工作来处理射击的请求。所以请求相当于就成了决策层和行为层之间的接口。这样,对于决策层和行为层的输入和输出就很明确了:

  • 决策层:输入(游戏世界信息),输出(请求)
  • 行为层:输入(请求),输出(修改游戏世界的相关信息)

layered-ai-architecture-2

由于有请求层作为中间接口层,所以决策和行为部分就很自然的分开了,而且有清晰的输入和输出,AI团队中的人员的工作职责也就很明确了,做为决策层的AI程序员,就只需要关心如何产生请求,而行为层的AI程序员,只需要关心如何处理请求,一旦定义好完备的请求内容,不管在代码还是在工作上都不会产生很大的粘连度了。

另外值得注意的是,这边的请求层用到了类似双缓冲的结构,分成后端和前端,换个词的话,可以说成当前在处理的请求(前端),和下一个要处理的请求(后端),具体的分析可以参考我以前的文章在AI结构中用双缓冲》,这里就不多做介绍了。

这样的层次化结构在AI中有很强的通用性,因为这是用最高的层面来总览AI的架构,而像其他诸如行为树(Behavior Tree),分层状态机(HFSM)等都可以看成是在决策或者行为层中的具体实现方式。所以不管AI代码是如何实现,大部分都可以归到这种层次化的结构中,因此,我想,我们在设计AI结构之初,就可以用这样的方式来思考和架构整个框架,分割决策和行为,定义请求,然后再针对每一层来选择具体的实现方法。

————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————

Read More

双缓冲(double buffer)是在渲染中用到的基本技术,目的是为了提高绘图速度,防止屏幕的闪动,原理可以简述如下,生成两块内存,一块作为后缓冲(background buffer),一块为前缓冲(foreground buffer),前缓冲内存的是实际显示在屏幕上的内容,后缓冲可以称为工作缓冲,所有的图形都先画在这块缓冲中,完毕后再与前缓冲做一个交换(Flip),也就是”前“变”后“,”后“变"前”。循环以上操作。

doublebuffer-1

双缓冲从原理上并没有限制一定要用在渲染中,其本质就是把工作区域和显示区域分开,如果把工作区域作为和上层代码的接口,把显示区域作为和下层代码的接口,这样双缓冲就相当于是一个连接两个层次代码的中间件。这样它就有了很大的灵活性。

AI架构中可以借鉴这样的技术,用双缓冲来解决一些问题。比如,高层AI要发一个请求,然后下层的行为要处理这个请求,如何做一个结构来符合这个要求呢?这个的解决方案很多,可能还要牵涉到很多其他问题,我这里提供一个我实践过一个solution,就用到了双缓冲技术,可以给大家做个借鉴。

我先把“请求”抽象出来,并做成两个,一个作为backgroud的请求(简称BGR),一个作为foreground的请求(FGR),有点双缓冲的样子了吧。

对高层AI来说,它发的所有请求都是修改BGR中的内容,等高层AI的Tick结束后,我们就得到了一个完整的BGR(相当于渲染中,我们画完了所有的图形)。下一步就是交换BGR和FGR,即Flip,然后下层的行为系统就把FGR中的内容作为输入,继续后续的工作。

可以看到,双缓冲结构的优点就是接口相当的清晰,可以很方便的看到每一层的输入输出是否正确(BGR为AI的输出,FGR为行为系统的输入)。很多人也许会觉得,这样的做法,可以用copy的方式来代替,比如copy一份请求给下层,我同意,但我觉得,双缓冲的方式在这里显得更为清楚,而且效率上也更高(只是index的变动而已),另外,在实际代码中,Flip的并不一定是每帧进行的,原因在于我们可能为根据一些实际情况(称之为Request Rule)来做一些对BGR做一些合法性检测,只对通过合法性检测的BGR作Flip,这里就不多说了。

好啦,就写到这里,希望双缓冲技术也可以作为大家解决问题的一种可选方案。

————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————

Read More