我在 3D 面板 ( Planerator ) 中放置了一个 TextBlock
并使用了一个 Storyboard
来制作它的动画。 (作为抓取文本)
当视野为 1 时一切正常,但如果我将视野设置为超过 50,帧速率将急剧下降并且渲染会不稳定。
我使用了CompositionTarget.rendering
。
请看下面的图片:
我需要在 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 };
BackMaterial
是logical 子级的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/