【问题标题】:Speed up / reduce CPU load to draw bitmap in Swift加快/减少 CPU 负载以在 Swift 中绘制位图
【发布时间】:2017-09-17 18:49:56
【问题描述】:

我必须在 Swift 中绘制瀑布图,并且我使用的是位图上下文,它的更新速度非常快,大约每秒 20 行,我总共有大约 400 行要显示 - 全宽。

目前我的 CPU 负载大约是 100%,我想知道,如果有更好的方法,绘制这个,以降低 CPU 负载。

func draw2(pixel:[rgba],width:Int,height:Int) -> UIImage
{   let colorSpace = CGColorSpaceCreateDeviceRGB()

    var data = UnsafeMutableRawPointer(mutating: pixel)

    let bitmapContext = CGContext(data: data,
                                  width: width,
                                  height: height,
                                  bitsPerComponent: 8,
                                  bytesPerRow: 4*width,
                                  space: colorSpace,
                                  bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)


    let image = bitmapContext?.makeImage()

    return UIImage(cgImage: image!)

}

非常感谢大家

【问题讨论】:

  • 嗨@Manuel- 每次调用它时你都重绘整个图像吗?假设您只是在每次可以缓存现有图像并在顶部绘制新位时添加新行(就像您在绘图应用程序中缓存绘制的路径一样)。
  • 您好 Sparky,我更改了数据指针,使其指向新行。所以我只在数组中添加一行,但是每次调用函数时我都会绘制整个图像。是否有可能只画一条新线,并将现有图像降低一个像素?

标签: ios swift performance bitmap


【解决方案1】:

根据您告诉我的内容,您应该能够缓存图像并且每次只绘制增量线。您需要保留一个类参数来存储您的图像:

var cachedImage : UIImage?

每次调用绘图函数时,请执行以下操作:

  1. 使用 UIImage.draw(in:CGRect) 绘制缓存的图像(如果存在,第一次运行时当然不会)(参见https://developer.apple.com/documentation/uikit/uiimage/1624092-draw)。

  2. 绘制新路径。

  3. 将结果保存回cachedImage。

在每次绘制迭代时,您显然希望将矩形移动一个像素,并初始化您的上下文以为新行腾出空间。

希望对您有所帮助。

【讨论】:

  • 感谢您的回答,如果我理解正确,我不确定。我是否必须创建这样的上下文并将缓存的图像放入其中? UIGraphicsBeginImageContext(DrawImage.frame.size) var context = UIGraphicsGetCurrentContext() cachedImage.draw(in: CGRect(x: 1, y: 0, width: view.frame.size.width, height: view.frame.size.height - 1))
  • 没错。您可以将缓存的图像绘制到上下文中,然后绘制新线,然后从更新的图形上下文中获取图像。恐怕我现在不在办公桌前,所以无法测试任何代码,但应该可以。
  • 谢谢 Sparky,我已经用一个示例 UIImage (a jpg) 进行了尝试,并在上下文中添加了一个简单的 Line。效果很好,看起来和我需要的完全一样!但是只有一个问题,如何从我的像素数组中向我现有的上下文中添加一行?我只能从我的像素数据中创建一个完整的上下文,但我不能将它添加到现有的,或者有什么技巧吗?我用谷歌搜索了这个问题,但我找不到任何东西:/
  • 嗨@Manuel,很高兴它(有点工作)。我现在唯一能想到的就是从新绘制的像素中获取 UIImage,然后使用 UIImage.draw(at: CGPoint) 将其直接绘制在原始图像下方。当然,问题在于您需要确保所有行都是完整的行并且没有部分行,否则它根本无法工作。我将进一步尝试这个,因为我发现它很有启发性,我可能会将一些东西放在一起并将其添加到我的 GitHub 中,在这种情况下我会给你发送一个链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多