这一套书很好,非常实用,当读到自己遇到过的问题的文章时经常有醍醐灌顶的感觉.我是有选择的看,主要是AI部分和基础编程部分.因为是扫描版的电子书,只好自己打字了.除了摘录之外也有自己的总结穿插在笔记中,难免有疏漏.就像不忍心看半年前自己写的代码一样,我也不忍心看自己过去写的文章.
1,事件驱动才应该是ai引擎采用的方法。
2,状态机的基本思想是,一个游戏对象对于它所展现的行为的每个主要部分都有一个不同的状态,目标是将一个游戏对象的行为分解为这些逻辑状态。个体行为是有状态机来建立,而所有的通信和事件通告都由消息来完成。
3,一个AI角色同时运行几个状态机是很有用的。
4,把逻辑性在代码外部对每一个相关人员来说都是一个调试的噩梦。原始的意图是极佳的,结果却是一个浪费了很多人时间的令人泄气的编程环境。逻辑应放在代码内部而数据应放在外部。
5,消息可以使用Command模式。
6,将人工智能行为写进脚步并不好,然而拥有一个脚本触发系统使得世界能够进行互动却是个好主意。其原则应该是,如果逻辑太复杂,它应该放在代码中,脚本语言需要保持简洁。数据驱动的核心思想:将逻辑和数据分开,复杂的逻辑在代码中运行,数据将控制流写在脚本中。
A*
1,A*算法选择直路径的方法是对非直选择进行处罚。要想取得平滑路径可以采用转动减幅技术,插入新的点来使看起来圆滑。需要对找到的路径进行处理。分级搜寻可以减少计算量,但是这个的距离一般较远。大规模的群体移动可以考虑找个头领或者排队请求。
2,使用方格,多边形,可见点这些不同的表示方式。估价函数有高估和低估,前者的速度更快,但有可能找不到最佳路径。open表用堆表示。
3,A*的衍生算法:多个起始点和多个停止点。前者只需要开始就加入多个其实点即可,后者需要找一个目的点,在从起始点到目的点的寻路过程遇到停止点就停止。两者结合是第三种情况。两者其实都是选择多个点和一个点之间的寻路,只是看的方向不同,使用的方法也就不同。
4,A*带有启发式估算的多个起始节点,不同的起始节点对于AI的主要性不同,有不同的初始开销值。一次寻路返回多个解决方案,修改后的算法要试图达到多个停止节点,这种出现最坏情况的概率大大增加。
lanchester损耗模型预测战斗结果。
基于Policy的Freelist分配模式。
LUA
1,预编译并非意味着执行更快速,因为Lua中的单元总会在执行前被编译为字节码。luac只不过允许这些字节码被存为文件用于以后的运行。
1,杜绝硬编码。
策略评估技术
1,资源分配树。资源分配树结构提供了一种简单,自然的确定合适资源分配的方式。可以从树根开始进行处理,给树中的每个节点指定优先级。为了响应游戏世界的状态变化,每个非叶节点都必须有定制的逻辑代码,以不断更新其值在子节点之间的分配。可以使用资源分配树分析自己的资源分配或者分析玩家的资源分配,然后决定策略。
2,依存图最主要,最显而易见的用途是确定完成目标的步骤。依存图可用于分析玩家的优势和弱势以及查明对方最脆弱的依存。判断依存图中给定节点是否脆弱:内在价值;强的子依存,弱的父依存。
3,依存图可用于策略推理。为根据不完全的资料推断其他玩家的当前资产和可能采取的策略提供了依据。和资源分配树一样,可以使用依存图,调整节点的脆弱性值赋予AI独特的个性。
RTS命令排队系统
一种基于分片的高性能视域和搜索系统
1,分片的概念和格子差不多,未探明的分片,不可见的分片,可见的分片。
可见性地图即在每个点上维护了这个点是否在对象的视野范围之内,这个只考虑了一个对象。LOS模板即预先设置好的LOS区域,最佳的实现是将LOS区域存储为一系列的水平带,或者是格子。每个LOS模板对应了一个区域。随着对象的移动,可以根据当前位置点和LOS模板找出可见的点,并在这个点上做出标记。合并的可视性地图即每个点记录了自己在哪些对象的视野,对象可以是多个。可以采用位分配的方式来做,这个只能支持少量对象,如果是万计的对象就要耗费太多的内存了。对象移动之后可以找出上一个点和当前点的差异,判断出离开了哪些对象的视野和进入了哪些对象的视野,在相应对象的可见列表中删除它和添加它。这样的话每个对象就可以维护一个自己可见的对象的列表了,搜索起来也就方便多了。可以结合事件触发机制来维护这个列表,相当于所有能看到A点的对象都要注册A点的事件,其他对象进入和离开都会触发事件,通知能看到该点的对象。无论如何,内存是一定消耗很多的。
Bloom过滤器
1,Bloom将哈希函数的返回值乘坐Bloom过滤器键值。Bloom过滤器是通过将Bloom过滤器键值划分为指定长度的块而获得的。每个块是一个索引。Bloom过滤器使用的相位(phase)数等于Bloom过滤器索引数。索引块的长度决定了过滤器数组的大小。当饱和度为50%时,Bloom过滤器数组处于最佳状态。它的应用还是那些海量查询。使用白名单来解决误差问题。
2,Bloom过滤器的有趣特征:
可通过按位OR运算,将两个Bloom过滤器数组并起来。最优的Bloom过滤器数组是不可压缩的。通过将未知的位设置为true,可以修复数组中的内存损坏。根本上来说Bloom过滤器是一种压缩算法。
阅读(1162) | 评论(1) | 转发(0) |