我刚刚做了一个基准测试,在这个测试中,我继续将多边形添加到画布中,并让调度器在每次通过时随机更新每个多边形的位置。我一直这样做,直到我测得的fps低于30fps。我注意到,基准测试似乎没有使用GPU。我有rendercapability 2,但当使用avalon.graphics注册表打开硬件加速时,我得到了相同的结果。对我来说,这似乎意味着,即使我有rendercapability 2和一个好的GPU,wpf仍然选择软件渲染带有画布容器的ItemsControl和带有多边形的observaleCollection作为子对象。(在低于每秒30帧之前,我添加了大约3500个多边形)。这里有什么我不明白的地方吗?我必须使用其他形状或渲染循环来使用图形硬件吗?
您应该向探查器查询以确定,但我怀疑您的大部分开销是填充矢量图形缓冲区的代码,而不是实际的光栅化(硬件帮助的部分)。如果您不尝试移动多边形,而是不断添加新的多边形,您可能会更好地了解光栅化开销。
也就是说,您可能在使用ItemsControl时遇到另一个问题。即使容器是画布,多边形对象也不会直接添加到画布中。ItemsControl会创建一个容器对象来承载每个多边形,并将该容器对象添加到画布中。这意味着您有另一层对象参与测量/排列/渲染过程。
此外,Polygon类实际上是一个UIControl,它是一个相对"重"的类。特别是,它允许UI交互,其中包含大量用于鼠标事件、焦点的基础设施,当然还有整个通用的DependencyObject基础设施。对于执行大量元素的渲染,这不是一个好的选择。
如果你想这样做,最好创建你自己的UIElement/FrameworkElement衍生物,并在OnRender覆盖中执行所有多边形的渲染。这允许您绕过上述所有重型机械,直接绘制到DrawingContext。您仍然可以使用View/ViewModel模式,但最终将在代码中而不是XAML中实现View类。