performance - 在Retina iPad上使用CoreGraphics绘制图像的速度很慢

标签 performance ipad core-graphics retina-display

在我的iPad应用程序中,我渲染到屏幕外的位图,然后将位图绘制到屏幕上。 (这是因为我想重新使用现有的位图渲染代码。)在iPad 2上,它的工作原理很吸引人,但是在带有Retina显示屏的新型iPad上,即使位图的分辨率仍然很高,绘制位图的速度仍然很慢。相同的。

为了绘制位图,我们使用常规的Quartz 2D函数:CGImageCreate带有由CGDataProviderCreateWithData创建的数据提供程序,kCGImageAlphaNoneSkipLast是32位RGBA格式。在显示位图的UIView中,在drawRect:中,我们使用CGContextDrawImage将其绘制到UIGraphicsGetCurrentContext返回的上下文中。

请注意,我什至没有尝试以双分辨率进行绘制:目前,我可以使用与iPad 2上相同的分辨率。看起来好像CoreGraphics在内部将像素加倍,然后将其发送到GPU ,即使我制作的CGImage应该可以直接传递给GPU。有任何想法吗?

最佳答案

It looks like CoreGraphics is internally doubling the pixels, and then sending that to the GPU,



差不多了更准确地说(至少在精神上):
  • UIKit用设备像素
  • 来生成CGBitmapContext,其大小为 View 边界的大小
  • 使该上下文成为当前上下文
  • 您将CGImage绘制到该上下文中
  • ...,因此CG必须重新缩放源图像,并触摸所有目标像素
  • 完成绘制后,UIKit从位图上下文
  • 中创建一个CGImage
  • 并将其分配给 View 图层的内容。

  • the CGImage that I'm making should be fine for passing to the GPU directly.



    如果您希望这种情况发生,则需要通过减少上述某些步骤来告诉系统做到这一点。

    (UIKit,CoreAnimation和CoreGraphics之间没有提供您期望的“快速路径”的链接。)

    最简单的方法是制作一个UIImageView,并将其image设置为包裹UIImageCGImageRef

    或者,将view.layer.contents设置为CGImageRef。 (并确保不要覆盖-drawRect:,不要调用-setNeedsDisplay,并确保contentMode不是UIViewContentModeRedraw。更容易使用UIImageView。)

    关于performance - 在Retina iPad上使用CoreGraphics绘制图像的速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10410106/

    相关文章:

    c++ - 使用 IF 语句比使用异常处理更便宜?

    php - 是什么导致服务器出现 60,000 毫秒的延迟

    iphone - 您如何在 Master-Detail Storyboard模板中访问 tableView?

    iphone - 找不到 PDF 标题 : '%PDF' not found

    iphone - 我必须这样投吗?

    javascript - 将大型元素/数据集附加到 dom 的性能

    c++ - 减慢线程的最佳方法?使用 Sleep() 可以吗?

    objective-c - 带透明度的 iPad 视频

    ios - 在 iOS 上绘制旋转文本会创建跳跃字符

    ios - 如何在 IOS 的 ARC 中心添加文本?