3D 视图动画中的 WPF 2D:性能问题
WPF 2D in 3D view Animations : Performance issue
我在 3D 面板 (Planerator) 中放置了一个 TextBlock
,并使用 Storyboard
对其进行动画处理。 (作为抓取文本)
当视野为1时一切正常,但是如果我将视野设置为50以上,帧率会急剧下降并且渲染会不稳定。
我用了CompositionTarget.rendering
.
请看以下图片:
我需要在 3d 视图中以良好的性能制作 2D 动画。
请告诉我如何解决这个问题?我应该离开 WPF 并转到 DirectX 吗?
更新 1:
我只想移动 ONE 3D 中的 2D 文本 space,但性能很差。(渲染不流畅,断断续续)
更新 2:
这是基于 cokeman19 的回答的 sample project 更新版本。 (性能提升~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 };
BackMaterial
是 逻辑 child 的 VisualBrush
包装器,不属于可视化树,因此渲染在这里似乎没有意义。此外,逻辑 child(LayoutInvalidationCatcher
class)反过来又是 visual child 的包装器,它已经是在设置 frontModel.Visual
.
中呈现(使用 _logicalChild
)
删除创建和设置 BackMaterial
的代码可将 FPS 提高到 ~55。
此外,如果这是一个选项,设置以下设置可使 FPS 恢复到 60,而质量没有明显下降。
RenderOptions.SetEdgeMode(_viewport3d, EdgeMode.Aliased);
更新:
我能够获得的唯一其他收获是将 CacheMode
设置为 BitmapCache
,这可能不适用于您的需要。
frontModel.CacheMode = new BitmapCache(20) { EnableClearType = false };
即使在我最慢的机器上,这也允许最大 FPS,但也有一些缺点。因为文本元素上的缩放级别非常高,而且这种技术创建了一张图片以在动画中使用(而不是为 UIElement 本身设置动画),所以我不得不将缩放级别设置为 20,然后它变得几乎 视觉上无法察觉。这当然也会影响记忆。
我在 3D 面板 (Planerator) 中放置了一个 TextBlock
,并使用 Storyboard
对其进行动画处理。 (作为抓取文本)
当视野为1时一切正常,但是如果我将视野设置为50以上,帧率会急剧下降并且渲染会不稳定。
我用了CompositionTarget.rendering
.
请看以下图片:
我需要在 3d 视图中以良好的性能制作 2D 动画。
请告诉我如何解决这个问题?我应该离开 WPF 并转到 DirectX 吗?
更新 1:
我只想移动 ONE 3D 中的 2D 文本 space,但性能很差。(渲染不流畅,断断续续)
更新 2:
这是基于 cokeman19 的回答的 sample project 更新版本。 (性能提升~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 };
BackMaterial
是 逻辑 child 的 VisualBrush
包装器,不属于可视化树,因此渲染在这里似乎没有意义。此外,逻辑 child(LayoutInvalidationCatcher
class)反过来又是 visual child 的包装器,它已经是在设置 frontModel.Visual
.
_logicalChild
)
删除创建和设置 BackMaterial
的代码可将 FPS 提高到 ~55。
此外,如果这是一个选项,设置以下设置可使 FPS 恢复到 60,而质量没有明显下降。
RenderOptions.SetEdgeMode(_viewport3d, EdgeMode.Aliased);
更新:
我能够获得的唯一其他收获是将 CacheMode
设置为 BitmapCache
,这可能不适用于您的需要。
frontModel.CacheMode = new BitmapCache(20) { EnableClearType = false };
即使在我最慢的机器上,这也允许最大 FPS,但也有一些缺点。因为文本元素上的缩放级别非常高,而且这种技术创建了一张图片以在动画中使用(而不是为 UIElement 本身设置动画),所以我不得不将缩放级别设置为 20,然后它变得几乎 视觉上无法察觉。这当然也会影响记忆。