【问题标题】:Core Text Performance核心文本性能
【发布时间】:2011-08-29 01:52:30
【问题描述】:

当 Core Text 在原始 iPad 上运行时,我发现它存在一些性能问题。

我使用 Core Text 和基于 OmniGroup 的 OUIEditableFrameUITextInput 协议创建了一个可编辑视图。

当视图中有相当数量的文本(例如 180 行)时,打字/输入会大大滞后,并且点击一个键通常需要 1-2 秒。

使用带有模拟器的仪器,我能够缩小问题范围并找出花费了这么多时间的原因。原来是因为我每次击键都重绘框架,占用这么多时间的是调用CTFramesetterCreateWithAttributedStringCTFramesetterCreateFrame

我必须在每次击键时重绘以更新文本,这意味着调用CTFramesetterCreateWithAttributedStringCTFramesetterCreateFrame

有没有其他人遇到过这个问题,如果有,他们是如何解决的?


编辑:

做了一些进一步的调查,结果发现如果属性字符串没有属性,那么一切都绘制得更快并且没有任何延迟。更改字体、颜色或段落样式都会减慢速度。知道这是否与它有关吗?

【问题讨论】:

    标签: objective-c ios ipad core-text


    【解决方案1】:

    您可能不应该使用CTFramesetter 来创建类似UITextView 的东西。相反,您应该保留一组 CTLine 引用。如果您需要分词方面的帮助,那么您可以使用CTTypeSetter,但您只需要将其放在当前插入符号及以下的行(您仍将创建和销毁排字机,所以请注意您的要求其中)。

    保留CTLines 数组的一个好处是,如果内存不足,您可以丢弃不需要的数组,然后再重新构建它们。只需跟踪每行的字符范围即可。

    【讨论】:

    • 这听起来绝对是一种更有效的方法。互联网上有没有这样的例子,因为我能找到的都是CTFrameSetter
    • 我还没有看到很多 Core Text 的好例子。我已经继续写了我在这里完成的一些工作:robnapier.net/blog/laying-out-text-with-coretext-547。这并不完全相同,但它可能会为您提供一些正确方向的指示。
    【解决方案2】:

    由于我最初的问题,我做了更多调查,发现绘制的字符串具有的属性越多,花费的时间就越长。

    有了这些知识,我决定简单地删除/隐藏用户看不到的任何属性(特别是 kCTForegroundColor),这将绘图速度提高了十倍,并使其成为一种更实用的体验。

    【讨论】:

    • 您能否详细说明如何删除/隐藏任何属性?
    • 获取文本视图可见部分的范围,遍历属性字符串中的所有属性,然后删除不在该范围内的。
    • 我可以确认这一点:我使用的单个自定义属性具有不同的值,具体取决于字符串中的位置。删除它在 CTFramesetterCreateFrame() 中产生了 5 倍的速度提升。我使用的其他 2 个属性对整个字符串具有相同的值,但对性能没有影响。
    【解决方案3】:

    另一种方法是继续使用 CTFramesetter,但使用更小的 CTFrame。只需将您的 NSAttributedString 转换为子字符串(例如,使用 [NSString paragraphRangeForRange:] 获取段落范围,然后使用属性化SubstringFromRange :) 分解您的属性字符串。然后为每个段落创建一个 CTFrame。当某些事情发生变化时(例如,用户键入了某些内容),您只需更新发生变化的 CTFrame(s)。

    这意味着您可以继续利用 CTFramesetter 为您提供的功能,而不会因为每次都重新设置所有文本而降低性能。

    【讨论】:

    • 这听起来不错,但另一个问题是,如果文本在一个段落中换行,您必须在此之后移动每个段落,以免它们重叠。
    • 你是对的,所以每次添加新行都会影响性能,但只有这样。而且,幸运的是,在这种情况下,您的性​​能会稍差一些,因为用户的眼睛必须回到行首。
    【解决方案4】:

    我一直在尝试使用CTLinesUITableView 在iOS 上进行语法高亮。 tableView 的好处是可以刷新、删除、插入一行,并且只能重绘该行。

    CTFramesetterCreateWithAttributedString 真的很慢。所以你用得越少越好。如果用户键入的内容您不需要再次将整个文本拆分为行,您可以只更新当前行,如果它溢出,您可以插入新行。让它在每种情况下都能正常工作需要一些工作,但性能可能会令人惊叹。

    这就是我所做的:https://github.com/Anviking/Chromatism

    【讨论】:

    • 那个项目看起来很不错,我仔细看了看。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多