背景
现代的 GUI 越来越复杂,如 iPhone,它既有绚丽的三维画面,又有发杂的控制 逻辑。传统的二维技术已不能满足现代 GUI 系统的需要。
我理解,GUI 系统就是一个小型的游戏引擎,比如它们都需要考虑图形的渲染、 逻辑的控制、输入输出的处理等等,随着在现代 GUI 系统中三维特效、绚丽动 画、复杂逻辑的引入,GUI 系统与游戏引擎愈发相向。游戏引擎积累的很多技术 都借鉴过来在 GUI 系统中使用。
渲染器的设计
要遵循的原则是:
- 逻辑与渲染分离;
- OpenGL/DirectX 封装一层,它们的 API 不直接出现在游戏实现中;
- 与操作系统打交道的接口都要封装以层,与游戏实现分离。
文献1有一个渲染器的设计实例。
调度器的设计
在不同的时间里,当数百个不同物体和过程需要更新时,处理起来会很复杂。调 度器的能力在于能够动态增加和删除物体,使新物体很平滑地加入到游戏中,不 需要的时候又可以从调度器里删除。
调度器由如下三部分组成:
- 任务管理器:负责任务注册和组织 (任务列表);
- 事件管理器:产生必须的事件;
- 时钟组件:跟踪真实时间、当前的仿真时间和帧数。
游戏引擎中的时钟组件常常采用虚拟时间,即将真实时间分成帧,任务在帧之间 以批处理方式处理,每帧渲染完后与真实时间同步。
更多内容可参考下文献2。
复杂场景管理
场景管理的目标是在保证不明显降低场景的输出质量的情况下,尽量简化场景物 体的表示和着色属性,以减少渲染时间。
关于复杂场景的管理最简单的思路是用 list 将所有场景连接起来,绘制每一帧 时依次存入渲染器进行处理,由于隐藏面也要绘制,这样比较低效。
为此,我们需要剔除隐藏面,减少绘制元素。为实现这个目的,我们将场景进行 划分,采用树结构进行组织和管理,有三种划分方法,对应三种算法:
- 二叉树(BSP)算法,一分为二;
- 四叉树(QuadTree)算法,一分为四;
- 八叉树(OctTree)算法,一分为八。
碰撞监测
碰撞检测可分成两个层次,首先根据基于外围盒检测,若外围盒检测到碰撞后再 深入到内部进行三角形检测。
碰撞检测的数据结构有两种:
- 基于格子;
- 基于 BSP 树。
输入系统
游戏键盘与普通键盘(文本输入键盘)的区别:
- 不需要自动重复文字;
- 只需要读取扫描码,只需知道哪个键被按下,无需知道是哪个字符;
- 希望直接访问硬件,而不是基于 API 的消息机制。
寻路算法
状态空间搜索:将问题求解的过程表现为从初始状态到目标状态寻找路径的过程, 即在求解一个问题时,找到一条解题的路径,可以从求解的开始到问题的结果。
求解过程中产生多条求解路径,这些路径构成一个图,在图中找到一条路径可以 从开始到结果。
可采用两种方法求解:
- 穷举法,包括深度优先搜索、广度优先搜索;
- 启发式搜索,用估价函数对每个位置评估
- 局部择优搜索法
- 最好优先搜索法