代码之家  ›  专栏  ›  技术社区  ›  Chris Becke

绘制CGImage的一部分

  •  1
  • Chris Becke  · 技术社区  · 15 年前

    我有一个从CGImage绘制图像的应用程序。

    这构成了sprite引擎的一部分-在一个PNG文件上有多个sprite图像,因此每个sprite都有一个CGRect,定义它在CGImage上的位置。

    问题是,CGContextDraw只接受一个目标rect-并扩展源CGImage来填充它。

    因此,要绘制每个精灵图像,我们需要使用CGImageCreateWithImageInRect()从原始源创建多个CGImages。

    我一开始以为这是一个“廉价”的操作-似乎不需要每个CGImage包含自己的镜像位副本-但是,分析显示使用CGImageCreateWithImageInRect()是一个相当昂贵的操作。


    考虑到缺少源矩形,以及从CGImage上的rect生成CGImage的容易性,我开始怀疑CGImage可能实现了一种写时拷贝语义,其中由CGImage生成的CGImage将引用与父对象具有相同物理位的子矩形。 分析似乎证明了这一点是错误的:/

    3 回复  |  直到 15 年前
        1
  •  2
  •   Andrew    8 年前

    我和你在同一条船上。 CGImageCreateWithImageInRect() 更好地满足了我的需要,但之前我曾试图转换为 NSImage CGContextDrawImage()

    在我尝试的所有解决方案中:

    1. 转换为 N图像 是相对有效的,至少对我们使用的数据来说。我所能看到的位图数据似乎没有任何重复,这主要是我害怕从一个图像对象转到另一个图像对象。

    2. 有一次我改成了 CIImage NSImage

    3. 使用 是最快的;也许自从你上次使用它以来,它已经被优化了。这个 documentation for this function 表示生成的图像保留了对原始图像的引用,这似乎与您假设的“写入时复制”语义相一致。在我的基准测试中,似乎没有重复的数据,但可能我读错了结果。这个方法看起来更像是一个“保持整个过程最快”的方法。

        3
  •  0
  •   Mike Abdullah    15 年前

    我认为建议使用剪切区域。

        4
  •  0
  •   user3408864    6 年前

    我取得好成绩的唯一方法是:

    1) 使用CGContextDrawImage()将tilesheet CGImage预呈现为CGBitmapContext

    3) 编写我自己的快速blit例程,将像素区域(CGRect)从(1)中创建的位图上下文复制到(2)中创建的位图上下文。这很简单:只需简单的内存复制(如果需要,还需要一些额外的每像素操作来进行alpha混合),记住光栅在缓冲区中的顺序是相反的(图像中的最后一行像素在缓冲区的开始处)。

    4) 绘制完帧后,使用CGContextDrawImage()在视图中绘制屏幕外缓冲区。