IKImageView卡顿?

3
我有一个IKImageView,我正在将由NSImages制成的CGImages放入其中。然而,普通的200DPI 8.5/11页面需要大约3秒钟才能出现,在屏幕上一次出现大约2英寸(屏幕)的矩形。这真的很恼人。有没有办法解决这个问题?
或者,有没有一种方法来双缓冲视图?有两个IKImageViews并绘制到一个视图中,然后显示它?
ETA:将我的滚动视图加倍(内部带有ikimageviews),然后绘制到它们中,然后取消隐藏它们,似乎并没有什么帮助……或者,也许有点帮助,但不是很多
我使用instruments进行了一些探索,并发现在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

我不确定这告诉我什么......编辑:记录一下,问题不在数据大小上。我有一个旧版本的程序,使用已弃用的快速绘图方法调用。当我将图像放大到300%,以便一个屏幕像素=一个图像像素,因此需要使用整个图像时,它仍然可以轻松地翻页。那个写这个程序的人正在嘲笑我,因为他的版本在他古老的10.3 G5上比在我的最新英特尔盒子上运行得更快,至少快了10倍。

你是如何创建NSImage和CGImageRef的? - ergosys
最初,我是从扫描仪的位图数据中制作图像。目前,我似乎将其放入了CGImageProvider中,从中获取了一个CGImage,将该图像放入CGImageDestination以NSData的形式,并使用该数据制作NSImage。现在看起来,它看起来非常愚蠢... 嗯。 - Brian Postow
你解决了你的问题吗?我也有同样的问题。 - Denis Kildishev
1个回答

2
200DPI 8.5/11页,如果这些是RGB色彩,那么每个图像有11.22兆像素。您的应用程序使用了大量内存,绘制3.74兆像素(无论颜色空间如何)都会很慢。
2英寸(屏幕)一侧,利用它。使用72 dpi常数和窗口用户空间比例因子,计算出2英寸是多少屏幕像素,并将页面光栅化到该尺寸。目前,这些矩形将在一侧为144点,而144×144的图像非常高效,可以在内存中绘制。
如果您有缩放设置,则需要在更改时使这些图像的缓存失效,并在视图被告知绘制之前重新计算每个图像。

好的,首先,目前它是黑白的,但更重要的是,在我使用IKImageView之前,它只需要大约1/20的时间。我没有夸张。以前绘制屏幕只需要0.1秒,甚至更短。现在需要2秒钟,这是很长的时间...扫描页面只需要半秒钟... - Brian Postow
你应该在Instruments中对你的应用进行性能分析,看看它花费了多少时间。 - Peter Hosey
我应该使用哪种工具呢?Instruments看起来像是一个庞大的工具,而且我从来没有完全弄明白它... - Brian Postow
好的,正如我之前所添加的那样,似乎时间花费在memcopy上,但这并没有对我有太大帮助... - Brian Postow
是的,它只需要37毫秒。可能更有趣的是获取TIFF表示需要约100毫秒,从PDFPage获取数据表示需要另外100毫秒... - Brian Postow
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接