有没有人知道一些可靠(而且希望是全面的)关于 GDI+ 性能讨论的书籍/网站(除了显而易见的内容)?
例如,我最近看到了 这个优秀的实验。我也最近注意到 Graphics.FillPath()
比 Graphics.DrawPath()
快得多。我很想知道还有哪些重要的信息我错过了。
祝好, 大卫
有没有人知道一些可靠(而且希望是全面的)关于 GDI+ 性能讨论的书籍/网站(除了显而易见的内容)?
例如,我最近看到了 这个优秀的实验。我也最近注意到 Graphics.FillPath()
比 Graphics.DrawPath()
快得多。我很想知道还有哪些重要的信息我错过了。
祝好, 大卫
嗯。如果你需要画路径的轮廓,那么知道FillPath比DrawPath更快是没有意义的!
优化GDI+的最佳方法与优化任何其他代码的方法完全相同:首先不要优化它。而是:
完成所有这些事情后,您可以开始寻找有关优化渲染的书籍。当然,如果仍然太慢。运行分析器以找出渲染中最慢的部分。
在您认为可能能够获得收益的地方,尝试以不同的方式渲染物体(例如,Graphics.Clear() 很可能比使用 FillRectangle() 填充背景更快),或者不同的渲染顺序(首先绘制所有颜色相同的东西,以防状态更改花费时间 - 用现代图形卡通常很重要。单次调用绘制多个多边形通常比进行多个单多边形调用更快,因此您是否可以将所有多边形累积到延迟渲染缓冲区中,然后在渲染传递的结束时提交它们?)
之后,您可能不得不考虑使用 GDI 或 DirectX,以更接近硬件。
这可能不是您要找的答案,但请考虑完全不使用GDI+。最近我不得不重写2D-CAM应用程序的渲染堆栈,最重要的要求是快速获得良好的抗锯齿线(抗锯齿是促使我们重写现有的GDI渲染器的原因)。
下面是200个项目的渲染结果(每个项目本身都包含一些线条和小的填充形状标记)。这些是帧速率(在Windows 7 上),因此数字越高越好:
200个项目: GDI=51,GDI+=20,D2D=59,WPF=33,GL=59。
(D2D是Direct2D,GL是OpenGL)。你已经可以看到GDI+落后了。WPF可能在保留模式API方面有些劣势,但是OpenGL也是双缓冲的,看起来同样平滑。
在1000个项目时,差异更加明显:
GDI=23,GDI+=5,D2D=17,WPF=2,GL=40。
没错,WPF现在只有2帧每秒,而GDI+每秒只能爬行5次。所以请考虑D2D,或者简单地回到OpenGL。这就是我们现在正在使用的,重写3个月后,我认为我们做出了正确的选择。编程模型本身比D2D要干净得多。
请注意,我们使用的WPF渲染已经高度优化;没有回调,没有事件,没有绑定。我们只需获取DrawingContext并在每个帧上使用最低级别的原语将所有内容绘制在其上,因此没有事件开销。
如果您有兴趣,请告诉我,我可以向您发送我使用的测试套件,以便您可以自己尝试。
(我可能要避免GDI+的一个原因是它不太可能被硬件加速)。