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的渲染效率。

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

  1. 第十四篇-ImageButton控制聚焦,单击,常态三种状态的显示背景

    这里先用XML设置. myselector.xml <?xml version="1.0" encoding="utf-8"?> <selec ...

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

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

  3. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)

    第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...

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

    Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能 二.减少 HTTP 的请求数    当用户浏览页面时,如果我们在用户第一次访问时将一些信息一次性加载到客户端缓存, ...

  5. 性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧

    性能调优之提高 ASP.NET Web 应用性能的 24 种方法和技巧   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对 ...

  6. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

  7. 使用Memcached提高.NET应用程序的性能

    在应用程序运行的过程中总会有一些经常需要访问并且变化不频繁的数据,如果每次获取这些数据都需要从数据库或者外部文件系统中去读取,性能肯定会受到影响,所以通常的做法就是将这部分数据缓存起来,只要数据没有发 ...

  8. 【转】使用Memcached提高.NET应用程序的性能

    在应用程序运行的过程中总会有一些经常需要访问并且变化不频繁的数据,如果每次获取这些数据都需要从数据库或者外部文件系统中去读取,性能肯定会受到影响,所以通常的做法就是将这部分数据缓存起来,只要数据没有发 ...

  9. 使用Chrome DevTools的Timeline和Profiles提高Web应用程序的性能

    来源: http://www.oschina.net/translate/performance-optimisation-with-timeline-profiles 我们都希望创建高性能的Web应 ...

随机推荐

  1. 【GoLang】GoLang 错误处理 -- 使用异常的思路进行处理

    go处理错误的另一种方式 go处理错误常见的方式是 err := funcReturningError() if err != nil { // 处理错误 } 然而因为过于繁琐而饱受诟病.下文简述另一 ...

  2. Zookeeper服务常用的操作命令

    Zookeeper服务安装之后,一般会在这个服务的基础之上安装其他的大数据平台,其他的框架一般会提供很多接口对Zookeeper中的内容进行一定的操作,但是功能相对单一,所以有些时候,有必要我们自己登 ...

  3. 【hiho一下第77周】递归-减而治之 (MS面试题:Koch Snowflake)

    本题是一道微软面试题,看起来复杂,解出来会发现其实是一个很简单的递归问题,但是这道题的递归思路是很值得我们反复推敲的. 原题为hihocoder第77周的题目. 描述 Koch Snowflake i ...

  4. Java for LeetCode 233 Number of Digit One

    Given an integer n, count the total number of digit 1 appearing in all non-negative integers less th ...

  5. Django~Models2

    Generally, each model maps to a single database table. Each attribute of the model represents a data ...

  6. ABAP 特殊透明表

    ADRC   地址 (业务地址服务)   存储所有的有关地址的记录 MSEG  凭证段:物料   存储物料的所有凭证(包括销售.交货.采购等) VBPA-VBELN(销售凭证)  VBPA-KUNNR ...

  7. asp.net中获取当前url的方法

    HttpContext.Current.Request.Url.ToString() 并不可靠. 如果当前URL为 http://localhost/search.aspx?user=http://c ...

  8. 警告:Assigning to 'id<Delegate>' from incompatible type 'ViewController *const_st

    原因: 你自己写了代理,设置了   delegate = self.但是self 没有遵守这个协议 只需要遵守这个协议就可以消除警告.

  9. [Android Pro] Android保存图片到系统图库

    http://stormzhang.github.io/android/2014/07/24/android-save-image-to-gallery/ http://blog.csdn.net/x ...

  10. Callable 和 Future接口 学习

    * Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务. * Callable和Runnable有几点不同: * (1)C ...