3

我正在创建一个带有 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 v = new VisualBrush(Text.createCubeStackText(text1));
RenderOptions.SetCachingHint(v, CachingHint.Cache);
viewport.Material = new DiffuseMaterial(v);

它确实大大提高了性能。我已经尝试过了,现在可以渲染 700 个常规网格和 300 个文本网格,而不会出现任何性能问题。使用 550 个文本网格和 550 个常规网格时,性能开始下降。

不过,我仍然想要任何其他建议。

4

1 回答 1

1

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

  1. 通过用画布覆盖 3DViewport 来移除文本的 3D 渲染,并计算文本的正确位置并将文本渲染为 2D 覆盖。您甚至可以根据文本位置的 Z 值更改字体大小

  2. 将文本渲染为(透明)位图,并将文本作为纹理添加到 3D 场景中的广告牌

用于IsHitTestVisible=false单击覆盖并将文本的 3D 位置投影到画布上,方法是:将 3D 点投影到 2D 屏幕坐标

于 2015-03-12T10:07:18.603 回答