【发布时间】:2010-12-14 00:12:40
【问题描述】:
是否有人知道任何可靠的(并且希望是广泛的)书籍/网站讨论 GDI+ 性能(超出显而易见的范围)?
例如,我最近遇到了this excellent experiment。我最近还注意到Graphics.FillPath() 比Graphics.DrawPath() 快得多。我很想知道我还遗漏了哪些其他重要信息。
善意, 大卫
【问题讨论】:
标签: .net performance gdi system.drawing
是否有人知道任何可靠的(并且希望是广泛的)书籍/网站讨论 GDI+ 性能(超出显而易见的范围)?
例如,我最近遇到了this excellent experiment。我最近还注意到Graphics.FillPath() 比Graphics.DrawPath() 快得多。我很想知道我还遗漏了哪些其他重要信息。
善意, 大卫
【问题讨论】:
标签: .net performance gdi system.drawing
嗯。如果您需要绘制路径的轮廓,知道 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 FPS,而 GDI+ 正在以 5 FPS 爬行。所以考虑D2D,或者干脆回到OpenGL。这就是我们现在使用的,并且在重写 3 个月后,我认为我们做出了正确的选择。编程模型本身比 D2D 看起来要干净得多。
请注意,我们使用的 WPF 渲染是高度优化的;没有回调,没有事件,没有绑定。我们只是得到一个 DrawingContext 并使用最低级别的图元在每一帧上绘制所有内容,因此没有事件开销。
如果您有兴趣,请告诉我,我可以将我使用的测试套件发送给您,以便您随意摆弄。
(我可能会避开 GDI+ 的一个原因是它不太可能被硬件加速)。
【讨论】: