Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 强制硬件加速_.net_Wpf_Graphics - Fatal编程技术网

.net 强制硬件加速

.net 强制硬件加速,.net,wpf,graphics,.net,Wpf,Graphics,我刚刚做了一个基准测试,在测试中,我继续向画布添加多边形,并让调度员在每次通过时随机更新每个多边形的位置。我一直这样做,直到我测量到一个低于30帧的帧。我注意到,基准测试似乎没有使用GPU。我有rendercapability 2,但在使用avalon.graphics注册表启动硬件加速时,我得到了相同的结果。在我看来,即使我有rendercapability 2和一个好的GPU,wpf仍然选择软件渲染,用于带有canvas容器的ItemsControl和带有多边形作为子对象的observabl

我刚刚做了一个基准测试,在测试中,我继续向画布添加多边形,并让调度员在每次通过时随机更新每个多边形的位置。我一直这样做,直到我测量到一个低于30帧的帧。我注意到,基准测试似乎没有使用GPU。我有rendercapability 2,但在使用avalon.graphics注册表启动硬件加速时,我得到了相同的结果。在我看来,即使我有rendercapability 2和一个好的GPU,wpf仍然选择软件渲染,用于带有canvas容器的ItemsControl和带有多边形作为子对象的observablecollection。(在低于30fps之前,我添加了大约3500个多边形)。有什么我不明白的吗?我是否必须使用其他形状或渲染循环来利用图形硬件?

您应该使用探查器来确定,但我怀疑您的大部分开销是填充矢量图形缓冲区的代码,而不是实际的光栅化(硬件帮助的部分)如果不尝试移动多边形,而只是继续添加新的多边形,您可能会更好地了解光栅化开销

也就是说,使用ItemsControl可能会遇到另一个问题。即使容器是画布,多边形对象也不会直接添加到画布。ItemsControl会创建一个容器对象来承载每个多边形,并将该容器对象添加到画布中。这意味着您有另一层对象参与测量/排列/渲染过程

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


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

啊,我明白了!非常感谢,我将进一步调查此事。您知道有一个itemscollection并跳过为每个元素添加的额外容器吗?我只想添加多边形本身。或者,不使用wpf控件,以更明确的方式添加它们。这确实是一种改进,现在我的原始对象渲染速度要快得多。我在WPF渲染管道中遇到的另一个问题是,我在向ObservableCollection使用AddRange的同时添加了大量对象,但是在添加这些对象时,以及在删除/添加单个对象时,仍然存在很大的冻结延迟,您是否经历过这种情况?我的所有对象也不是多边形,而是由线条、多边形、文本等组成的更复杂的对象。默认的ObservableCollection不能很好地处理AddRange;VSSDK中有一个,但它不是标准BCL的一部分。最简单的选择可能是替换整个集合,并在集合属性上引发已更改的属性,而不是使用ObservableCollection。ObservableCollection最适合用于相对较小的集合。好吧,每次替换整个集合并提升notifypropertychanged似乎太消耗了。它可以包含从20到400个需要渲染的对象。我在observablecollection中看到的问题是同时添加20-30个对象。这似乎锁定了我的ui线程。多边形的东西真的有助于清理东西,以及试图修剪视觉树