我希望这可能只是模拟器的问题,但这当然让我担心,因为我已经提交了支持视网膜的应用程序,直到16日才可以测试它。
我在我的应用程序中实现了一个CATiledLayer来查看非常大的地图。地图的瓦片来自互联网,但它们也会被缓存,因此,通常情况下,它们实际上是直接从设备加载的。
在iPad1和iPad2上,它运行得很好。你几乎无法注意到iPad2上渲染的瓷砖,即使它们来自互联网。
在iPad模拟器上,它运行得很好。
我的问题是iPad视网膜模拟器。从视觉上看还可以。地图的大小合适,并与我用来显示数据覆盖的另一层对齐,但加载速度非常慢。大多数时候,在我尝试之前,它根本不会加载任何磁贴,直到我开始滚动,然后当加载磁贴时,它可能每秒加载1次,看起来很糟糕。
我没有在视网膜上运行的代码与标准分辨率屏幕不同,所以我希望这只是模拟器的问题。。。但我还是很担心。
其他人在自己的应用程序中看到过这一点吗?
更大的瓦片大小对我来说是可行的,但当我调整CATiledLayer的levelsOfDetailBias属性时,它会回到制作小瓦片的过程中,并且需要很长时间才能加载。关闭细节偏移是不可接受的,因为放大视图需要看起来清晰,所以我看了一些苹果的文档https://web.archive.org/web/20120323033735/http://developer.apple.com/library/ios/samplecode/ZoomingPDFViewer/Listings/Classes_PDFScrollView_m.html-他们的建议之一是覆盖平铺视图的layoutSubviews方法,以始终设置contentScaleFactor=1。在那之后,我唯一要做的就是每次启动scrollViewDidEndZooming时调用setNeedsLayout。这是假设您使用的是UIScrollView。我已经在我的iPad(第三代)和iPad2上测试过了,两者似乎都运行得很好。希望能有所帮助。
示例代码-假设您正在对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上的性能都比iPad2差,这在谷歌地图应用程序中也可以看到。
然而,通过将以下更改添加到使用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;
}
}
还有其他选项可以在视觉上达到同样的效果,即增加瓷砖尺寸,但性能会差得多。
CATiledLayer在模拟器上的性能似乎与实际的新iPad完全不同。在实际硬件上进行测试。
CATiledLayer在新iPad上生成的磁贴比在旧设备上生成的要多得多,即使使用相同的设置也是如此。目前,我检测代码是否在招聘屏幕上运行(通过CALayer的contentScale属性),如果是,请设置更大的平铺大小。
我将做更多的实验,并将在这里发布任何重要的发现。
记住,它只是一个模拟器,很可能是软件加速的。另一方面,该设备是硬件加速的,核心动画是高度优化的,因为只有很少的目标GPU可以寻找。
除非你在新iPad上检查你的性能,否则我不会关心模拟器的结果。