iPad视网膜模拟器中的CATiledLayer产生较差的性能
我希望也许这只是一个模拟器的问题,但当然,这让我担心,因为我已经提交了我的视网膜能力的应用程序,没有办法testing,直到16日。
我在我的应用程序中实现了一个CATiledLayer来查看非常大的地图。 地图的瓷砖来自互联网,但他们也被caching,所以,通常,他们实际上是直接从设备加载。
在iPad 1和iPad2上,它的作品非常漂亮。 即使是来自互联网,你也几乎看不到在iPad 2上显示的图块。
在iPad模拟器上,它运行的很好。
我的问题是iPad视网膜模拟器。 在视觉上,它看起来没问题。 地图大小合适,并与另一个图层排列起来,用于显示数据叠加层,但是它缓慢地加载INCREDIBLY。 大多数时候我尝试,它不会加载任何瓷砖,直到我开始滚动,然后当它正在加载瓷砖,它可能每秒1,看起来很可怕。
我没有在标准分辨率屏幕上的视网膜上运行不同的代码,所以我希望这只是模拟器的问题…但我仍然担心。
有没有其他人在自己的应用程序中看到这个?
更大的瓷砖尺寸对我来说是一种工作,但是当我调整CATiledLayer的levelsOfDetailBias属性时,它将返回到制作小块瓷砖,并且需要永久加载。 closures细节偏移是不可接受的,因为放大视图需要锐利,所以我看了一些苹果的文档 – https://web.archive.org/web/20120323033735/developer.apple.com/library /ios/samplecode/ZoomingPDFViewer/Listings/Classes_PDFScrollView_m.html – 他们的build议之一是重写你的平铺视图的layoutSubviews方法,以便始终设置contentScaleFactor = 1。之后我唯一要做的就是每次调用setNeedsLayout scrollViewDidEndZooming被解雇。 这假设你正在使用UIScrollView。 我已经在我的iPad(第三代)和iPad2上testing过了,两者似乎都很好。 希望有所帮助。
示例代码 – 假设你是一个UIView子类,并用CATiledLayer覆盖视图的背景层 –
-(void)layoutSubviews{ [super layoutSubviews]; /* EDIT: After some additional experimentation, I Have found that you can modify this number to .5 but you need to check to make sure you are working on a 3rd gen iPad. This seems to improve performance even further. */ // Check if app is running on iPad 3rd Gen otherwise set contentScaleFactor to 1 self.contentScaleFactor = .5; }
然后假设您的视图控制器设置为UIScrollViewDelegate –
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{ //do any other stuff you may need to do. [view setNeedsLayout]; }
所有TiledLayers在iPad3上的performance都比在iPad2上糟糕 – 这一点在GoogleMaps应用程序中也是可见的。
但是,通过将以下更改添加到使用CATiledLayer的UIView类,可以获得最佳性能
- (id)initWithFrame:(CGRect)frame tileSize:(CGSize)tileSize { self = [super initWithFrame:frame]; if(self) { CATiledLayer *animLayer = (CATiledLayer *) self.layer; animLayer.levelsOfDetail = 5; animLayer.levelsOfDetailBias = 3; animLayer.tileSize = tileSize; // adjustments for retina displays if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) { animLayer.contentsScale = 1.0; self.contentScaleFactor = .5; animLayer.shouldRasterize = NO; animLayer.levelsOfDetailBias ++; } } return self; } - (void)layoutSubviews { [super layoutSubviews]; if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00) { self.contentScaleFactor = .5; } }
还有其他的select可以实现相同的效果,即增加tileSize,但性能会更差。
模拟器上的CATiledLayer性能似乎与实际新iPad上的性能无关。 在实际的硬件上testing。
即使在使用相同设置的情况下,CATiledLayer也会在新iPad上生成更多的贴图。 目前,我检测代码是否在雇员屏幕上运行(通过CALayer的contentScale属性),如果是,请设置更大的图块大小。
我会做更多的实验,并会在这里发表任何重要的发现。
请记住,它只是一个模拟器 ,它很可能是软件加速的。 另一方面,该设备是硬件加速和核心animation高度优化,因为只有很less的目标GPU寻找。
直到你检查你的新iPad本身的performance,我不会关心模拟器的结果。