奥多比开发者大会笔记—4 月22 日上午
(欢迎转载,但请注明原文地址)
2010 年4 月22 日9:00-10:00
Flash游戏中的人工智能
张启智
PPT链接:http://flash.9ria.com/viewthread.php?tid=51248
1 游戏引擎的抽象结构
| GameEngine |
| Gameplay | UI |
| Render | logic |
|Sence|Entity|AI|
2 状态与游戏
2.1 有限状态机(FSM)
2.1.1 表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型
2.1.2 状态机包括:状态/事件/状态切换
2.2 设计FSM
2.3 案例:开心Lounge Bar
2.3.1 如果不用状态机,逻辑代码会膨胀到不可维护
2.4 状态机的思想
2.4.1 模拟人类的行为
2.4.2 分而治之
3 并行状态机
3.1 把互斥行为分解到并行的层次中去
3.2 状态管理器维护每个状态层的当前状态
3.3 跨层阻止
4 自治智能体(Boid)
4.1 运行过程
4.1.1 行动选择
4.1.2 操控:计算轨道数据
4.1.3 移动:相同的操作可具有不同的移动模式
5 动力模型
5.1 朝向向量与侧向向量组成局部坐标系
5.2 速度向量
5.3 特殊情况
6 操控行为
6.1 靠近与离开
6.1.1 靠近行为(seek)返回一个操控智能体到达目标的力
6.1.2 离开行为:与靠近行为相反
6.2 追逐与闪避
6.2.1 预测目标未来位置
6.2.2 校准位置
6.2.3 特殊情况,如直接面对的策略
7 组合操控行为
7.1 操控力的截断
7.1.1 加权截断总和
7.1.2 带优先级的加权截断累积
7.1.3 概率抖动
8 优化:空间划分
8.1 优化会带来风险
8.1.1 算法的优化,代码的可读性降低
8.1.2 时间换空间,性能的损失
8.1.3 空间换时间,内存总是有限的
8.2 评判优化是否值得的标准
8.2.1 2/8 原则:如果20%的代码占用了80%的性能,集中优化此段代码就可以了
9 案例:开心水族箱
9.1 如果加入新的类总要改变原有代码的逻辑,说明两层之间欠缺抽象层
9.2 控制继承层次:5-7 理论
10 行为树(BT):多层状体机
10.1 任务的分解和决策
10.2 非枝叶行为的作用是用来做决定,枝叶行为是用来完成具体任务
10.2.1 父行为利用专门的代码做出决策
10.2.2 子行为之前进行竞争,父行为根据子行为的胜者来决定采用的行为
10.3 缺点
10.3.1 很难测试
10.3.2 维护成本很高
11 基本路径寻找
11.1 视线移动,追逐
12 地形与路径
12.1 生成地形数据
12.2 定义方向数据并分配权值
12.3 利用权重找出最佳方向
13 导航图
13.1 利用预先放置的节点计算路径
13.2 每个节点在另一个节点的视线内
14 节点表
14.1 图的遍历(当视线追逐不可用时)
14.1.1 盲目搜索:DFS,BFS
14.1.2 启发式搜索:A*
14.1.3 博弈算法,遗传算法
15 A*算法
15.1 A*算法的伪代码表示
15.2 搜索过程的图形表示
16 地形与动态影像力
16.1 F=G(累积开销)+ H(启发函数)
16.2 地形通过修改G 来影响寻路
16.3 G=cost from stail + Terrain cost
17 动态影响地图(influence mapping)
17.1 敌人视线的影响
17.2 被射杀敌人对地形的影响
18 物体体积的影响
18.1 将各种因素考虑进去后,A*算法可以打遍天下了
19 总结
19.1 Game AI
19.1.1 收集游戏数据
19.1.2 记录运行时的关键数据
19.1.3 根据数据分析与决策
19.1.4 执行决策,异常检查
19.2 解决问题的思路
19.2.1 分而治之
19.2.2 启发式
19.2.3 模拟现实
20 游戏项目经验谈
20.1 引擎和实现分离
20.1.1 每写一个类之前想想应该放到哪里
20.2 随时方便的测试
20.2.1 异常分支永远比正常流程多,做好前置条件判断,后置条件分支和异常分支处理
20.3 尽早重构
20.3.1 重构发生在编写代码的每一刻
20.3.2 出来混的总是要还的,前端在游戏上线之前会焦头烂额,后端则在上线之后会
20.3.3 产品经理是不会预留重构的时间的,自己挤
20.4 使用版本控制系统
20.4.1 Tag,稳定的版本
20.4.2 Trace,当前的版本
20.4.3 Brance,分支
20.4.4 SVN 不错
20.5 项目职能明确
20.5.1 敏捷开发,避免无谓的返工
20.5.2 避免过多工作压在同一人身上
20.5.2.1 项目风险
20.5.2.2 长期做同一件事情当事人会腻
21 关于Happy Elements—演讲者是此公司的联合创始人
21.1 世界欢乐的元素
21.2 MSN:zhangqizhi@live.com
21.3 Mail:john.zhang@happyelements.com
22 问答时间
22.1 A*算法在大场景中性能会急剧下降,怎么解决?
22.1.1 历年的游戏图形学和人工智能的论文中有很多很好的解决办法
22.1.2 比较常见的办法
22.1.2.1 分割
22.1.2.2 Waypoint
22.1.2.3 预计算
22.1.2.4 计算一个人,其他的跟随他
22.2 有限状态机中的操控行为中,如果同时发生了碰撞怎么办?
22.2.1 我都是直接穿越的,笑
22.2.2 单一职能原则
22.2.3 优先级
22.3 我的AI 经常会出现奇怪的行为
22.3.1 健壮性有问题,笑,比如前面说的条件判断没做好
22.3.2 有限状态机实际上是有向无环图,必然不像人那么智能
22.3.3 机器性能高并且项目允许的情况下可以考虑使用更高级的算法,比如博弈,
遗传等
22.3.4 总要在性能和智能之间权衡
22.4 我自己发明了一个类似五子棋的算法替代A*算法,…,以下省略500 字
22.4.1 去看论文吧,不要重复的造轮子
22.5 节点表中用什么数量的节点比较合适
22.5.1 交给QA 去做测试
2010 年4 月22 日10:05-11:00
ActionScript 3 Drawing API探索
Zerlot Ma
1 Who am I?
1.1 1999:tester
1.2 2004:售前解决方案
1.3 2008:大客户技术部经理和架构师
1.4 现在:面向市场推广技术与培训
1.5 AVML Math:此三角函数的贡献者
1.6 左脑+右脑:喜欢玩游戏和摄影
2 本次议题:入门+中级
3 Drawing API 最直观的解释:不是工具箱而是编程接口
4 Flash Player 10 上Drawing API 的新增项
4.1 Pixel Bender
4.2 使用矢量(类型数组)提升内容使用效率
4.3 新增一个非零的缠绕规则
4.4 3D 透视绘图API
4.5 图形数据类
5 ActionScript 3 中的颜色体系—色彩
5.1 0-169.777.215
5.2 24Bit 色彩+8Bits Alpha=32Bits
5.3 Drawing API—24Bits
5.4 BitmapData—32Bits
6 ActionScript3 中的颜色体系—换算机制
6.1 请牢记UINT 类型
7 绘制图形—AS2/AS3 的演变
7.1 AS2—只有MoveClip 可以使用
7.2 AS3—DisplayObject 都可以使用
7.3 改进Performance—善用clear()
8 绘制图形—一切开始与画直线
8.1 lineStyle(width, color, alpha)
8.1.1 仅用作设定未来绘制线条和样式
8.2 clear()
8.2.1 清除一切,线条,附加样式,绘图坐标同时归零
8.3 下一条的起点默认为上一条的终点
8.4 curveTo(x1, y1, x2, y2)
8.4.1 请参考9RIA 中的《Flash and math》,或者访问FlashandMath.com
9 绘制图形—画线是基调,填充是必须
9.1 moveTo,lineStyle,beginFill,lineTo,curveTo,endFill
9.2 AS3 自带内置形状绘制使填充更容易,不过建议使用基本函数
10 绘制图形—渐变填充比单色填充更常见
10.1 看文档
11 绘制图形—填充已经不仅仅是针对Vectors!
11.1 增强的绘图组合命令graphics.drawPath()要善用,不要大量使用,组合的命令会
降低一定的性能
11.2 期待加入copyGraphics()
12 绘制图形—设计与编程的完美结合
13 ColorTransform 类—Color 类的优秀接班人
13.1 AS2:color.setRGB(),color.serTransform
13.2 AS3:所有DisplayObject 都有ColorTransform 属性
14 ColorTransform 类—如何使用它
14.1 色彩转损通道公式:新增值=旧红色值*红色系数+红色偏移值
14.2 HardCode 并且给定选择值
14.3 别忘了reset
15 滤镜—像操作PS 一样
15.1 滤镜的目的:封装对于显示对象的效果操作
15.2 所有显示对象的Filter 属性是一个滤镜的对象数组
16 BitmapData 类—通向绘图巅峰的必经之路
16.1 Bitmap 类是BitmapData 实例的容器
16.2 Bitmap 类继承自DisplayObject,BitmapData 类继承自Object 类
17 BitmapData 类—最常用的绘图API 类
17.1 Source 是最重要的参数
18 BitmapData 类—some tips
18.1 将尽可能多相同的Bitmap 指向同一个BitmapData 引用以节省内存
18.2 BitmapData 也适用于Vedio
18.3 BitmapData 没有最完美的解决方案
19 演示—粒子系统
19.1 StarDust
19.2 Fluid Solver HD
20 内置3D 绘图API—Flash player 10+支持
21 内置3D 绘图API—从XYZ 到UVT
21.1 T 是物体在三维空间内的透视缩放比率
22 演示—UVT
22.1 SuperShape3D
23 Pixel Bender Shaders—高级绘图API
23.1 Pixel Bender Shaders 的特点
23.2 AS3 中的调用方法
24 Pixel Bender Shaders—从PBK 到AS3
24.1 PBX—>PBJ—>Flash
25 Pixel Bender 技巧
25.1 当使用ApplyFilter 是,要小心使用SourceRect
25.2 使用shaderJob 比使用ApplyFilter 更好
25.3 处理速度:BitmapData > ByteArray > Vector(Number)
25.4 放弃Alpha=0 的检测,在必要时可以提高30%-50%的效率
26 推荐两本书:
26.1 Flash Action Script 3.0 动画教程
26.2 Flash Action Script 3.0 特效教程
27 什么可以和Drawing API 结合
28 问答:
28.1 PixelBander 可否做数据运算
28.1.1 可以的,如果不需要显示数据就不要输出计算结果
28.2 PixelBander 大规模使用的时候总有这样那样的Bug
28.2.1 使用的方式要规范
28.2.2 请谨慎使用PixelBander,因为它采用类C 的预编译的方法
28.2.3 PixelBander 在处理大量BitmapData 是比ActionScript3 有很大的优势
28.3 有没有流体的开源项目
28.3.1 刚刚演示的StarDust 里面就有,流体也算粒子系统
2010 年4 月22 日11:00-12:00
从设计到开发:Flash Catalyst和Flash Builder的整合流程
Bill Heil
1 目标
1.1 Flash Catalyst 简介
1.2 探索设计人员和开发人员在FC 和FB 间的工作流程
1.3 需要听众对FC 和FB 有一定的了解
2 Flash Catalyst
2.1 可以快速构建应用的有男过户体验和交互内容,无需编码
3 Flash 平台工具
3.1 FL—>FC—>FB
3.2 FL:创建生动的视频和内容
3.3 FC:将美术设计转换为可执行的应用程序
3.4 FB:创建跨平台的应用程序
4 当前工作流程
4.1 设计
4.1.1 PS/FW/AI
4.1.2 视觉设计
4.1.3 定义用户体验
4.2 开发
4.2.1 FX
4.2.2 导入视觉设计资源
4.2.3 实现用户体验
4.2.4 开发应用
5 在Flex3 设计和开发中存在的问题
5.1 开发人员在整个产品流程中负责整个Flex 项目
5.2 设计人员只提供图形的应用外观部分
5.3 开发人员通过ActionScript 导入资源
6 Catalyst 工作流程
6.1 RIA 应用程序产品组中的人员角色:美术创意->框架布局->交互定义->MXML/As
开发->整合发布
6.2 仅仅为设计人员
6.2.1 美术创意(AI),交互定义(FL)
7 细节和背后的机制
7.1 Think about what I do with make scence into the flow (such as PS/Ai layer and group)
7.2 演示
8 组件的光环模型
8.1 应用程序是一个组件在其内,外观在其外的光环模型
8.2 外观包括:图形,布局,动画,部件,状态
8.3 组件包括:行为,逻辑,数据
9 从Flash Catalyst 中导出项目
9.1 FXP,FXPL,Flash Catalyst 库
9.2 主Flex 应用和相关的资源定义
10 Flash Catalyst 项目中包含的内容
11 Catalyst 工作流程—RIA 开发人员的子集
11.1 应用设计与开发
11.2 迭代应用开发#1
11.3 应用原型开发和设计
11.4 迭代应用开发#2
12 高效率的设计修改
12.1 需要在多个项目中重用组件
13 演示—怎么用lib 实现自定义皮肤
13.1 用Calalyst 定义lib 并在FlexBuilder 中重置默认的组件