以X Window为代表的客户/服务器架构。

X Window通常是指X服务器及封装了通信协议的客户端库。服务器端主要负责输入事件的分发,窗口层次的管理,以及显示输出的处理,其它功能基本上都是在客户端实现了。我们看到的各种界面元素都是在客户端绘制的,这一部分通常称为ToolKit,应用程序开发者只需要关注ToolKit就行了。以前的ToolKit非常多,经过多年的进化和淘汰,常用的ToolKit主要是GTK+和QT两个了。X Window是非常复杂和晦涩的,以前我花了不少时间去研究用于嵌入式系统的TinyX,有兴趣的朋友可以看我的博客X Window研究笔记

要注意的是X Window的窗口管理功能是在X服务器里实现的,但窗口管理器却是一个客户端进程。窗口管理器决定了桌面系统的整体风格,窗口管理器进程通过窗口管理协议,发送请求给X服务器,由X服务器执行真正的窗口管理功能。这是X Window七大设计原则中的,提供机制而不是策略的一个体现。这样的好处在于,窗口管理器可以独立发展:比如用于嵌入式系统的窗口管理器和传统PC的窗口管理器之间的差别是很大的,独立出来后就可以开发两个不同的窗口管理器,分别用于不同的场景。

Android上的实现也是客户/服务器架构。但是它和X Window并不完全相同,首先应用程序与服务器使用binder而不是socket作为IPC机制,这主要是出于性能和安全权限控制考虑。其次是窗口管理、渲染输出和输入事件分发是在几个不同的服务里实现的。

以DirectFB为代表的Master/Slave架构。

DirectFB可以单进程运行也可以多进程运行,多进程运行需要各进程之间协作,以防止显示错乱。在多进程运行方式下,DirectFB使用了一个所谓的主从(Master/Slave)模式,它有一个叫Fusion的内核模块,每个DirectFB进程通过文件接口与Fusion模块交换数据,第一个启动的DirectFB进程称为Master,后面的启动的DirectFB进程称为Slave,Master进程一般不能退出,否则Slave进程也会被迫退出。

Master进程负责读取输入设备的输入事件,然后根据情况分发到各个Slave进程。窗口等信息放在共享内存中,窗口管理器通常是作为一个模块在各个进程中,后来DirectFB也支持了独立进程的窗口管理器。

DirectFB说Master/Slave模式与C/S模式相比有更高的性能,但是我觉得真正的性能瓶颈是在界面的绘制上,进程间通信的开销非常小,Master/Slave模式根本没有什么必要。Fusion模块好长时间都没有稳定下来,我被它折腾了好几年,呵呵,现在想起来还有点恼火。

以传统嵌入式GUI为代表的单进程架构。

功能机时代的展讯和MTK的手机平台,以及现在的一些实时操作系统,整个系统都是在一个地址空间运行的,所有应用程序的数据都是共享的,虽然没有明显的创建进程,但是可以把整个系统看作一个进程。GUI在其中一个线程里运行,应用程序只是逻辑上的划分,物理上都是在一个进程中运行,所以他们不需要进程间通讯机制。

在这种架构下,GUI实现相对简单,不需要进程间通讯机制,也不需要加锁(虽然有多个线程,但GUI的访问是串行的),GUI运行效率很高。它的不足在于稳定性存在潜在的问题,就GUI本身来说,因为其简单性而具有更高的稳定性,但是由于全部应用程序共享同一个内存地址空间,某个应用程序崩溃掉会导致整个系统崩溃。不过这不是GUI的问题,而是系统的问题。

以前我写的嵌入式GUI FTK就是单线程的,这样做的主要原因是:1.FTK是为嵌入式系统开发的,所以希望能兼容各种实时操作系统。2.希望做得简单些,适用于轻量级的应用,没有必要搞的像GTK+那样强大。3.尝试一种新的架构,全部有界面的应用程序都在一个进程中运行,其它服务器在后台运行,彻底分离界面与逻辑。

基于浏览器HTML5 Canvas的GUI。

创新高性能移动UI框架——Canvas UI 框架认为Canvas UI是HTML5 APP的界面发展趋势,我在几年前就认为Canvas UI才是HTML5 APP的未来,所以花了大量时间去开发CanTKAppBuilder/GameBuilder

基于浏览器HTML5 Canvas的GUI的架构类似于单进程的架构,主要区别有:

  • 浏览器已经封装了输入设备,GUI不要从输入设备里读取事件,只需要注册相应的回调函数即可。

  • 浏览器已经实现了主循环,GUI可以通过requestAnimationFrame注册回调函数。

  • GUI无法直接唤起输入法,只能通过input元素来模拟,也就不需要去实现编辑器控件。

  • GUI 不需要自己实现基本的绘图操作,Canvas已经提供了强大绘图操作。

  • 不需要太关心跨平台的东西(各个浏览器存在兼容性的问题,还好Canvas的API差异不大)。

