.net GDI+;表演技巧

.net GDI+;表演技巧,.net,performance,gdi,system.drawing,.net,Performance,Gdi,System.drawing,是否有人知道任何可靠(希望是广泛的)讨论GDI+性能的书籍/网站(除了显而易见的内容) 例如,我最近遇到过。我最近还注意到Graphics.FillPath()比Graphics.DrawPath()快得多。我想知道我还遗漏了哪些重要的信息 善意,, DavidHmmm。如果需要绘制路径的轮廓,那么知道FillPath比DrawPath快是没有好处的 优化GDI+的最佳方法与其他代码完全相同:首先,不要优化它。相反: 开始写它,让它简单地工作,然后决定它是否真的太慢了 然后检查您的“算法”:

是否有人知道任何可靠(希望是广泛的)讨论GDI+性能的书籍/网站(除了显而易见的内容)

例如,我最近遇到过。我最近还注意到
Graphics.FillPath()
Graphics.DrawPath()快得多。我想知道我还遗漏了哪些重要的信息

善意,,
David

Hmmm。如果需要绘制路径的轮廓,那么知道FillPath比DrawPath快是没有好处的

优化GDI+的最佳方法与其他代码完全相同:首先,不要优化它。相反:

  • 开始写它,让它简单地工作,然后决定它是否真的太慢了
  • 然后检查您的“算法”:
    • 简化你正在绘制的东西(减少你正在绘制的东西的数量),它会变得更快(在大多数情况下,由于减少了混乱,看起来会更好)
    • 您是每次都绘制整个显示,还是使用剪辑矩形来避免绘制不需要更新的图像部分
    • 检查你如何画东西。您是否为每次重画创建和销毁资源(如画笔和钢笔)?将它们缓存在成员变量中。您是否多次过度绘制同一像素?(例如,绘制背景,然后在顶部绘制位图,然后在其顶部绘制矩形-也许您可以避免某些重画)。当只有10个线段看起来足够好时,是否使用100个多边形线段绘制曲线?当窗口滚动时,您是让操作系统移动现有图像以便只需重新绘制新曝光的条带,还是浪费时间重新绘制整个窗口
    • 您是在使用转换还是在代码中进行冗长的定位计算
    • 检查任何循环,确保尽可能多地从循环中移出代码-预先计算循环中使用的值,等等。确保循环尽可能以cpu缓存友好的方向/方式在数据上迭代
    • 在重画期间,您的数据中是否有您正在处理的内容?也许其中的一些可以预先计算或以一种更理想的形式组织起来。e、 g.不同类型的列表是否可以更快地枚举您的数据?您是否正在处理1000个数据项以找到需要绘制的10个数据项
    • 你能用不同的方法获得相同的外观吗?e、 你可以用黑白交替的方式画出64个方块来画一个棋盘。绘制32个黑色方块和32个白色方块可能会更快,这样可以避免矩形之间的状态更改。但实际上,您可以使用白色背景、4个黑色矩形和4个XOR矩形(8个矩形而不是64=>更快的算法)来绘制它
  • 图像中是否有不经常改变的部分?尝试将它们缓存在屏幕外位图中,以最大限度地减少每次重画时必须“重建”的量。请记住,您仍然可以渲染屏幕外位图,然后在其上分层图形原语,因此您可能会发现比您意识到的更多的“静态”图像区域
  • 您正在渲染位图图像吗?尝试将它们转换为屏幕的像素格式,并将它们缓存在“本机”形式中,而不是每次绘制它们时让GDI+转换它们
  • 如果您对以较低的质量换取更快的渲染感到满意,请关闭质量设置
完成所有这些工作后,您可以开始查找有关优化渲染的书籍。当然,如果它仍然太慢的话。运行探查器以找出渲染的哪些部分最慢

如果您认为可以获得收益,请尝试不同的渲染方式(例如,Graphics.Clear()可能比使用FillRectangle()填充背景快得多),或者尝试不同的渲染顺序(首先绘制一种颜色的所有内容,以防状态更改会耗费您的时间-批处理操作对于现代图形卡通常非常重要。绘制多个多边形的单个调用通常比进行多个单个多边形调用更快,因此您可以将所有多边形累积到延迟渲染缓冲区中,然后提交它们。)l在你的渲染过程结束时?)


在此之后,您可能需要使用GDI或DirectX来接近硬件。

< P>这可能不是您正在寻找的答案,但考虑到根本不使用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+的一个原因是它是联合国的。)