昨天看了篇文章,讲到了AI的LOD,以前只知道模型渲染有LOD,为了在不同的视域情况下精简某些部分的渲染部分,因此在渲染中有LOD(Level Of Detail)技术,离的越远模型面数越少,离得近面数会减少。但是听到AI的LOD,还是比较新鲜,现在把我对AI的LOD的理解总结一下。
对于游戏的AI计算,其实很多情况也是计算量很大的计算,与图形渲染不同,AI的计算基本消耗的是CPU,例如 模拟一个很大世界里面有很多做各种行为的NPC时,如果想保持逻辑的准确,就要每一刻对这些NPC的行为都做一遍计算,这显然是个很耗的工作,这时模拟的准确程度和计算量就是个矛盾关系,当然当前游戏中怎样做的我还不清楚(可能当下流行的MMORPG都不会为NPC做复杂的行为,就是在那做个动作等等,或是开个副本放少量NPC)。
AI的AOD基于这样一个理念:对于玩家察觉到的地方,AI做较准确的模拟,玩家察觉不到的地方,做模糊模拟,按照某个划分将AI的模拟准确度分为几个层次,不同层次的细度是不一样的,玩家处于某个层时,只要保持那个层总的逻辑模拟准确就行了。比如一个世界,有一个村庄中,有工人的工地,有酒吧,酒吧里有工人在喝酒,工人喝酒有不同的喝酒动作。这里有就很多层,在最外层,当玩家在村庄之外的时候,只知道世界上有这个村庄就行了,并且按时间计算下酒吧剩余酒量,不用做别的,在最里层你就需要对工人的整个喝酒动作做模拟并表现。
下图表现的是在不同位置玩家的AI LOD所需要关注的NPC行为和程序逻辑。比如在村外,你不需要真的表现酒吧内人物的动作(这通常渲染也会剪切),也不需要计算某个NPC喝了多少酒,你只要估计一下整个酒吧内有多少人剩多少酒就行了。
AI的AOD如何转化成程序中可表示的逻辑呢,这是一个比较复杂的事情,这要基于AI的事件机制。AI的模拟通常表示为一个时间轴上的事件发生。事件分为瞬时发生,也分为一段时间发生(这就需要一个开始和起点)。事件又可以不段的包含子事件。AI的LOD转换就是把事件抽象成不同的层级(细节提高时,事件就要模拟它的每个子事件,细节减少时,子事件就忽略了,只要模拟上一层的事件,每个事件要维护它的子事件的指针)
如图这是不同LOD层次上时间轴的事件发生情况,可以看到最上层的LOD发生处理的事件最少,而越下层要计算的就越多。
虽然这个图看起来简明,但是具体实施上主要还要考虑到在不同LOD层次间迁移时的问题(逻辑的保持、状态的切换..)
总的来说,AI的lod提供了一个很好的理念,lod不是图像渲染的专利,任何大计算量的结构都可以应用LOD的思想,就是根据所处不同的域对域的不同部分做不同复杂度的计算,而不必全盘做最精密的计算,这可能为我们解决其他一些大计算量的东西提供一个解决思路。