强制硬件加速

时间:2016-04-07 19:34:02

标签: .net wpf graphics

我刚做了一个基准测试,我继续在画布上添加多边形并使用dispatchertimer每次传递随机更新每个多边形位置。我做到了这一点,直到我测量了低于30fps的fps。我注意到了一些东西,基准测试似乎没有使用GPU。我有rendercapability 2,但是当使用avalon.graphics注册表转换硬件加速时,我得到相同的结果。对我来说,这似乎即使我有渲染能力2和良好的GPU,wpf仍然选择带有画布容器的ItemsControl和带有多边形作为子节点的observablecollection的软件渲染。 (在低于30fps之前,我得到了大约3500个多边形)。有什么我不懂的东西吗?我是否必须使用其他形状或渲染循环来利用图形硬件?

1 个答案:

答案 0 :(得分:0)

您应该检查一个分析器以确定,但我怀疑您的大部分开销是在填充矢量图形缓冲区的代码中,而不是实际的光栅化(硬件帮助的部分。)您可能会更好如果你不尝试移动多边形,那么光栅化开销的想法,而只是不断添加新的多边形。

也就是说,使用ItemsControl可能会遇到另一个问题。即使容器是Canvas,Polygon对象也不会直接添加到Canvas中。 ItemsControl改为创建一个容器对象来托管每个Polygon,并将该容器对象添加到Canvas。这意味着您有另一层参与度量/排列/渲染过程的对象。

此外,Polygon类实际上是一个UIControl,它是一个相对“重”的类。特别是,它允许UI交互,其具有涉及鼠标事件,焦点,当然还有整个通用DependencyObject基础结构的大量基础结构。它不是执行大量元素渲染的好选择。

如果你想这样做,那么创建你自己的UIElement / FrameworkElement派生并在OnRender覆盖中执行所有多边形的渲染可能是个好主意。这允许您直接绘制DrawingContext,绕过上述所有重型机械。您仍然可以使用View / ViewModel模式,但最终您将在代码而不是XAML中实现View类。