iphone - CGContextAddArc 真的那么慢吗(与用几条线绘制的圆相比)

标签 iphone performance graphics cgcontext

各位,

在编写一些转盘和 slider 时(例如,像一个可以旋转的大音量按钮) - 我发现标准 CGContextAddArc() 的用法如下:

- (void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB();  
    CGContextSetLineWidth(ctx, radius * (KE-KR)+8);
    CGContextSetStrokeColorWithColor(ctx,self.foregroundColor.CGColor);
    .... more some colour/width/etc settings
    ...

    CGContextAddArc(ctx, dx,dy,radius, 0, 2*M_PI, 0);

慢得令人难以置信。

在 iPad 上 - 带有少量实心/描边圆圈,在拖动过程中每秒少于大约 10 次干净的 [self setNeedsDisplay] 更新。一个非常快速的手绘圆圈(如下所示)的破解速度快了几个数量级。这同样适用于模拟器。

这是为什么呢。正常填充和各种渐变填充似乎都是这种情况。我做错了什么?

Dw。

// Stupid replacement for CGContectAddArc() which seems to be very slow.
//
void CGContextAddCirlce(CGContextRef ctx, float ox, float oy, float radius)
{
    double len = 2 * M_PI * radius;
    double step = 1.8 / len; // over the top :)

    // translating/scaling would more efficient, etc..
    //
    float x = ox + radius;
    float y = oy;

    // stupid hack - should just do a quadrant and mirror twice.    
    //
    CGContextMoveToPoint(ctx,x,y);
    for(double a = step; a < 2.0 * M_PI -step; a += step) {
        x = ox + radius * cos(a);
        y = oy + radius * sin(a);
        CGContextAddLineToPoint(ctx, x, y);
    };

    CGContextClosePath(ctx);
};

最佳答案

Quartz 2D 的矢量绘图操作可能很慢,这就是为什么最好只在需要时重绘。

就您的情况而言,我建议绘制一次音量按钮,然后使用旋转变换将您绘制按钮的 UIView 或 CALayer 进行变换。通过简单地移动、旋转或缩放 View ,您不会触发昂贵的重绘。内容已缓存为纹理,GPU 可以快速操作此光栅化内容并将其合成到其他 View 之上。

您会发现,以这种方式避免重绘将会大大提高性能。

关于iphone - CGContextAddArc 真的那么慢吗(与用几条线绘制的圆相比),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4180402/

相关文章:

iphone - 如何防止弹出窗口控件消失?

iphone - cocoa touch : When does an NSFetchedResultsController become necessary to manage a Core Data fetch?

iphone - 使用 NSPredicate 获取核心数据对象数组?

java - JDBC 在 Java 中查询速度慢,但在其他系统中查询速度慢 (TOAD)

Java检查图像是否具有透明度

ios - 如果没有 Xcode,应用程序无法在后台正常运行

performance - 连接的 Spark 性能分析

javascript - 优化将 JSON 属性名称小写的 JavaScript 代码

graphics - 是否可以通过 tcp/ip 或其他网络协议(protocol)渲染 direct3d 图形?

java - 在绘制字符串函数中更改变量的颜色