/LGC设计模式/从游戏引擎看 GUI 系统

400 篇文章 3 订阅
147 篇文章 0 订阅
从游戏引擎看 GUI 系统
作者: 刘鹏
日期: 2008-11-13
GUI 系统可以看成一个简单的游戏引擎,因此游戏引擎中的很多技术可以用在 GUI 系统中,本文试图对这些技术进行总结和归纳。
背景

现代的 GUI 越来越复杂,如 iPhone,它既有绚丽的三维画面,又有发杂的控制 逻辑。传统的二维技术已不能满足现代 GUI 系统的需要。

我理解,GUI 系统就是一个小型的游戏引擎,比如它们都需要考虑图形的渲染、 逻辑的控制、输入输出的处理等等,随着在现代 GUI 系统中三维特效、绚丽动 画、复杂逻辑的引入,GUI 系统与游戏引擎愈发相向。游戏引擎积累的很多技术 都借鉴过来在 GUI 系统中使用。

渲染器的设计

要遵循的原则是:

  • 逻辑与渲染分离;
  • OpenGL/DirectX 封装一层,它们的 API 不直接出现在游戏实现中;
  • 与操作系统打交道的接口都要封装以层,与游戏实现分离。

文献1有一个渲染器的设计实例。

调度器的设计

在不同的时间里,当数百个不同物体和过程需要更新时,处理起来会很复杂。调 度器的能力在于能够动态增加和删除物体,使新物体很平滑地加入到游戏中,不 需要的时候又可以从调度器里删除。

调度器由如下三部分组成:

  1. 任务管理器:负责任务注册和组织 (任务列表);
  2. 事件管理器:产生必须的事件;
  3. 时钟组件:跟踪真实时间、当前的仿真时间和帧数。

游戏引擎中的时钟组件常常采用虚拟时间,即将真实时间分成帧,任务在帧之间 以批处理方式处理,每帧渲染完后与真实时间同步。

更多内容可参考下文献2。

复杂场景管理

场景管理的目标是在保证不明显降低场景的输出质量的情况下,尽量简化场景物 体的表示和着色属性,以减少渲染时间。

关于复杂场景的管理最简单的思路是用 list 将所有场景连接起来,绘制每一帧 时依次存入渲染器进行处理,由于隐藏面也要绘制,这样比较低效。

为此,我们需要剔除隐藏面,减少绘制元素。为实现这个目的,我们将场景进行 划分,采用树结构进行组织和管理,有三种划分方法,对应三种算法:

  • 二叉树(BSP)算法,一分为二;
  • 四叉树(QuadTree)算法,一分为四;
  • 八叉树(OctTree)算法,一分为八。
碰撞监测

碰撞检测可分成两个层次,首先根据基于外围盒检测,若外围盒检测到碰撞后再 深入到内部进行三角形检测。

碰撞检测的数据结构有两种:

  • 基于格子;
  • 基于 BSP 树。
输入系统

游戏键盘与普通键盘(文本输入键盘)的区别:

  • 不需要自动重复文字;
  • 只需要读取扫描码,只需知道哪个键被按下,无需知道是哪个字符;
  • 希望直接访问硬件,而不是基于 API 的消息机制。
寻路算法

状态空间搜索:将问题求解的过程表现为从初始状态到目标状态寻找路径的过程, 即在求解一个问题时,找到一条解题的路径,可以从求解的开始到问题的结果。

求解过程中产生多条求解路径,这些路径构成一个图,在图中找到一条路径可以 从开始到结果。

可采用两种方法求解:

  • 穷举法,包括深度优先搜索、广度优先搜索;
  • 启发式搜索,用估价函数对每个位置评估
    • 局部择优搜索法
    • 最好优先搜索法
References
  1. 游戏中的渲染器架构
  2. 关于游戏中的调度器
  3. <<游戏引擎教程>> 房晓溪 水利水电出版社
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值