CGContextFillRects:没有匹配的调用函数

时间:2018-04-18 14:02:29

标签: objective-c

我试图优化其中一个组件的性能。组件需要在其drawRect方法中绘制一些(10到200个)矩形,每秒触发约20次。

当我在每个CGRect上单独使用CGContextFillRect方法时,一切都有效。我想测试是否在CGRects数组上使用CGContextFillRects将绘图分组到一个单独的调用中会提高性能。

方法CGContextFillRects给我一个编译器错误没有匹配函数来调用' CGContextFillRects'

此代码位于.mm文件中。我应该在使用CGContextFillRects方法之前导入一些东西吗?

这就是我想要做的事情:

- (void) drawRect:(CGRect)rect{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetFillColorWithColor(context, self.fillColor.CGColor);

    //check if some objects are present
    if (self.leftDrawBuffer && self.rightDrawBuffer){

        UInt32 xPosForRect = self.leftPadding;
        NSMutableArray *rectsToFill = [[NSMutableArray alloc] init];

        for (int drawBufferLRIndex = 0; drawBufferLRIndex < 2; drawBufferLRIndex++){

            Float32 *drawBuffer_ptr = self.leftDrawBuffer;
            if (drawBufferLRIndex > 0){
                drawBuffer_ptr = self.rightDrawBuffer;
            }

            for (int i=0; i< kAmountOfBarsPerChannel; i=i+1){

                Float32 amp = drawBuffer_ptr[i];
                Float32 blockNumber = 1.0f;
                UInt32 yPosForRect = self.bounds.size.height - self.heightPerBlock;

                while (blockNumber <= self.blocksPerLine && blockNumber / self.blocksPerLine < amp){


                    CGRect rect= CGRectMake(xPosForRect, yPosForRect, self.widthPerBlock, self.heightPerBlock);
                    [rectsToFill addObject:[NSValue valueWithCGRect:rect]];

                    //Using the method below works and gives me the expected result
                    //CGContextFillRect(context, rect);

                    blockNumber++;

                    yPosForRect -= self.heightPerBlock + self.vPaddingPerBlock;

                }

                xPosForRect += self.widthPerBlock + self.hPaddingPerBlock;
            }
        }

        //This is the added code where i try to use CGContextFillRects
        //1 -> transform to a c array of CGRects
        const CGRect *cRects[rectsToFill.count];
        for (int i = 0; i < rectsToFill.count; ++i) {
            CGRect rect = [[rectsToFill objectAtIndex:i] CGRectValue];
            cRects[i] = &rect;
        }
        size_t size = rectsToFill.count;

        //2 -> trigger the method to fill all rects at once
        //this method gives me the compiler error 'No matching function for call to 'CGContextFillRects''
        CGContextFillRects(context, cRects, size);
    }

    CGContextRestoreGState(context);
}

1 个答案:

答案 0 :(得分:1)

问题是如何将rects转换为C数组。您可以指向临时存储在堆栈中的rects。这有两个问题。首先,每次循环迭代都会消失,所以你不能这样做。其次,您应该将指针传递给CGRect的数组,而不是指向CGRect的指针数组。

这可能会解决它:

CGRect cRects[rectsToFill.count]; // Replace your lines from this
for (int i = 0; i < rectsToFill.count; ++i) {
    CGRect rect = [[rectsToFill objectAtIndex:i] CGRectValue];
    cRects[i] = rect;
}
size_t size = rectsToFill.count;

CGContextFillRects(context, cRects, size); // To this

请注意cRects数组的重新声明以及作业的更改。