DirectWrite无限长字符串性能



在DirectWrite指南和示例中,我只找到了创建布局和渲染相对较小字符串(即字符数不多(的解决方案。

目前我知道性能最好的方法是创建和缓存IDWriteTextLayout,并使用ID2D1DeviceContext::DrawTextLayout绘制它。只有当显示文本需要更新时,才需要重新创建布局:当更改字体大小、系列、文本字符串本身等时。

这种方法适用于少于50000个字符的字符串,但从这里开始,fps会显著下降。但是我想要超过50K个字符,例如,我想要50M个字符。在我的电脑上,ID2D1DeviceContext::DrawTextLayout绘制55000个字符串大约需要23ms,这意味着结果fps(还有其他ui元素(将小于1000/23=43fps。

例如,在经典的notepad.exe中,当我在10000 000个字符的文本中输入一些字符,并且所有字符都以60fps渲染时,如何没有延迟?也许我需要在块上分离字符串,并绘制单独的但显示为一个字符串?我目前几乎无法想象如何处理一个字符串的结束位置和另一个字符串开始的位置。

我不认为布局对象是专门为此而设计的。我认为它是一个DrawText((的替代品,具有更高级的配置选项。如果您想要文本编辑器级别的复杂性,则必须自己实现布局逻辑。您可以使用较低级别的整形功能(GetGlyphs/GetGlyphPlacements(,应用换行、双向逻辑等。然后,您可以优化和渲染可见部分,而无需更新所有内容。

记事本示例虽然有效,但也要简单得多,它只支持单一字体,不支持格式化选项。尽管如此,我相信它并没有那么天真,也不会在不必要的时候重塑。

相关内容

  • 没有找到相关文章

最新更新