IKImageView波涛汹涌?

时间:2010-07-30 14:31:15

标签: objective-c cocoa nsimage ikimageview

我有一个IKImageView,我将CGImages(我用NSImages制作)放在上面。然而,正常的200DPI 8.5 / 11页面需要3秒才会出现,一次出现在一侧约2英寸(屏幕)的矩形中。这真的很烦人。有办法解决这个问题吗?

或者,有没有办法双重缓冲视图?要有2个IKImageViews并绘制成一个,然后显示它?

ETA: 加倍我的滚动视图(里面有ikimageviews),然后绘制它们,然后取消隐藏它们,似乎没有帮助...或者,它可能有点帮助,但不是很多

我用仪器做了一点点,发现在memcopy中似乎正在做很多工作:

  22 commpage [libSystem.B.dylib] 78.0  __memcpy
  21 ImageIO 37.0  CGImageReadGetBytesAtOffset
  20 ImageIO 37.0  CGImageReadSessionGetBytes
  19 ImageIO 37.0  myTIFFReadProc
  18 libTIFF.dylib 37.0  TIFFReadRawStrip1
  17 libTIFF.dylib 37.0  TIFFFillStrip
  16 libTIFF.dylib 37.0  _cg_TIFFReadEncodedStrip
  15 ImageIO 37.0  copyImageBlockSetTIFF
  14 ImageIO 37.0  ImageProviderCopyImageBlockSetCallback
  13 CoreGraphics 37.0  CGImageProviderCopyImageBlockSet
  12 CoreGraphics 37.0  img_blocks_create
  11 CoreGraphics 37.0  img_blocks_extent
  10 CoreGraphics 37.0  img_interpolate_extent
   9 CoreGraphics 37.0  img_data_lock
   8 CoreGraphics 37.0  CGSImageDataLock
   7 libRIP.A.dylib 37.0  ripc_AcquireImage
   6 libRIP.A.dylib 37.0  ripc_DrawImage
   5 CoreGraphics 37.0  CGContextDrawImage
   4 ImageKit 37.0  -[IKImageLayer drawInContext:]
   3 QuartzCore 37.0  tiled_layer_render(_CAImageProvider*, unsigned int, unsigned int, unsigned int, unsigned int, void*)
   2 QuartzCore 37.0  CAImageProviderThread(void*)
   1 libSystem.B.dylib 37.0  _pthread_wqthread
   0 libSystem.B.dylib 37.0  start_wqthread

我不确定那告诉我的是什么......

编辑:为了记录,问题是数据大小。我有一个旧版本的程序,它使用已弃用的quickdraw方法调用。当我将图像放大到300%时,一个屏幕像素=一个图像像素,所以它需要使用整个图像,它仍然一页一页地拉开。

我被这个最初写这个的人嘲笑,因为他的版本在他古老的10.3 G5上比在我最新的英特尔盒子上移动得更快。更快至少10倍。

1 个答案:

答案 0 :(得分:2)

  

200DPI 8.5 / 11页

假设它们是RGB颜色,那么每个图像的像素为11.22兆字节。您的应用程序使用大量内存,绘制374万像素(无论颜色空间)会变慢。

  

侧面2英寸(屏幕)

利用它。使用72 dpi常数和the window's user-space scale factor计算出2英寸的屏幕像素数,并将页面光栅化为该大小。目前,这些矩形的边长为144点,144×144的图像在内存和绘图方面非常有效。

如果您有缩放设置,则需要在这些图像发生变化时使其缓存无效,并在不早于视图被告知绘制时重新计算每个图像。