2011-07-18 36 views
0

我正在寻找创建CGImageRef缓冲区的方法,并将其用于不同的图像。对不同的图像使用相同的CGImageRef缓冲区?

我的应用程序正在面临性能问题,因为它会创建一个图像,然后在上下文中绘制它。这个过程在一个定时器中,每1ms触发一次。我想知道是否有什么我可以做,以避免呼吁 CGBitmapContextCreateImage(bitmapcontext);在每一个滴答。

感谢

回答

1

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

  1. 创建一个NSMutableData或CFMutableData。
  2. 使用它的mutableBytes/MutableBytePtr作为位图上下文的后备缓冲区。
  3. Create a CGDataProvider with the data object.
  4. Create a CGImage with that data provider,确保使用您创建位图上下文时使用的所有相同参数值。

但是,我不确定这是保证工作。更具体地说,我认为CGImage不保证不复制,缓存和重用数据提供者提供的任何数据。如果有的话,你会发现你的应用显示一个陈旧的图像(甚至是一个部分陈旧的图像)。

你可能会更好的只是坚持CGImage(s)。如果您基于某些输入生成图像,请考虑您是否可以通过该输入缓存结果图像 - 例如,如果您在上下文中绘制了一两个数字,请考虑在字典中缓存CGImages或键入NSCache由数字(s)串组成。当然,这是多么可行取决于图像的大小以及内存的有限性。如果这是在iOS上,您可能会很快从该缓存中删除项目。

此外,每1ms执行一次任何操作都不会对用户可见。如果您的意思是向用户展示这些图像,则无法每秒处理1000次,即使您可以在应用程序中执行此操作,用户也无法快速查看。从Snow Leopard开始(我认为自Tiger以来,如果不是早些时候),Mac OS X将绘图限制为每秒60帧;我认为这在iOS上也是如此。你应该在一个合理的间隔内做什么 - 1/60秒是很合理的 - 被设置为需要显示的视图,并且只有当视图被告知绘制时,你才应该做这个绘图/图像生成。

+0

哎哟,LCD面板刷新速度不会超过每秒60次 - 所以即使操作系统允许它,你*仍然*将无法看到它。 –

+0

@Jonathan Grynspan:这取决于液晶显示器,但是:是的,即使最快的电视也只能达到240赫兹,这还不到提问者试图做的四分之一。 –

+0

啊,但这些*只接受50Hz或60Hz的信号。*绘制的额外帧是从源数据中插入的。它们仍然只能显示最多60 Hz的源数据。 –

相关问题