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
相关产品推荐
相关产品推荐

