浅谈区域窗口带来的性能开销

浅谈区域窗口带来的性能开销

作者:BlogUpdater |  时间:2021-04-06 |  浏览:32 |  评论已关闭 条评论

敢情这项链暗中标注了价格啊
区域窗口看起来非常漂亮优雅,但是也会带来一定的性能开销,并且你可以清楚地看到性能开销给用户体验带来的影响。
举个例子,如果你一直不断地修改窗口区域,则性能开销会十分明显,因为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》

评论已关闭。