iPad视网膜模拟器中的CATiledLayer性能较差



我希望这可能只是模拟器的问题,但这当然让我担心,因为我已经提交了支持视网膜的应用程序,直到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上检查你的性能,否则我不会关心模拟器的结果。

最新更新