我有一个ikimageview,我正在把cgimages(我用nsimages制作的)放到上面。然而,一个正常的200 dPi 85/11页面需要3秒的时间出现,一次出现在矩形上大约2英寸(屏幕)。这真烦人。有办法解决这个问题吗?
或者,有没有办法对视图进行双重缓冲?要有两个ikimageview并绘制成一个,然后显示它?
预计到达时间:
翻倍我的滚动视图(用IKVIEVIEWS内部),然后绘制到它们,然后取消它们,似乎没有帮助…或者,也许有点帮助,但没什么
我用乐器四处探访了一下,发现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倍。

最佳答案

200dpi 8.5/11页
假设这些是rgb颜色,那么每张图像的像素数为11.22兆字节。你的应用程序占用了大量内存,绘制374万像素(不考虑颜色空间)将会很慢。
侧面2英寸(屏幕)
好好利用这个。使用72 dpi常量和the window's user-space scale factor计算2英寸屏幕像素的数量,并将页面光栅化为该大小。目前,这些矩形将是144点在一边,一个144×144的图像是非常有效的内存和绘制。
如果您有缩放设置,您将希望在这些图像更改时使其缓存无效,并在不早于要求您的视图绘制时重新计算每个图像。

10-06 02:43