【游戏精粹】AI系统(一):优化策略

优化策略

        策略1:使用事件驱动行为而非轮询
            最理想的情况是自主体应不断地监控其所处的环境,并做出相应的反应。这种方法的问题在于,它将导致大量重复计算。替换方法是尽可能采用事件驱动技术。如棒球游戏,当棒球被击打时,棒球只需告诉接球手,自己被击打即可。
        策略2:减少重复计算
            通过在多个AI主体之间共享结果以减少重复计算。很多时候,虽然本可以只计算一次并共享计算结果,但主体将重复计算相同的信息。这种优化很容易,通常可以节省大量的时间。
        策略3:由管理员集中进行协调
            对于多个主体之间的协作,可由一个管理员实体来做出复杂决策,从而使协作更简单、更快速。这种复杂的决策通常是确定每个成员的任务,而主体将完成相应的任务。
        策略4:不那么频繁的运行AI
            AI主体很少需要在每帧都运行其整个决策函数。因为真正的生物都有一定的反应时间,这样变提供了一种简捷的削减AI处理途径。
            这种策略的问题之一是可能存在AI处理高峰。最简单的解决方案是随机化每个主体处理出口。每次AI回调后,随机选择新的延迟。这种随机执行窗口实际上确保了主体之间不会同步,从而导致处理高峰产生。
        策略5:将处理工作分散到多帧中完成
            任何所需时间不确定的算法(将占用大量的CPU时间),都可将其工作分散到多帧完成。通过保存每帧计算得到的结果,并在下一帧恢复,直到完成工作。
            本策略可作为一个特例在一个模块(如寻径模块)中实现。
        策略6:利用细节级AI
            细节级(level-of-detail,LOD)概念是一种精巧的优化,被大量用于图形领域之外。其思想是:当物体远离摄像机时,使用一个包含较少多边形的模型;而当物体较近时,使用一个包含较多多边形模型。简而言之:远处的对象不渲染或者“粗”渲染,较近的对象进行“细”渲染。这样,显示速度将极大地提高,而对游戏视觉效果几乎没任何影响。
            用于AI的细节级技术:
                1.根据主体离摄像机、玩家或现场的距离,改变处理频率;
                2.根据相关程度,改变主体算法的复杂度,方法是如果主体远离画面,则不进行精准的寻径;
                3.当主体对玩家的重要性降低时,在单个模拟算法中显示多个主体。其极端的例子是:使用简单的公式来模拟远处争斗的结果,而对于离玩家较近的战斗,则对每个士兵和每颗子弹都进行模拟。
            细节级旨在在玩家不会察觉的情况下减少计算量。如果玩家将发现有问题或差别,则说明优化过头了。
        策略7:只解决问题的一部分
            对于大型问题,有时只需解决急需的部分就足够了,可在以后需要时再计算解决方案的其余部分。甚至可能出现这种情况:情形出现很大变化,问题的余下部分已经无关紧要,不再需要计算。这种策略非常类似迟缓计算。
            例如A*寻路的层次式寻径(分级路径):计算角色到达目的地的高级路径(从房间到房间),然后进入新房间后计算到下一个房间的微路径。如果由于某种原因,角色改道或者死亡,则丢弃余下的路径。这种按需寻径可以极大地提高速度。
        策略8:离线完成困难的工作
            有时,问题非常困难,没有解决它所需的CPU时间。则可以在开发阶段预先计算好结果,并通过一个包含索引的查找表来获得所需的值。这是最强大的优化策略之一,因为它能够将几千小时的计算结果存储为几KB的数据。
        策略9:使用突发行为以避免编写脚本
            该策略与前一个策略相反。如果没有足够的时间来为出现在场景数以百计的背景AI实体创建行为或脚本,对此解决方案是指定简单的规则,以实现智能、突发的行为。可参考本栏目的【游戏精粹】模拟群体行为:Flocking算法。
            但是,该策略在减少离线工作量时,可能导致意外结果(模拟群体不完善导致)。它最适合用于非关键AI实体,这些实体并非游戏发展或完成的关键。
        策略10:通过连续记录来分摊查询成本
            有时需要收集大量的数据,以做出智能的决策。如果需要数据时才进行收集,则用于计算的时间可能是不可接受的。对此,解决方案是不断地更新数据结构中的数据。虽然跟踪数据所需的时间和内存更多,但这被分摊到很多帧中。这样,对数据的简单查询将不会影响帧频。
        策略11:重新考虑问题
            重新考虑问题以将代码的速度提高多个数量级。优化代码的某部分常常会获得意外的收货。真正的优化方法是,从稍微不同的角度,以其他方法或算法来解决问题。
            在“【游戏精粹】模糊逻辑”一文的“避免模糊系统的组合激增”一节中解释了这种策略。在那节中,介绍了Combs的替代算法,这种算法巧妙地避免了传统模糊系统的指数特征。虽然得到的结果不相同,但具有可比性,对大多数用途而言足够了。
            从不同的角度重新考虑问题,可能是任何人都能够提供的优化建议。它是其他优化的根源所在。只有重新定义或抽象问题、进行类比或改变自身的角度,才能完成真正优化代码的一跃。
    


学习资源

    • 《游戏编程精粹2》第三章第一节
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值