Direct2D/GDI+和缓慢的Windows窗体绘图-可以做什么?我正在使用VisualStudio2008、.NETC#2.0-3.5和Windows窗体进行大量工作,并且我注意到,与我之前的许多人一样,GDI+在绘制控件时非常慢。请注意,我不太处理图像(JPG、GIF等)。图像仅在某些地方用作图标。这个其实就是控件/窗体/etc,画起来比较慢。问题是您可以看到正在绘制的控件,绘制一组看似简单的控件可能需要几秒钟。即,它是滞后和可怕的。我做了一个测试,我只是在表格上放了一些标签(40-50),按F5运行并且必须等待它们被绘制。再次,滞后,而不是一个很好的体验。好吧,WPF可能会解决这个问题,但我/我们还没有准备好迁移到WPF。因此,我在寻找解决方法或修复程序时偶然发现了Direct2D并在阅读其他一些库时。让我有点困惑,因此出现了这些问题:1)首先,我想要的是一种相当简洁的方法来用更快的硬件加速方法替换GDI+。是否可以在不使用WPF且不重写所有Windows窗体代码的情况下执行此操作?每当我在Direct2D上阅读任何内容时,我都会看到一长串通常很糟糕的C++代码,告诉我如何手动编写要绘制的代码。我不想要那个。2)在网上看书的时候偶然发现了SlimDX,但是一直想不通怎么用(我承认,我写的时候没试过)。可以说我已经有一个GUI应用程序(Windows窗体,标准C#代码)——我能以某种方式使用SlimDX(或类似的东西)来“替换”GDI+而无需太多重写吗?我的问题是我找不到任何示例或告诉我是否可以在我已经创建的Windows窗体软件中使用SlimDX、Direct2D或类似的东西,以及如果可能-如何使用。希望我不是太含糊=)==编辑==2010-09-22我在我的真实应用程序中做了一些测试并隔离了一个缓慢的事情:当我添加到UserControl文本中的一些标签时,控件会调整大小本身以适合文本。例如,包含GroupControl的位将适应您刚刚添加到标签的.Text属性中的文本的大小。大约有10个Label控件。第一次更新标签,从而改变大小,整个过程大约需要500ms。标签的第二次更新,没有大小变化,大约需要0毫秒。==编辑2==2010-09-22发现其中一个减速。然后在Text-property中添加一个String,如果添加的文本与更新前的文本的字符串长度不同,则速度较慢。我使用DevExpress库,LabelControls可以设置为AutoSizeMode。如果我将其设置为“无”,则在添加长度与前一个文本不同的文本时,延迟会消失。我想这个问题对于普通的标签控件来说是一样的,因为它也有一个AutoSize=true/false设置。然而,这是一个“解决方法”,但仍然证明了我的观点——当调整大小真的很糟糕时,它真的很慢。上面的许多海报都有很好的观点。我自己在GDI+中创建了一个3DCAD应用程序,并且发现如果正确实现它速度足够快。然而,使用控件立即让我觉得这是一种非常尴尬的做事方式。控件是一个相当大的对象,在这种情况下,有很多理由创建您自己的控件。我建议您研究保留模式绘图系统。它易于实施,并且在大多数情况下都能满足您的需求。您必须自己创建绘图逻辑,但这很有趣并且会给您更大的灵活性:)关于您的第一个问题,我不得不使用GDI来做一些在GDI+下花费多年的图像处理工作。这是4-5年前的事了,使用托管C#与GDI一起工作是一件痛苦的事——不确定现在有多少变化。有很多像BitBlt这样又好又快的函数,绘图非常快,但是你需要非常小心地释放资源(句柄)和内存。我有另一个问题,那就是将结果保存为JPEG,而它在GDI中不存在,所以我不得不使用CxImage读取HBitmap,然后保存它。总之,GDI非常快速和强大。如果DirectX中有更好的抽象,您可能最好还是使用它们。我正在研究一些相同的问题。我正在编写一个需要能够非常有效地渲染2d图形的应用程序,因为一些用户可以同时打开10-50个窗口。需要考虑的一件事是,这里没有人谈论direct2d只能在装有servicepack2和更高版本的Vista的计算机上使用。此外,根据此链接:http://www.tomshardware.com/news/msft-windows-xp-windows-7-market-share-win7,13876.html截至2011年11月,38.5%的Windows用户仍然使用XP。因此,如果将您的应用程序出售给仍在运行XP的大量用户是一个问题(或者您的市场基础是主要使用XP的第三世界国家),那么您应该选择:用于更新操作系统的Direct2d,用于XP系统的GDI+。XNA-与XP兼容,也可用于较新的操作系统。请参阅此链接:http://msdn.microsoft.com/en-us/library/bb203925.aspxSlimDX-在第一个答案中提到。支持XP和更新的操作系统。请参阅:http://slimdx.org/和http://slimdx.org/features.php如果您关心Windows、Linux、Max等之间的兼容性,请使用OpenTK。您还应该知道GDI+有一个错误,导致它在最初发布时性能很差。请参阅以下链接,为什么一些开发人员声称Microsoft破坏了使用GDI+的应用程序的Windows7图形用户界面:http://www.windows7taskforce.com/view/3607或使用您最喜欢的字符串在搜索引擎上进行网络搜索:""gdi+bugslow"在Windows7上。您可以尝试托管directx,但他们不再支持它(移至XNA)。老实说,除非你有一台糟糕的电脑或大量的控制器,否则我不知道为什么会这么糟糕。如果您在主线程上执行cpu密集型操作,请将其移至单独的线程。这是我能想到的造成这种滞后的另一个原因。我们在C#应用程序中使用SlimDX……但我们实际上是在做3D。我们编写了自己的2D库,可以进行简单的2D绘图。SlimDX只是DirectX的轻量级包装器。因此,您可以获得DirectX的所有优点和缺点。就像那样,模拟显卡(如果不是)就是您的问题。如果你想要绘制到屏幕外位图的东西,我会选择WPF,因为它与C#集成得很好,几乎可以在任何地方工作,并且在硬件可用时加速。您可以将输出复制到位图并在常规GDI/Winforms中使用它。但如果你做相当复杂的事情(很多过滤器,混合纹理等......),它只会比GDI+更快。编辑:为了回应评论,我构建了一个小样本表格。第一次切换需要几秒钟,但随后有响应。比我预期的要慢,但仍然有效。如果这是关于他在他的应用程序中看到的性能,请Ted发表评论。C#学习教程到此为止:Direct2D/GDI+和SlowWindowsFormDrawing-Whatcanbedone?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——publicclassForm1:Form{publicForm1(){InitializeComponent();//***编辑***this.tabPage1.SuspendLayout();this.tabPage2.SuspendLayout();this.tabControl1.SuspendLayout();这个.SuspendLayout();FillTab(tabPage1,Color.White);FillTab(tabPage2,Color.Yellow);//***编辑***this.tabPage1.ResumeLayout(false);this.tabPage2.ResumeLayout(false);this.tabControl1.ResumeLayout(false);这个.ResumeLayout(false);}privatestaticvoidFillTab(TabPagetabPage,Colorcolor){for(inti=0;i///必需的设计器变量。///privateSystem.ComponentModel.IContainercomponents=null;//////清除任何正在使用的资源。//////如果应处置托管资源,则为true;否则为false。base.Dispose(处置);}#regionWindows窗体设计器生成的代码//////设计器支持所需的方法-不要使用代码编辑器修改///此方法的内容。///privatevoidInitializeComponent(){this.tabControl1=newSystem.Windows.Forms.TabControl();this.tabPage1=newSystem.Windows.Forms.TabPage();this.tabPage2=newSystem.Windows.Forms.TabPage();this.tabControl1.SuspendLayout();这个.SuspendLayout();////tabControl1//this.tabControl1.Controls.Add(this.tabPage1);this.tabControl1.Controls.Add(this.tabPage2);this.tabControl1.Dock=System.Windows.Forms.DockStyle.Fill;this.tabControl1.Location=newSystem.Drawing.Point(0,0);this.tabControl1.Name="tabControl1";this.tabControl1.SelectedIndex=0;this.tabControl1.Size=newSystem.Drawing.Size(292,266);this.tabControl1.TabIndex=0;////tabPage1//this.tabPage1.Location=newSystem.Drawing.Point(4,22);this.tabPage1.Name="tabPage1";this.tabPage1.Padding=newSystem.Windows.Forms.Padding(3);this.tabPage1.Size=newSystem.Drawing.Size(284,240);this.tabPage1.TabIndex=0;this.tabPage1.Text="tabPage1";this.tabPage1.UseVisualStyleBackColor=true;////tabPage2//this.tabPage2.Location=newSystem.Drawing.Point(4,22);this.tabPage2.Name="tabPage2";this.tabPage2.Padding=newSystem.Windows.Forms.Padding(3);this.tabPage2.Size=newSystem.Drawing.Size(245,217);this.tabPage2.TabIndex=1;this.tabPage2.Text="tabPage2";this.tabPage2.UseVisualStyleBackColor=true;////Form1//this.AutoScaleDimensions=newSystem.Drawing.SizeF(6F,13F);this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;this.ClientSize=newSystem.Drawing.Size(292,266);this.Controls.Add(this.tabControl1);this.Name="Form1";this.Text="Form1";this.tabControl1.ResumeLayout(false);这个.ResumeLayout(false);}#endregionprivateSystem.Windows.Forms.TabControltabControl1;私有System.Windows.Forms.TabPagetabPage1;私人System.Windows.Forms.TabPagetabPage2;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
