WPF性能与文本

时间:2015-03-12 09:22:35

标签: c# wpf viewport3d

我正在使用Viewport3D创建一个WPF应用程序,并且在视口内部我有网格文本。每个网格的文本都不同。 (这意味着我可以为常规网格物体提供单一参考,但对于文本,我每次都需要创建不同的材质。) 我也冻结了所有常规网格,因为它们是静态的。

但是我可以用我想要的SolidColorBrush创建任意数量的网格,并且性能保持稳定。 (我已经尝试过大约700 - 800个网格)

但是,如果我实现文本网格,性能会急剧下降。例如,当我有大约200个常规网格和200个文本网格时,性能非常糟糕。

我尝试过两种不同的方式来渲染文字;   - 我尝试将文本渲染为Viewport2DVisual3D。 (但我认为这是一种可怕的方式,因为在我之前的例子中,它意味着Viewport3D本身还有200个视口。)   - 我尝试将文本渲染为GeometryModel3D,因此创建与常规画笔相同。但是,该材质由VisualBrush而不是SolidColorBrush组成。 (这确实提升了性能,但仍然不完美)

有没有人有解决方案来进一步提高渲染文字的性能,以便我可以渲染更多?

(我已经在以下网站上遵循了大部分性能指南: https://msdn.microsoft.com/en-us/library/bb613553%28v=vs.110%29.aspx

@edit: 我发现如果我使用visualbrush执行以下操作:

VisualBrush v = new VisualBrush(Text.createCubeStackText(text1));
RenderOptions.SetCachingHint(v, CachingHint.Cache);
viewport.Material = new DiffuseMaterial(v);

它真的提高了性能。我试过了,现在可以渲染700个常规网格和300个文本网格而不会出现任何性能问题。性能开始下降,包含550个文本网格和550个常规网格。

我仍然会喜欢任何其他建议。

1 个答案:

答案 0 :(得分:1)

由于渲染文本所需的细分,3D中的文本可能会非常慢。您可能需要考虑:

  1. 通过用画布覆盖3DViewport来移除文本的3D渲染,并计算文本的正确位置并将文本渲染为2D叠加层。您甚至可以根据文本位置

  2. 的Z值更改字体大小
  3. 将文本渲染为(透明)位图,并将文本作为纹理添加到3D场景中的广告牌

  4. 使用IsHitTestVisible=false点击叠加层并使用以下内容将文字的3D位置投影到画布:Projecting a 3D point to a 2D screen coordinate