图形库与消息循环

现代计算机程序离不开GUI,然而由于历史等原因,有关图形与界面的发展却混乱而庞杂。
从设计目标上,可以分为

  • 以Qt为代表的逻辑交互式界面,致力于解决与程序算法的信息交互

  • 以OpenGL为代表的管线式图形引擎,致力于满足以图形渲染为核心功能的应用需求

目前有各类图形库,其归类无非以上两种。
GUI库仅当界面改变时才重新绘制发生变化的区域,因为对于系统资源占用很低,相应的,有大量代码用于计算dirty area重绘区域的大小,并正确判定重绘事件的传递范围。渲染引擎无论被绘制内容是否发生更改,总是需要将所有区域重新渲染,计算开销较大。

二者设计上的差异是由其绘制对象的特点所决定的:GUI库主要用于与用户进行信息的输入输出,并处理用户较少、零星的交互操作;渲染引擎往往涉及用户实时控制的视角变化,而任何观察视角的变化都要求全屏图形的重新绘制。此外,GUI的基本组成单元是实用化、标准化的,不需要丰富的绘制技巧;而渲染引擎以丰富、有特点的图形渲染、动画效果作为其中心任务,故需要对于图形更为灵活的控制。

无论是GUI库或渲染引擎,对于稍稍复杂的应用场景(例如涉及多个相互牵连的动画效果),一般使用对象-绘制循环机制。即所有显示元素都抽象为对象,提供统一的draw()供父对象调用绘制自身,而所有绘制参数储存在对象内部。主程序是一个消息循环,首先处理用户输入输出,各类计算,更新需要显示的参数;然后调用scene场景对象递归地绘制整个场景,绘制过程应该是完全静态无阻塞的。这样设计,使得所有绘制对象的显示相互分离,并方便了对于整体对于各部分区域的统一控制。

消息循环的引入,使得动画效果必须交由消息循环中的定时器,定时引发动画效果的递进;对于更为复杂的不定期延时或对于阻塞式IO的操作,可以引入消息循环中的非抢断线程(例如python中的asyncio,仅由sleep回到主消息循环而不抢断。
对于真正需要多线程的操作( 这种操作并不多,例如网络socket.accept(),或数值多核计算 ),要么使用消息队列(缓冲区)将结果暂存,以等待绘制完成并进入消息循环尽心处理;要么对数据成员加读写锁(这要求读写操作完全用get set包装);要么在消息队列里插入一条函数,其中包含Barrier的释放函数,然后Barrier其他线程(也可以用Condition条件变量实现)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值