WPF文本性能问题

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

@编辑: 我发现如果我对VisualBrush进行以下操作:

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

它真的大大提高了性能。我已经尝试过,现在可以渲染700个常规网格和300个文本网格而没有任何性能问题。当550个文本网格和550个常规网格时,性能开始下降。
(我仍然希望有其他建议。)

1
你尝试过冻结你的画笔吗? - Tomtom
是的,那是我尝试的第一件事。 - Revils
侧注:不要比较网格数量,要比较三角形数量。 3D文字由许多许多三角形组成。 - Emond
啊是的,那是个好观点。我的应用程序由立方体组成,因此有12个三角形。我的文本是Visualbrush打印在geometrymodel3d上,因此只有两个三角形。每个文本。 - Revils
1个回答

1
3D文本由于需要平滑处理而变得非常缓慢。您可能想考虑以下几点:
  1. 通过覆盖3D视口并使用画布计算文本的适当位置,并将文本呈现为2D叠加物,从而去除文本的三维渲染。您甚至可以根据文本位置的Z值更改字体大小。
  2. 将文本呈现为(透明的)位图,并将文本作为纹理添加到三维场景中的广告牌上。
使用IsHitTestVisible=false可以点击穿透叠加物,并通过这种方式将文本的3D位置投影到画布上:将3D点投影到2D屏幕坐标

在我将文本实现为网格之前,我考虑了您的第一个建议。但是,我如何计算相对于视口内的3D位置的移动?(如果我滚动视口,则3D中的网格必须以2D标签的相同相对量移动)此外,当我想要单击或滚动网格时,2D文本位于其前面时,如何进行命中测试?这会起作用吗? - Revils
您可以关闭覆盖层的命中测试,以便您可以进行点击穿透。为了使覆盖层与3D投影保持同步,您需要将3D位置投影到覆盖层上(这只是根据相机应用投影变换)。 - Emond
问题在于我需要应用程序功能的命中测试。 - Revils
@Sliver2009 - 我在我的回答中添加了一些关于你的评论的细节。 - Emond
@Sliver2009 - 你可以仅针对标签禁用命中测试。 - Emond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接