gpt4 book ai didi

cocoa - 临时文本属性导致速度大幅下降

转载 作者:行者123 更新时间:2023-12-03 16:40:02 25 4
gpt4 key购买 nike

我正在使用我发布的代码作为 this question 的答案将 NSTextView 中的隐藏字符显示为项目符号。

我使用 NSLayoutManager 的 addTemporaryAttributes:forCharacterRange: 方法将项目符号着色为灰色。每个范围的长度为 1,并为单个项目符号着色。 (我使用的大部分相同文本的相邻隐藏字符相对较少,尽管这是我计划在将来进行的优化。)

这一变化会产生许多不利影响。滚动 TextView 变得缓慢且不稳定,尤其是对于具有许多隐藏字符的文本。如何对部分文本进行着色而不会对性能造成 Not Acceptable 影响?

最佳答案

滚动时最大的影响是,每次 ScrollView 滚动时,它都会重新绘制 View ,并进而重新着色整个文档。由于在单次滚动操作期间, ScrollView 滚动几个像素,因此只需向上或向下滚动 n 像素即可重新着色整个文档n次!

我建议确保您只对屏幕上的文本进行着色。您永远想做的最后一件事就是向已滚动到 View 之外的角色添加属性,因为此时它本质上是浪费周期。

您可以从 TextView 中获取可见文本的范围:

- (NSRange)visibleRange
{
NSRect visibleRect = [textView visibleRect];

NSRange glyphVisibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];
NSRange charVisibleRange = [[textView layoutManager] characterRangeForGlyphRange:glyphVisibleRange actualGlyphRange:nil];
return charVisibleRange;
}

因此,当您进行着色时,仅对在此范围内的字形进行着色。这应该会将您的滚动性能提高几个数量级。

关于cocoa - 临时文本属性导致速度大幅下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/367001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com