滚动条第三章节: 优化我们的绘制代码

滚动条第三章节: 优化我们的绘制代码

作者:BlogUpdater |  时间:2019-11-26 |  浏览:390 |  评论已关闭 条评论

之前代码的问题
从之前的代码中我们看到,在我们的绘制函数里绘制了所有的100行文本。这会带来一个问题:在一个窗口的可见区域里,可能只有部分行才会真正地显示出来(但我们全部绘制了),如果我们绘制的是大量的文本行,或者绘制单个文本行需要耗费比较长时间时,这会带来严重的性能问题。

如何解决呢?
我们想到的优化点:通过优化绘制部分的代码,实现只在窗口可见区域绘制文本行,对于其他无关区域不进行绘制,因为用户看到的是仅仅是窗口的可见区域。这样可以提升绘制性能,这个思想,在绘制复杂界面时十分有效果。

我们来看一下如下的代码改动:

以下是之前的代码:

练习题(需要动动脑筋)
1) 解释iMin和iMax的计算方法。
iMin: pps为绘制信息对象,(pps->rcPaint.top / g_cyLine)可以得到需要绘制的第一可见行,注意这里的第一可见行不是基于索引0的第一行。如果其值计算出来大于0,表明当前绘制区域不是在窗口的最上面,则取其值,否则取0(第一行)。
iMax: ((pps->rcPaint.bottom + g_cyLine – 1) / g_cyLine)可以得到需要绘制的最后一行文本的索引,如果其值大于绘制文本的总行数,则取总行数,这样可以确保数据不越界。
2) 在计算iMax,为什么如下的计算方法是错误的?

虽然这两种计算方法在数学原理上是等效的,但是,注意这里使用的是有符号的int类型,所以当pps->rcPaint.bottom为0时,第二种计算方法将会产生负值,导致Y坐标计算错误。
3) 为什么使用2)中的计算方法也没啥大问题?
通常情况下,pps->rcPaint.bottom很少能是0。即使它等于0,说明其可绘制区域为0,表示无论你尝试绘制什么东西,用户都无法看到它。

总结
不知,小弟的解释是否还有那么些道理呢?请大佬们丢点砖头过来。

评论已关闭。