You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CGContextFillRects编译报错:无匹配调用函数,组件绘制性能优化咨询

解决CGContextFillRects编译错误并实现批量绘制性能优化

嘿,这个坑我之前踩过好多次!CGContextFillRects的参数要求确实有点容易搞混,咱们一步步把问题捋清楚,顺便把性能优化的事儿落地。

首先,你遇到的编译错误根源很明确:参数类型不匹配。先看一下这个方法的官方函数签名,就能明白哪里错了:

void CGContextFillRects(CGContextRef _Nullable c, const CGRect * _Nullable rects, size_t count);

这里有两个关键要求很容易踩坑:

  • 第二个参数必须是指向CGRect的const指针(也就是C语言数组的首地址),不是Objective-C的NSArray
  • 第三个参数count必须是size_t类型(和NSUInteger等价),不能直接传int

正确的批量绘制实现示例

下面给你一个适配drawRect场景的可运行代码,直接替换你的逻辑就行:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    // 先设置填充颜色,按需调整
    CGContextSetFillColorWithColor(context, [UIColor grayColor].CGColor);
    
    // 假设本次要绘制80个矩形,先确定数量
    NSUInteger rectCount = 80;
    // 1. 静态数组(数量固定且不大时用,无需手动释放)
    CGRect rects[80];
    // 2. 动态数组(数量不固定时用,记得最后释放内存)
    // CGRect *rects = malloc(rectCount * sizeof(CGRect));
    
    // 填充每个矩形的frame,替换成你的实际计算逻辑
    for (NSUInteger i = 0; i < rectCount; i++) {
        // 这里用随机坐标示例,你换成自己的业务坐标即可
        CGFloat x = arc4random_uniform((int)CGRectGetWidth(rect));
        CGFloat y = arc4random_uniform((int)CGRectGetHeight(rect));
        rects[i] = CGRectMake(x, y, 15, 15);
    }
    
    // 核心批量绘制调用
    CGContextFillRects(context, rects, rectCount);
    
    // 如果用了动态数组,别忘了释放内存
    // free(rects);
}

为什么单个CGContextFillRect没问题?

因为单个绘制方法只需要传入一个CGRect值,而批量方法需要的是C语言数组的指针——很多开发者会误以为可以直接传NSArray<CGRect>,但Objective-C数组和C数组是完全不同的内存结构,不能直接转换,这就是编译报错的核心原因。

性能优化的额外建议

你选批量绘制的方向太对了!每秒20次drawRect,每次10-200个矩形,批量调用能大幅减少CGContext的系统调用次数,CPU占用会明显下降。如果还想进一步优化,可以试试:

  • 把矩形的坐标计算逻辑移到drawRect外面(比如在数据更新时预处理),避免在绘制阶段做过多计算
  • 如果矩形不会频繁变化,可以提前把绘制结果缓存成UIImage,直接绘制图片比实时绘制矩形的性能还要好

内容的提问来源于stack exchange,提问作者Dries Cleymans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:42:31