这是对类似问题的补充:动画 UI 时哪个更快:控件还是图片?.
我递归地遍历形状树并将每个可见形状绘制到屏幕上。在大约 2-3 代时,当用户实时放大或平移时,事情会顺利处理,但是当它达到大约 4-6 代时,事情会变慢。
为了帮助提高性能,最好在每次树更新时绘制位图,然后在每次失效时绘制该位图,还是在每次失效时都进行递归?
我现在正在研究解决方案,但在我完成之前,您的回答仍然值得赞赏!
这是对类似问题的补充:动画 UI 时哪个更快:控件还是图片?.
我递归地遍历形状树并将每个可见形状绘制到屏幕上。在大约 2-3 代时,当用户实时放大或平移时,事情会顺利处理,但是当它达到大约 4-6 代时,事情会变慢。
为了帮助提高性能,最好在每次树更新时绘制位图,然后在每次失效时绘制该位图,还是在每次失效时都进行递归?
我现在正在研究解决方案,但在我完成之前,您的回答仍然值得赞赏!
在内存中绘制位图比在屏幕上绘制要快。如果您在每次更新时都重新绘制整个屏幕,那么您最好先合成位图,然后将该位图传送到屏幕上。如果您只更新屏幕的一部分,那么您必须权衡屏幕上的多个 blits 是否比组合位图和将整个内容绘制到屏幕上更快。
一般来说,最好在内存中合成位图,然后将合成的位图写入屏幕。这通常更快,并且还可以减少重叠区域快速连续更新时您会看到的闪烁。
附加信息:
根据位图的大小,您可能不想在每次无效调用时都绘制整个内容。一种解决方案是如上所述更新内存中的位图,但也要跟踪更新的区域(边界框)。然后,您可以组合边界框并可能执行几个比将整个位图绘制到屏幕上更快的小绘制操作。这可以更有效,但代码变得相当复杂。通常,我看到的代码实际上是这样写的:“如果区域的数量大于 N,或者如果多个区域覆盖的区域超过总面积的 X%,则只需绘制整个位图。” N 和 X 的数字在程序启动时确定。