我有一个函数返回一个bitmap
,意味着在面板中用作背景,有时候我必须调用它来创建一个基于参数的新背景。
(由于此面板有两个绘图功能(背景不需要像前景那样经常更改),因此不仅仅需要绘制Paint
事件。)< / em>的
所以我的问题是:如果我将旧的后台缓冲区作为参数并在其上绘制而不是每次函数都创建新的位图时,是否存在(超过符号)性能增益叫?
答案 0 :(得分:2)
是的,你会得到很多我想象的。
首先,你的记忆限制会更好。如果您经常创建位图,那么是什么阻止您的客户端代码保留它们并使您无法运行内存?
分配通常是任何大型系统中最昂贵的东西之一。重用对于创建昂贵的对象来说绝对是件好事。你也会看到来自垃圾收集的打嗝更少。
编辑您还可以考虑维护自己的位图池,而不要求调用者传入现有的位图。确保您记录您拥有位图,并且调用者应将它们视为只读(可以将它包装在一些不可变对象中吗?)。这样你就可以在自己的时间创建/处理,而不需要客户端的任何东西。
答案 1 :(得分:2)
是的,在绘制时运行的代码中重新创建位图通常过于昂贵并且会使绘画速度过慢。保留位图的副本可以解决速度问题,而且需要更多内存。
请注意,标准的Control.BackgroundImage属性可用于此,请考虑使用它。您只需添加更新该属性的代码(并在需要不同背景图像的条件更改时调用Invalidate)。绘图是自动的。
二级效率考虑因素是预先缩放位图以完全适合控件的ClientSize,从而避免在绘制时重新缩放位图。那里节省很多,特别是当位图很大时。但是需要重写OnResize方法,以便重新生成缩放位图。如果在调整表单大小的同时使绘画速度过慢,则需要连接表单的ResizeEnd事件。
以Format32bppPArgb像素格式创建位图,与其他任何格式相比,它在大多数视频适配器上的绘制速度提高了约10倍。