Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 在iPad上使用CoreGraphics绘制图像速度较慢_Performance_Ipad_Core Graphics_Retina Display - Fatal编程技术网

Performance 在iPad上使用CoreGraphics绘制图像速度较慢

Performance 在iPad上使用CoreGraphics绘制图像速度较慢,performance,ipad,core-graphics,retina-display,Performance,Ipad,Core Graphics,Retina Display,在我的iPad应用程序中,我正在渲染屏幕外位图,然后将位图绘制到屏幕上。(这是因为我想重复使用现有的位图渲染代码。)在iPad2上,这很有魅力,但在带有视网膜显示器的新iPad上,绘制位图的速度非常慢,即使其分辨率仍然相同 为了绘制位图,我们使用常规的Quartz 2D函数:CGImageCreate和由CGDataProviderCreateWithData创建的数据提供程序,32位RGBA格式和kCGImageAlphaNoneSkipLast。在显示位图的ui视图中,在drawRect:中

在我的iPad应用程序中,我正在渲染屏幕外位图,然后将位图绘制到屏幕上。(这是因为我想重复使用现有的位图渲染代码。)在iPad2上,这很有魅力,但在带有视网膜显示器的新iPad上,绘制位图的速度非常慢,即使其分辨率仍然相同

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

请注意,我甚至没有尝试以双分辨率画图:现在我可以使用与iPad2相同的分辨率。看起来CoreGraphics在内部将像素加倍,然后将其发送到GPU,即使我正在制作的
CGImage
可以直接传递到GPU。有什么想法吗

看起来CoreGraphics在内部将像素加倍,然后将其发送到GPU

差不多。更准确地说(至少在精神上):

  • UIKit生成一个
    CGBitmapContext
    视图边界的大小,以设备像素为单位
  • 它使该上下文成为当前上下文
  • 您可以将
    CGImage
    绘制到该上下文中
  • 。。。因此CG必须重新缩放源图像,并触摸所有目标像素
  • 完成绘制后,UIKit从位图上下文生成一个
    CGImage
  • 并将其指定给视图的图层内容
  • 我正在制作的CGImage应该可以直接传递到GPU

    如果您想让这种情况发生,您需要告诉系统这样做,方法是省去上面的一些步骤

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

    最简单的方法是创建一个
    UIImageView
    ,并将其
    图像设置为
    UIImage
    包装您的
    CGImageRef


    或者,将
    view.layer.contents
    设置为
    CGImageRef
    。(并且确保不要覆盖
    -drawRect:
    ,不要调用
    -setNeedsDisplay
    ,并且确保
    内容模式
    不是
    UIViewContentModeRedraw
    。只需使用
    UIImageView
    就可以了)

    谢谢您的信息,这可能会有很大帮助。该视图已设置动画,因此它经常重画。因此,我认为使用view.layer.contents可能比将新图像分配给UIImageView更有效,对吗?尝试过它后,view.layer.contents方法非常有效,再次感谢!好吧,这两种方法在性能上几乎相同,但一如既往:如果有关系,试试看。如果有人想知道我是谁,你必须将image ref转换为id,如so
    view.layer.contents=(id)myUIImage.CGImage在使用arc
    view.layer.contents=(uu bridge id)myUIImage.CGImage时,还应该使用桥接cast详细信息可在此处找到