gpt4 book ai didi

cocoa - 绘制CGImage的一部分

转载 作者:行者123 更新时间:2023-12-03 17:07:41 25 4
gpt4 key购买 nike

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

CImage 本身是使用 CGImageSourceCreateImageAtIndex 加载的,以从 PNG 文件创建图像。

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

问题是,CGContextDraw 仅采用目标矩形 - 并拉伸(stretch)源 CGImage 以填充它。

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

我一开始认为这将是一个“便宜”的操作 - 每个 CGImage 似乎没有必要包含自己的图像位副本 - 然而,分析表明使用 CGImageCreateWithImageInRect() 是一个相当昂贵的操作操作。

是否有更优化的方法将 CGImage 的子部分绘制到 CGContext 上,这样我就不需要经常使用 CGImageCreateWithImageInRect() 了?

<小时/>

鉴于缺乏源矩形,以及从 CGImage 上的矩形创建 CGImage 的容易性,我开始怀疑 CGImage 可能实现了写时复制语义,其中从 CGImage 生成的 CGImage 将引用与父矩形具有相同物理位的子矩形。分析似乎证明这是错误的:/

最佳答案

我和你在同一条船上。 CGImageCreateWithImageInRect()更适合我的需求,但之前我曾尝试转换为 NSImage ,在此之前,我剪裁了我正在绘制的上下文,并进行了翻译,以便 CGContextDrawImage()会将正确的数据绘制到剪切区域中。

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

  1. 剪辑和翻译对 CPU 的消耗过高。太慢了。似乎增加位图数据量只会对性能产生轻微影响,这表明这种方法缺乏任何可扩展性。

  2. 转换为 NSImage相对有效,至少对于我们使用的数据而言。我似乎没有看到任何重复的位图数据,这主要是我担心从一个图像对象到另一个图像对象的原因。

  3. 有一次我转换为 CIImage ,因为此类还允许绘制图像的子区域。这似乎比转换为 NSImage 慢,但确实为我提供了通过一些核心图像过滤器来摆弄位图的机会。

  4. 使用 CGImageCreateWithImageInRect()是其中最快的;也许自从您上次使用它以来它已经被优化了。 documentation for this function说生成的图像保留了对原始图像的引用,这似乎与您对写时复制语义的假设一致。在我的基准测试中,似乎没有重复的数据,但也许我读错了结果。我们采用这种方法是因为它不仅是最快的,而且看起来是一种更“干净”的方法,将整个过程保持在一个框架中。

关于cocoa - 绘制CGImage的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3566212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com