2012-10-24 54 views
1

这是对这个类似问题的补充:Which is faster when animating the UI: a Control or a Picture?哪个更快,递归地递归地绘制一次或递归到屏幕?

我递归迭代通过形状树并绘制每个可见的形状到屏幕上。在大约2-3代时,用户可以实时放大或平移处理,但当大约4-6代时,事情就会放慢。

为了帮助提高性能,在每个树更新中绘制位图,然后在每次失效时绘制位图,或者每次失效都要通过递归它自己,这会更好吗?

我正在研究解决方案,但在完成之前,您的答案仍然值得赞赏!

回答

1

绘制到内存中的位图将比绘制到屏幕上更快。如果您在每次更新时都重新绘制整个屏幕,则您可以更好地编写位图,然后将该位图传输到屏幕上。如果你只更新屏幕的一部分,那么你必须衡量屏幕上的多个blits将比组成位图并将整个屏幕绘制到屏幕更快。

通常,您最好在内存中编写位图,然后将合成的位图写入屏幕。这通常更快,并且还可以减少重叠区域快速连续更新时您会看到的闪烁。

附加信息:

取决于位图有多大,你可能不希望借助每一个无效电话整个事情。一种解决方案是如上所述更新内存中的位图,但也跟踪更新的区域(边界框)。然后可以组合边界框并可能执行几个小绘制操作,这比将整个位图绘制到屏幕上要快。这可以更高效,但代码变得相当复杂。通常情况下,我看到的代码实际上是这样写的:“如果区域数量大于N,或者多个区域占总面积的X%以上,则只需绘制整个位图。” N和X的编号在程序启动时确定。

+0

这是位图只绘制到更新但使用每个无效权?附加说明:位图可能比较大:宽度和高度=(上一代)*比例。 '(Radius * Scale * 2)' – TekuConcept

+0

@ChristopherWalker:是的,这是在更新时创建位图并在失效时绘制到屏幕上。看到我的其他信息。 –

+0

我刚完成实现,所以你的答案是正确的:绘制到位图比绘制到屏幕更快。就像澄清一样,我需要代表用户缩放/平移功能绘制每个失效,但是您是否建议我使用'DrawImage'而不是'DrawImageUnscaled'? – TekuConcept