3D视图中的WPF 2D动画:性能问题

时间:2016-03-06 17:51:37

标签: c# wpf performance animation rendering

我已将app.config(['$httpProvider', function ($httpProvider) { $httpProvider.defaults.useXDomain = false; $httpProvider.defaults.withCredentials = false; delete $httpProvider.defaults.headers.common['X-Requested-With']; }]); 放入3D面板(Planerator),并使用TextBlock为其设置动画。 (作为抓取文本)

当视野为1时,一切正常,但如果我将视野设置为50以上,帧速率将急剧下降,渲染将会波动。

我使用了Storyboard

请参阅以下图片:

enter image description here

enter image description here

我需要在3d视图中使用2D动画并获得良好的性能。

请告诉我如何解决这个问题?我应该离开WPF并转到DirectX吗?

更新1:

我只想在3D空间中移动 ONE 2Dtext,但性能很差。(渲染不顺畅,不稳定)

这是a sample project

更新2:

这是基于cokeman19答案的sample project更新版本。 (性能已提高~10帧,但我需要完美渲染)

更新3:

最后,在cokeman19的答案和this page的内容的帮助下,我获得了可接受的表现。

1 个答案:

答案 0 :(得分:3)

我不确定它是否只是示例应用的副产品,但在Planerator.CreateVisualChild()下,似乎没有必要设置GeometryModel3D.BackMaterial 。供参考:

VisualBrush vb = new VisualBrush(_logicalChild);
SetCachingForObject(vb);  // big perf wins by caching!!
Material backMaterial = new DiffuseMaterial(vb);
...
GeometryModel3D backModel = new GeometryModel3D() { ..., BackMaterial = backMaterial };

BackMaterial逻辑子项周围的VisualBrush包装器,它不属于可视化树,因此渲染似乎并不存在在这里有意义。此外,逻辑子(LayoutInvalidationCatcher类)又是 visual 子项的包装器,它已在设置_logicalChild时呈现(使用frontModel.Visual) }。

删除用于创建和设置BackMaterial的代码会使FPS达到~55。

此外,如果它是一个选项,设置以下内容可使FPS恢复到60,质量没有明显下降。

RenderOptions.SetEdgeMode(_viewport3d, EdgeMode.Aliased);

更新

我能够做的唯一其他收获是将CacheMode设置为BitmapCache,这可能无法满足您的需求。

frontModel.CacheMode = new BitmapCache(20) { EnableClearType = false };

即使在我最慢的机器上,这也允许最大的FPS,但是存在一些缺点。因为文本元素上的缩放级别如此之高,并且这种技术创建了一个在动画中使用的图片(而不是动画UIElement本身),所以我必须将比例级别设置为20才能几乎