【问题标题】:Why does the Tahoma font render faster than Arial in WPF?为什么 Tahoma 字体在 WPF 中的渲染速度比 Arial 快?
【发布时间】:2015-06-19 00:20:05
【问题描述】:

我在一个成熟的应用程序中遇到了这种现象,我在 WPF 中的 Tahoma 字体比 Arial 快得多。

我构建了一个测试应用程序来验证我所看到的。

测试应用程序有一个带有多个 TabItem 的 TabControl。每个选项卡都包含一个 DataGrid 控件并填充有 18 列。网格/列都数据绑定到同一个视图模型。选项卡之间的唯一区别是使用的字体。有 1000 行。 TextBlock 的大小固定为相同的大小。

当我尝试拖动垂直滚动条手柄并垂直滚动时,Tahoma 和 Arial 选项卡之间的性能差异很大。您知道滚动条手柄在绘图赶上时如何落后于鼠标所在的位置,并且每次绘制完屏幕时,它都会立即意识到您已经滚动了整个屏幕或更远,所以它完全必须重新绘制?对于 Tahoma,这种情况发生得非常快,“滴答滴答滴答”。无论如何,它都不是平滑滚动,但它是可用的。使用 Arial,它更像是“滴答…………滴答…………滴答…………滴答”。非常明显的区别。我会说每个“tick”需要大约 2-3 倍的时间。

我使用过 TextOptions.TextFormattingMode、TextOptions.TextRenderingMode 和 Typography.NumeralAlignment,但性能差异仍然存在。

任何想法为什么会发生这种情况,更重要的是,是否有任何相关设置可以缓解这种差异?

【问题讨论】:

  • 请发布重现此问题所需的代码。否则您的问题可能会被关闭。
  • 这样内联发布的代码量很大。无论如何,我不清楚这如何增加问题?请解释一下?
  • 我们需要确认问题确实是您所说的,而不是像您破坏 UI 虚拟化这样的其他问题。
  • 如果我要破坏虚拟化,它会在两个方面都被破坏,而不仅仅是一个。从字面上看,only 的区别在于两个选项卡之间的字体。

标签: wpf fonts wpfdatagrid


【解决方案1】:

我不是字体或 WPF 专家,但我发现了一个 hack-a-round 可以加速字体并可能会导致某人获得更好的答案。减速是由于字体构造和 WPF 渲染之间的交互超出了我的深度。我的猜测是微软并没有为所有字体结构优化 WPF,但或者可能某些字体创建软件没有优化它生成的字体。

我发现 一些 字体使用 OpenType 样式表很慢,而这些相同的字体使用 TrueType 样式表却很快。请注意,OpenType 容器 (.otf) 和 TrueType 容器 (.ttf) 的文件扩展名不会告诉您里面是什么类型的表格,因为这两个容器都支持两种表格样式(请阅读 FontForge documentation 中的“什么是 OpenType?”) .

可以通过在字体编辑工具中打开它们并使用 TrueType 表将它们导出来“修复”慢速字体。这并不总是完美的。乍一看,它看起来非常适合 Open Sans,但打破了 Roboto 的字距调整。我收到的错误消息似乎表明所需的表大小大于 TrueType 表支持的大小。

如果您想使用免费的 FontForge 应用程序复制我的结果,我的程序是:

1) 打开慢速字体(例如 Arial、Roboto、Open Sans)

2)元素>字体信息>重命名字体以区分慢字体

3)文件>生成字体>选择TrueType格式,选项>取消选择“OpenType”

4) 测试“固定”字体。我发现快/慢差异在任何条件下都是可重复的:使用 DrawText 或 TextBlock 等几种不同的方式测量渲染时间。 this question 中给出了一种测量渲染时间的方法。

【讨论】:

  • 这是一个非常有用且内容丰富的答案。我希望有更多知识的人可以通过更多信息对此进行扩展。
【解决方案2】:

我这里有一个例子...似乎追踪到测量而不是简单的渲染...Bad Font-Measuring Performance under Windows 8.1

【讨论】:

  • 郑重声明,如果您想出一个答案,我仍然对这个问题的答案感兴趣。
猜你喜欢
  • 2023-03-03
  • 2012-01-09
  • 2011-07-06
  • 2011-05-05
  • 2012-01-30
  • 2010-11-06
  • 2011-10-04
  • 1970-01-01
相关资源
最近更新 更多