第十九篇:提高SOUI应用程序渲染性能的三种武器

SOUI是一套100%开源的基于DirectUI的客户端开发框架。

基于DirectUI设计的UI虽然UI呈现的效果可以很炫,但是相对于传统的win32应用程序中每个控件一个窗口句柄的形式,渲染效率是一个很重要的问题。

在SOUI系统中提供了三种武器可以用来提高渲染效率:

第一种武器:选择更高效的渲染引擎

渲染引擎提供文字,几何图形,图像的在缓存上的绘制功能。在SOUI系统中,渲染引擎是一个独立的模块,它不依赖于SOUI系统中的其它模块。

在SOUI系统中已经内置了基于skia及GDI两种框架的渲染模块(skia即在google的chrome及android中使用的渲染引擎)。直观的比较采用两种不同渲染引擎demo中动画的流畅度就可以知道基于skia的渲染引擎速度要比基于GDI的快不少。(GDI慢的原因可能是因为在GDI原生不支持alpha通道,而在实现的过程中采用alphablend模拟alpha时导致性能损失)

如果用户觉得内置的渲染引擎还是不足以满足自己的需求,还可以选择自己实现新的渲染引擎,如基于Direct2D, cairo, agg等渲染引擎。

第二种武器:绘制缓存

一个窗口中的呈现的内容很多时候都是固定的,特别是当窗口大小不变的时候。窗口中呈现的内容可能是经过复杂计算获得的(如图像的九宫格切分,拉伸等),如果每次刷新都重新计算显示渲染效率可能下降,特别是当窗口还比较大的时候。

为了解决这个问题,在SOUI系统中,我们为SWindow提供了一个cache属性,cache=“1”时,在窗口中绘制的内容会被自动缓存,下次刷新时,自动从缓存中提取数据,从而大大加速绘制过程。

第三种武器:非背景混合技术

DirectUI炫酷的效果是依赖于各窗口之间的相互混合实现的(alphablend),但是有些时候一个窗口它可能有自己固定的背景,或者前景完全覆盖窗口而不需要背景。如果这个窗口刷新非常频繁,那么每次刷新都先通知各级父窗口刷新获得背景再做混合将是很大的性能损失(如视频播放窗口)。

为了解决这个问题,在SOUI系统中(ver:1.3.0.1)为SWindow实现了一个新的属性:bkgndBlend,该属性默认为“1”,代表刷新时使用背景混合。如果该属性为“0”,则该窗口刷新的时候直接刷新自己,而不请求父窗口刷新背景,最终提高UI的渲染效率。

时间: 2024-09-28 12:10:14

第十九篇:提高SOUI应用程序渲染性能的三种武器的相关文章

Python之路【第十九篇】:爬虫

Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. Requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. import

Python开发【第十九篇】:Python操作MySQL

Python开发[第十九篇]:Python操作MySQL 本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 ? 1 pip3 install pymysql 使用操作 1.执行SQL + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

第十九篇:USB Audio/Video Class设备协议

在Spring 3 中,对表单提交的校验方式比较常见的有两种 (1)基于注解:对于简单的属性校验,例如,长度,非空等,可以使用Spring,或是Hibernate自带的校验注解 (2)自定义校验类:对于复杂的业务校验可以自定义校验类,该类继承自org.springframework.validation.Validator (3)前台JS校验 增加表单校验功能大概分一下几个步骤 定义校验规则 基于注解的验证 只需要在相关的实体字段上添加校验注解即可,下面的例子基于hibernate的校验标签 i

Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能[转]

我们都希望创建高性能的Web应用程序.由于我们的应用程序变得越来越复杂,我们可能想要支持丰富的画面以及理想的60帧/秒,这能保证我们的应用程序响应灵敏且生动流畅. 知道如何衡量和提高性能,是一个有用的技能,在这短短的文章中,我会带您简单回顾关于如何通过 Chrome DevTools的 Timeline和Profiles做到这一点. 看!这是一个美丽的GIF动画.这标志着这篇文章这里开始展开:) 记录 Timeline工具栏提供了对于在装载你的Web应用的过程中,时间花费情况的概览,这些应用包括

Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能

Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能 二.减少 HTTP 的请求数    当用户浏览页面时,如果我们在用户第一次访问时将一些信息一次性加载到客户端缓存,用户访问其他页面时是可以大大提高页面访问速度的,因为每一次发生http请求是要产生服务器开销的,常用的方法有:合并css,js,并作为外部引用,这样就可以减少访问其他页面时再次加载.目前大多数的网站都采用将页面所用到的图片全部放在一张大图上,这样只要访问网站,图片就全部加载到客户端缓存起来了.不过也

Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法

原文:Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我们讲了Raspberry安装Win10 IoT系统及搭建Visual Studio 2015开发环境的方法(http://www.cnblogs.com/cloudtech/p/5562120.html)

简单程序的编译链接三种方法(编译多个源文件,静态链接库、动态链接库)

一个程序简单的程序如下: 1 hello.h #ifndef HELLO_H#define HELLO_H void hello(const char *name); #endif 2 hello.c #include <stdio.h>#include <stdlib.h> void hello(const char *name){ printf("hello %s\n",name);} 3 main.c #include <stdio.h>#in

小程序的组件通讯三种方法==子向父传值

小程序的组件通讯三种方法 ============================ ================================ 子向父传值 第一步:小程序子向父传值在父组件定义方法 第二步:小程序子向父传值第二部在使用子组件的标签上在父的wxml文件中把方法传递给子组件 第三步:小程序子向父传值第三步在子组件的js文件中调用this·triggerEvent触发方法同时传递参数给父组件 第四步:第四步在第一步定义好的方法内部通过e·detail来接收子组件传递回来的参数 原

python全栈开发基础【第十九篇】进程

一.什么是进程 进程:正在进行的一个过程或是一个任务.而负责执行任务的是CPU. 举例:(单核+多道,实现多个进程的并发): 比如说你就是一个CPU,你下午有几个活要干,吃饭,洗衣服,上厕所等.但是就在那一下午要把所有的事干完(而CPU同一时间只能干一件事),那么如何才能让多个任务实现并发执行的效果呢?那么,你应该这样做,你可以先做饭,在等待饭熟的过程中你可以去洗个衣服,洗的差不多饭也就熟了,那么你在去上个厕所也可以嘛. 二.进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程