繁体   English   中英

C#中的慢速屏幕绘制

[英]Slow screen paint in C#

我只在C#中将几个控件放入主窗体中,并且看到加载窗体时,每个控件的绘制速度都很慢。 这对用户来说非常明显,这很困扰我。 我没有在运行时创建任何控件,它们已经在表单中。 我看到了一些相关的问题,并发现了以下建议:

this.SetStyle(ControlStyles.UserPaint, true);

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

this.SetStyle(ControlStyles.ResizeRedraw, true);

this.UpdateStyles();

此解决方案实际上使我的表单加载得更慢。 我无法想象如果包含30个以上的控件,表单将发生什么情况。

关于我应该做什么的建议?

您需要提供更多信息。

如果您使用现成的Visual Studio控件,但其中有5个控件遇到了此类问题,则该问题必须存在于其他地方-不良的图形驱动程序或类似问题。

那么,您使用什么控件? 您对它们有什么特别的设置? 如果设置了某些属性,请尝试将它们重置为默认值,然后查看是否有所更改。

您将标记设置为“非重要”的形式对于不是所有者绘制的控件来说并不重要,并且您没有说是这种情况。

由于缺少信息,不确定是否与您的问题有关,但是我有时会遇到相同的问题,我将提供详细信息。

5年前,我在Windows Forms信息亭应用程序上工作,该应用程序基于.Net 1.1(当时是最新的)构建。 该应用程序需要精美的图形,这些图形包括主窗体的背景图像和窗体上不同控件的具有透明层的图像。 通过使用控件中的BackgroundImage属性或OnPaint事件以标准方式实现该操作,会导致界面变慢。 存在闪烁,并且在向表单添加许多控件的情况下,您实际上可以看到它们是一个接一个地加载的。

涉及透明度的控件的问题在于,与不包含透明度的控件相比,它们涉及的是不同的绘画模型。 这样的控件在接收到绘画事件时必须将该事件转发给其父对象,后者将首先进行渲染,并且仅在此之后才渲染孩子的图形。 这应该意味着将一个绘制事件转换为三个(绘制事件以透明方式控制,然后将绘制事件转发给父级,然后将绘制事件重新以透明方式控制),但是由于某些奇怪的原因,似乎在.Net的Windows窗体中更多这样的绘画活动从孩子到父母来回传递。 不知道是什么原因。 我知道的一件事是,作为.Net Windows Forms的VB6或C ++ MFC应用程序也基于Win32构建,没有问题。

当时,我尝试了很多互联网上的技巧(例如您所引用的技巧),但没有一个真正起作用。 我最终在GDI +之上构建了自己的渲染引擎。 我不建议这样做,因为这花费了我大量的时间来实现,并且在此过程中我失去了诸如可视表单编辑器之类的功能。

但是考虑到此后出现的技术, 我建议您如果需要构建图形密集型应用程序,最好使用为此进行了优化的Windows Presentation Foundation(WPF),而不是Windows。形式。

我意识到将backgroundImageLayout设置为“ tile”,然后切换到“ stretch”,这大大改善了GUI性能。 我也将某些控件的背景颜色更改为白色,这尤其对隐藏在窗体中的面板有很大帮助。

谢谢大家。

如果使用paint事件在窗体上绘制背景图像,则确实会使速度变慢。 而是在表单加载时或在设计模式下绘制一次背景图像,然后将所有内容从paint事件处理程序中取出。

尝试将具有高度和宽度的图像放在窗体顶部,然后在其上绘制。 它将刷新并绘制得更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM