我有一个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倍。
答案 0 :(得分:2)
200DPI 8.5 / 11页
假设它们是RGB颜色,那么每个图像的像素为11.22兆字节。您的应用程序使用大量内存,绘制374万像素(无论颜色空间)会变慢。
侧面2英寸(屏幕)
利用它。使用72 dpi常数和the window's user-space scale factor计算出2英寸的屏幕像素数,并将页面光栅化为该大小。目前,这些矩形的边长为144点,144×144的图像在内存和绘图方面非常有效。
如果您有缩放设置,则需要在这些图像发生变化时使其缓存无效,并在不早于视图被告知绘制时重新计算每个图像。