【发布时间】:2010-10-24 12:30:18
【问题描述】:
我有一个包含一些“自定义控件”的库。本质上,我们有自己的按钮、圆角面板和一些带有一些自定义油漆的组合框。尽管 OnPaint 方法中有“数学”,但控件是相当标准的。大多数时候,我们所做的只是绘制圆角并向背景添加渐变。我们使用 GDI+。
这些控件没问题(根据我们的客户说看起来非常漂亮),但是尽管有 DoubleBuffer,您还是可以看到一些重绘,尤其是当同一表单上有 20++ 个按钮时(例如)。在表单加载时,您会看到按钮绘制……这很烦人。
我很确定我们的按钮不是世界上最快的,但我的问题是:如果双缓冲区“开启”,那么所有重绘不应该在后台发生,Windows 子系统应该“立即”显示结果“?
另一方面,如果存在将创建标签的“复杂”foreach 循环,则将它们添加到面板(双缓冲)并更改它们的属性,如果我们在循环之前暂停面板的布局并在以下情况下恢复面板的布局循环结束了,所有这些控件(标签和按钮)不应该“几乎立即”出现吗?不是这样的,你可以看到面板被填满了。
知道为什么这没有发生吗?我知道没有示例代码很难评估,但这也很难复制。我可以用相机制作视频,但相信我,它并不快 :)
【问题讨论】:
-
您还应该尝试暂停/恢复重绘操作...查看我的更新答案。
-
你肯定有性能问题。我不认为绘制渐变和四分之一圆应该那么慢。
-
好吧,正如我所说,UI 库不是最快的,但我们也有很多 GDI+ 绘图代码来使按钮看起来像我们想要的那样。它不仅仅是一个 draw.arc x 4 并用渐变绘制表面。我想我们也必须努力解决这个问题……但我想知道是否有办法加快速度。如果它双缓冲,它应该在“翻转”时快速显示它,不是吗?
-
我还在调查这个问题,很快就会报告。感谢到目前为止的想法。
标签: c# winforms performance gdi+ doublebuffered