不同的GUI的架构适用于不同的情况,需要根据实际情况选用。对于大多数人来说,去实现一个完整的GUI的机会不多,了解一下就够了。

游戏引擎/GUI的设计与实现-常见GUI架构的更多相关文章

  1. 刺猬大作战(游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4)

    游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式: ...

  2. 游戏引擎/GUI的设计与实现-序

    几年前写<嵌入式GUI FTK设计与实现>,没写几篇就停止更新了.当时自己研究过MicroWindows, X Window, DirectFB, GTK+和Android的GUI,又写过 ...

  3. 八款常见的Android游戏引擎

    原文地址:http://bbs.csdn.net/topics/380203732 1.Angle  Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL  ...

  4. 《Genesis-3D开源游戏引擎-FQA常见问题解答》2014年01月10号版本

    1.Genesis-3D开源游戏引擎主要面向哪些用户人群?有限制吗? 1.我们的引擎没有限制,只要您想了解和使用我们的引擎,就可以加入Genesis-3D的大家庭.2.我们的主要用户群是各个相关的企业 ...

  5. 开源战棋 SLG 游戏框架设计思考(一)简介和游戏引擎

    战棋 SLG 游戏 SLG(Simulation Game)游戏是模拟游戏的简称.战棋类的SLG有两种:一种是 War Game 中的兵棋推演分支,常见的游戏有战争艺术3(TOAW3 — The Op ...

  6. Galaxy2D游戏引擎常见问题解答

    ◆Galaxy2D游戏引擎开源吗?    Galaxy2D游戏引擎不开源. ◆Galaxy2D相对HGE有何优点?    Galaxy2D相对HGE有以下优点:     (1)自带音频播放功能,HGE ...

  7. 3D游戏引擎设计 实时计算机图形学的应用方法 第2版 pdf 带索引书签目录

    3D游戏引擎设计  实时计算机图形学的应用方法  第2版 目录 第1章 概述1.1 图形硬件和游戏发展史1.2 本书版本与软件发展史1.3 章节导读 第2章 图形系统2.1 基础知识2.1.1 坐标系 ...

  8. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  9. 转载:[转]如何学好3D游戏引擎编程

      [转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...

随机推荐

  1. c++类中的常量

    C++类中的常量 由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用 const 修饰数据成员来实现.const 数据成员的确是存在的,但其含义却不是我们所期望的.cons ...

  2. Mysql-学习笔记(==》事件 十二)

    事件 计划任务(定期定时执行) -- 查看当前mysql数据库是否开启时间功能,默认关闭SHOW VARIABLES LIKE 'event_scheduler'; -- event_schedule ...

  3. qbxt十一系列三

    [题目分析] 这完全是个数学题啊,有些崩溃,上午考试写了两个小时,20分,于是乎 下午改啊改啊 改到10分....如果第二个圆的圆心在第一个圆.....呃 说不清楚 像下面这个图这样,两圆重叠部分中C ...

  4. CentOS6 启动流程图文解剖

    我们在使用Linux操作系统的时候,我们只需按下电源键,等待,然后输入账户和密码就可以使用Linux操作系统了.那么在按下电源到输入账号和密码之前,操作系统都做了些什么?下面就来讲述在这段时间发生的动 ...

  5. 六、IO流——文件

    IO流1.字节流(InputStream.OutputStream)2.字符流 (Reader.Writer)3.缓冲流(BufferedInputStream.BufferedOutputStrea ...

  6. 我的android学习经历18

    今天主要学了几个android控件和使用两个适配器 ListView DatePicker和TimePicker GridView 适配器:SimpleAdapter和ArrayAdapter 都是常 ...

  7. oracle dual 表

    dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 sele ...

  8. 【leetcode❤python】 112. Path Sum

    #-*- coding: UTF-8 -*-# Definition for a binary tree node.# class TreeNode(object):#     def __init_ ...

  9. BZOJ 3171 循环格(费用流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3171 题意: 思路:若能构成循环,则每个格子的入度出度 均为1.因此将每个点拆成两个点x ...

  10. left join 等连接查询遇到同名字段覆盖问题

    可以在查询时给字段赋别名,但是需要注意以下:*的位置要在最前面,放在其他地方都会出错.这种写法同名覆盖的字段还在,然后在*的后面加上别名字段,已经可以满足所有需求了 SELECT *,r.id as ...