【问题标题】:Draw bordered text efficiently in iOS在 iOS 中有效地绘制带边框的文本
【发布时间】:2012-07-11 22:56:10
【问题描述】:

我有一个自定义 drawRect 方法的视图,它有两条固定宽度的文本行。 这个视图以每秒大约 16 个计时器的速度不断地重绘,文本的位置和文本的内容一直在变化。 我还需要以在任何背景下都清晰可见的方式绘制文本,为此我执行以下操作:

CGContextSetTextDrawingMode(ctx, kCGTextStroke);        // Border mode
[string drawAtPoint:point withFont:font];
CGContextSetTextDrawingMode(ctx, kCGTextFill);          // Text mode
[string drawAtPoint:point withFont:font];

此代码以固定线宽的边框模式绘制文本,然后在相同位置再次以填充模式绘制文本。通过这种方式,我得到了每个字母周围带有白色边框的蓝色文本。

除了表现之外,结果对我来说绝对令人满意。 使用 Time Profiler 我注意到绘制整个视图所花费的大约 70% 的时间都花在了以边框(笔划)模式绘制文本上。但是在填充模式下绘制只需要整个视图绘制时间的 3%。考虑到视图重绘的频率,我认为这样做效率不高。

那么有人知道如何以更有效的方式在每个字母周围绘制带有边框的文本吗?

【问题讨论】:

    标签: objective-c ios cocoa text border


    【解决方案1】:

    两种选择:

    1. 使用阴影而不是绘制轮廓:CGContextSetShadowWithColor
    2. 使用 CGLayer 缓存字符串的图像及其轮廓:CGLayerCreateWithContext

    对 2 的解释:

    对于仅用一种颜色填充字母的标准情况,对绘图文本进行了高度优化。单个字形(字母)不会每次都从轮廓中呈现。相反,字形只被绘制到缓冲图像中一次,这些图像被缓存和重用。

    由于很少绘制轮廓,因此此模式可能没有字形缓存或其他优化。所以想法是自己进行缓存:将整个字符串绘制到一张图像中,保留该图像并在您的 drawRect: 方法中绘制它而不是文本。

    有几种方法可以做到这一点:

    1. 使用CGBitmapContext
    2. 使用UIGraphicsBeginImageContext
    3. 使用CGLayer

    【讨论】:

    • 感谢您的回答。我已经用阴影实现了第一部分,它的工作速度比我在 Stroke 模式下绘制文本时慢两倍,我认为这是非常合乎逻辑的。但我不太了解缓存图像的第二个选项。它应该如何工作以及如何提高性能?
    • 如果我理解正确,我可以将绘制的文本保存为图像,然后将其绘制到我的视图中,只要当前文本与缓存的文本相同。但是由于文本的更改频率比视图重绘的频率要小,因此它应该确实可以提高性能。非常感谢您的想法。
    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    相关资源
    最近更新 更多