有没有人知道讨论GDI +性能的任何可靠的(有希望的,广泛的)书籍/网站(超出明显的范围)?
例如,我最近遇到了this excellent experiment。我最近也注意到Graphics.FillPath()
比Graphics.DrawPath()
更快。我很想知道我缺少的其他重要信息。
好感, 大卫
答案 0 :(得分:19)
嗯。如果您需要绘制路径的轮廓,那么知道FillPath比DrawPath更快是没有收获的!
优化GDI +的最佳方法与任何其他代码完全相同:首先,不要优化它。代替:
完成所有这些操作后,您就可以开始寻找有关优化渲染的书籍了。如果它仍然太慢,当然。运行探查器以找出渲染的哪些部分最慢。
你认为你可以获得收益的地方,尝试不同的渲染方式(例如,Graphics.Clear()可能比用FillRectangle()填充背景要快得多,或者不同的渲染顺序(绘制)首先是一种颜色的所有东西,如果状态变化花费你的时间 - 现代图形卡的批处理操作通常非常重要。绘制多个多边形的单个调用通常比进行多个单多边形调用更快,所以你可以积累所有你的多边形到一个延迟渲染缓冲区,然后在渲染过程结束时全部提交它们吗?)
之后,您可能需要考虑使用GDI或DirectX来更接近硬件。
答案 1 :(得分:10)
这可能不是您正在寻找的答案,但考虑根本不使用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 FPS,GDI +正以5 FPS的速度爬行。所以考虑D2D,或者简单地回到OpenGL。这就是我们现在使用的和重写3个月后,我认为我们做出了正确的选择。编程模型本身比D2D看起来要干净得多。
请注意,我们正在使用的WPF渲染是高度优化的;没有回调,没有事件,没有约束力。我们只使用最低级别的原语获取DrawingContext并在每个帧上绘制所有内容,因此没有事件开销。
如果您有兴趣,请告诉我,我可以寄给您使用的测试套件,这样您就可以摆弄它。
(我可能避开GDI +的一个原因是它不太可能是硬件加速)。