2D绘图性能(GDI + vs SlimDX)

CBe*_*ent 8 c# wpf gdi+ slimdx

我是一个团队的一员,该团队创建了一个工具来查看C#/ WPF中非常大且互连的图形并与之交互.查看图形并与图形交互是通过一个自定义控件完成的,该控件接受一组DrawingVisual并在画布上显示它们.图中的节点可能具有使用我们的编辑器创建的自定义形状.当前的控制工作非常好,并且与我们的程序相当,但在考虑更大的图形(20,000多个节点和大量连接)时,存在对性能的合理担忧.

经过一些研究后,似乎有两种方法:

  • 一种GDI +路线,其中图形被绘制到WriteableBitmap或InteropBitmap.
  • SlimDX或DirectX变体(托管在D3DImage中)


鉴于这两种极为不同的方法,哪种方法最好考虑:

  • 即使在查看整个图形时,与图形的交互也必须快速.
  • 更新视觉效果应该很快(颜色或尺寸更改)
  • 命中测试必须快速(点和矩形).
  • 发展必须及时完成.

你会使用哪种方法?为什么?

编辑:
看起来类似的问题被问到但没有回答.

Igo*_*ejc 8

我使用GDI作为我的制图应用程序.虽然GDI +比DirectX慢,但我发现有很多东西和技巧可以用来加快速度.在绘制数据之前,大量的CPU用于准备数据,因此GDI不应该是那里唯一的瓶颈.

需要注意的事项(这些通用也适用于其他图形引擎):

  1. 首先:衡量.使用分析器查看代码中的真正瓶颈.
  2. 重用GDI原语.这很重要.如果你有绘制100000名图形对象看起来相同或相似,使用相同的Pen,Brush等创建这些原语是昂贵的.
  3. 缓存渲染数据 - 例如:如果不需要,请不要重新计算gfx元素位置.
  4. 平移/缩放时,绘制具有较低GDI +质量的场景(并且没有昂贵的GDI操作).有许多Graphics对象设置可以降低质量.用户停止平移后,以高质量绘制场景.
  5. 很多很多小东西可以提高性能.我已经开发了这个应用程序2 - 3年(或者它已经4个嗯?)现在我仍然想方设法改进:).这就是分析很重要的原因 - 代码更改会影响性能,因此您需要分析新代码.

另一件事:我没有使用过SlimDX,但我确实尝试过Direct2D(我指的是Microsoft.WindowsAPICodePack.DirectX.Direct2D1).在我的情况下,性能比GDI +快得多,但我在渲染位图方面遇到了一些问题,而且没有时间找到合适的解决方案.


Ani*_*Ani 1

让我尝试列出每种方法的优缺点 - 这也许会让您对使用哪种方法有所了解。

GDI 优点

  • 易于绘制矢量形状
  • 无需包含额外的库

GDI 缺点

  • 比DX慢
  • 需要限制“花哨”的绘图(渐变等),否则可能会减慢速度
  • 如果图表需要交互 - 可能不是一个很好的选择

SlimDX 优点

  • 可以做一些奇特的绘图,同时比 GDI 更快
  • 如果绘图是交互式的 - 这种方法会更好
  • 由于您绘制了基元,因此您可以控制每个缩放级别的质量

SlimDX 缺点

  • 绘制简单形状并不容易 - 您需要编写自己的抽象或使用帮助您绘制形状的库
  • 使用 GDI 并不那么简单,尤其是如果您以前没有使用过它的话

也许还有更多我忘记放在这里,但也许这些对初学者有用?

-A。