对不同的图像使用相同的CGImageRef缓冲区?

时间:2011-07-18 09:32:11

标签: performance macos core-graphics quartz-graphics

我正在寻找创建CGImageRef缓冲区一次的方法,并再次使用它来处理不同的图像。

我的应用程序在创建图像然后在上下文中绘制时会遇到性能损失。这个过程是在一个每1ms发射一次的计时器。我想知道我能做些什么来避免打电话 CGBitmapContextCreateImage(bitmapcontext);在每一个刻度线上。

由于

1 个答案:

答案 0 :(得分:1)

理论上有一种方法可以做到:

  1. 创建NSMutableData或CFMutableData。
  2. 使用其mutableBytes / MutableBytePtr作为位图上下文的后备缓冲区。
  3. Create a CGDataProvider with the data object.
  4. Create a CGImage with that data provider,确保使用您创建位图上下文的所有相同参数值。
  5. 但是,我不确定这是否有效。更具体地说,我认为CGImage不保证不复制,缓存和重用数据提供者提供的任何数据。如果有的话,你会发现你的应用程序显示的是陈旧的图像(甚至是部分陈旧的图像)。

    你可能最好只是坚持使用CGImage。如果基于某些输入生成图像,请考虑是否可以通过该输入缓存生成的图像 - 例如,如果要在上下文中绘制一个或两个数字,请考虑在字典中缓存CGImages或{{ 3}}由数字字符串键入。当然,这有多可行取决于图像的大小和内存的有限程度;如果这是在iOS上,你可能会很快从该缓存中删除项目。

    此外,用户实际上看不到每1毫秒做任何事情。如果您要向用户显示这些图像,则无法每秒执行1000次 - 即使您可以在应用程序中执行此操作,用户也无法快速查看。截至Snow Leopard(我认为自Tiger以来,如果不是更早),Mac OS X将绘图限制为每秒60帧;我认为这在iOS上也是如此。你应该以合理的间隔做什么 - 1/60秒是合理的 - 将视图设置为需要显示,并且只有在视图被告知绘制时才应该进行绘图/图像生成。