for_2012 2013-03-12 02:45 采纳率: 0%
浏览 1092

提升drawRect的性能速度

用NSTimer实现每0.1秒绘制grid的一个单元格。尺寸是 96x64 => 6144 cells / images。

如果我用画图代替(比如)纯绿色的矩形,就会变慢,差不多慢了四倍。

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIGraphicsPushContext(context);
    CGContextSetRGBFillColor(context, 0, 0, 0, 1);
    CGContextFillRect(context, CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height));
    int cellSize = self.bounds.size.width / WIDTH;
    double xOffset = 0;
    for (int i = 0; i < WIDTH;i++)
    {
        for (int j = 0; j < HEIGHT;j++)
        {                
                NSNumber *currentCell = [self.state.board objectAtIndex:(i*HEIGHT)+j];
                if (currentCell.intValue == 1)
                {
                   [image1 drawAtPoint:CGPointMake(xOffset + (cellSize * i),cellSize * j )];
                }
                else if (currentCell.intValue == 0){
                   [image2 drawAtPoint:CGPointMake(xOffset + (cellSize * i),cellSize * j )];
                }
        }
    }
    UIGraphicsPopContext();
}

如果在每个矩形中绘制png或者jpg,不知道应该提升一下速度?图片以及裁剪成标准的尺寸了。

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2022-12-19 21:15
    关注

    ChatGPT尝试为您解答,仅供参考
    绘制图片会比使用填充颜色的方法慢得多,因为绘制图片需要加载图片数据并将其解码为像素。为了提高速度,您可以尝试以下方法:

    • 使用预先加载和解码的图像对象,而不是在每次绘制时都加载和解码图像。

    • 使用缓存的图像对象,而不是在每次绘制时都创建新的图像对象。

    • 尽可能减少对图像的重复绘制。例如,您可以将图像缓存到内存中,然后使用缓存的图像进行绘制。

    • 将图像放在绘图上下文的转换矩阵中,以便在一次绘制中绘制多个图像。

    • 尝试使用其他图像格式,例如 WebP 或 AVIF,它们可能会提供更快的加载和解码速度。
      另外,在每次调用 drawRect: 方法时,都会创建新的图形上下文。如果您需要频繁更新视图,则可能需要在图形上下文中绘制所有内容,然后在 drawRect: 方法中绘制缓存的图像。


    总的来说,最好的方法取决于您的应用程序的具体要求和性能需求。最好先测试不同的方法,然后选择最佳方法。


    此外,请注意,如果您使用 NSTimer 每 0.1 秒更新视图,则可能会导致应用程序的过度更新。如果您的视图中的内容没有发生变化,则应避免在视图上绘制不必要的内容。您可以通过跟踪更新的次数以及每次更新所花费的时间来评估性能,并进行必要的优化。

    评论

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记