c# - 3D View 中的 WPF 2D 动画 : Performance issue

标签 c# wpf performance animation rendering

我在 3D 面板 ( Planerator ) 中放置了一个 TextBlock 并使用了一个 Storyboard 来制作它的动画。 (作为抓取文本)

当视野为 1 时一切正常,但如果我将视野设置为超过 50,帧速率将急剧下降并且渲染会不稳定。

我使用了CompositionTarget.rendering

请看下面的图片:

enter image description here

enter image description here

我需要在 3d View 中以良好的性能制作 2D 动画。

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

更新 1:

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

这是 a sample project .

更新 2:

这是 sample project根据 cokeman19 的回答更新版本。 (性能提升~10帧,但我需要完美渲染)

更新 3:

最后,在cokeman19的回答和this page的内容的帮助下,我得到了一个可以接受的表现。 .

最佳答案

我不确定它是否只是示例应用程序的副产品,但在 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 };

BackMateriallogical 子级的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,然后它变得几乎 视觉上难以察觉。这当然也对内存有影响。

关于c# - 3D View 中的 WPF 2D 动画 : Performance issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35830321/

相关文章:

c# - 如何将实例化的对象传递给相机

c# - 在 C# 中重命名 Excel 工作表名称

c# - 如何在WPF或.net Winform程序中嵌入外部程序?

wpf - 如何通过仅单击用户控件中的一个按钮来更新框架的 Source 属性?

c# - WPF 是否仍然相关,我可以在我的 C# Windows 应用程序中使用它吗?

c - "more threads"是否意味着更快的速度?

c# - 用图表表示历史

c# - 向下转换泛型参数时如何修复转换错误

javascript - 微调性能时,多次调用 JavaScript 方法的最佳方式是什么?

java - 创建返回类型的静态实例变量