浅谈区域窗口带来的性能开销
敢情这项链暗中标注了价格啊
区域窗口看起来非常漂亮优雅,但是也会带来一定的性能开销,并且你可以清楚地看到性能开销给用户体验带来的影响。
举个例子,如果你一直不断地修改窗口区域,则性能开销会十分明显,因为CPU会一直忙于生成新的区域。
一个关于内部性能的问题会凸显区域窗口所隐含的性能开销:窗口矩形的假设逻辑。
假设,你有一个大型窗口,但是设置了一个很小的窗口区域。和另外一个带有很小窗口区域的小窗口相比,性能开销会更大一些吗?
还真是。
点击判断(Hit-testing)是窗口管理器(window manager)最常见的执行动作。给定屏幕上的一个点坐标,窗口管理器可以查找出其对应的窗口。为了加速这个查找过程,窗口的矩形被用来进行快速的坐标判断。举个例子,如果一个窗口的矩形坐标为是(0,0)-(100,100),则点(200, 10)很明显不在这个窗口范围,因为从坐标上来计算,点的坐标不位于窗口的矩形坐标范围。我们从中可以明白:矩形判断是很快的。
假设这个窗口是一个区域窗口,则这个矩形判断就不那么容易了,因为这个点可能位于窗口矩形中但位于区域范围外。在这种情况下,窗口管理器必须将点的坐标和窗口的区域坐标进行匹配计算。
但是Windows会在底层使用窗口的矩形来做”快速测试”,以判断这个区域是否值得进行比较。如果点位于窗口矩形之外,则窗口管理器根本就不会进行区域的判断,这挺好的,因为区域的判断相对来说是比较慢的。
换句话说,Windows使用了如下的流程进行点击判断,伪代码如下图所示:
所以,如果你创建了一个包含很小一个区域的大型窗口,窗口管理器就无法在第一轮(快速)矩形判断中得出结论,它不得不进行上图中的第三种(慢速)区域判断。
总结
当使用区域窗口的时候,请确保窗口的矩形尽可能地贴近区域的边界。这有助于窗口管理器快速判断某个指定的点所属的窗口。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《A hidden performance cost of regional windows》
相关文章
- akage使用Oracle包快速提高数据库性能(oraclepac)
- 测试显示苹果的Swift语言性能不佳,任重而道远!
- MySQL数据表优化:提升数据库性能(mysql数据表优化)
- Oracle表增加分区:简单提升数据库性能(oracle表增加分区)
- 经典redis设计架构获取极致性能(常见redis设计架构)
- 登录性能提升提高登录并发数通过Redis(登录并发数redis)
- MySQL优化如何使用三个联合索引提高数据库性能(mysql 三个联合索引)
- Redis重新调整集合值以实现更好的性能(redis重新设置集合值)
- Redis读取操作性能分析(redis读取耗时)
- Oracle IO块大小对性能的影响(oracle io块大小)
- ASP.NET技巧:同时对多个文件进行大量写操作对性能优化
- Node.js与PHP、Python的字符处理性能对比