在iPad Retina模拟器中使用CATiledLayer性能差劲。

10

我希望这只是模拟器的问题,但当然让我有点担心,因为我已经提交了支持视网膜屏幕的应用程序,而在 16 号之前无法进行测试。

我在我的应用程序中实现了 CATiledLayer,用于查看非常大的地图。地图瓦片来自于互联网,但它们也被缓存,因此通常实际上是直接从设备加载它们。

在 iPad1 和 iPad2 上它工作得很好。即使从互联网上获取瓦片,你也只能轻微地注意到瓦片正在呈现在 iPad2 上。

在 iPad 模拟器上它工作得很好。

我的问题是 iPad 视网膜模拟器。从视觉上看,它看起来还可以。地图的大小适当,并与我用来显示数据叠加的另一图层相对应,但加载速度非常慢。大多数时候我尝试,它都无法加载任何瓷砖,直到我开始滚动,然后当它正在加载瓷砖时,速度可能只有每秒钟 1 块,看起来很糟糕。

我没有任何代码会在视网膜显示屏上与标准分辨率屏幕运行不同,因此我希望这只是模拟器的问题...但我仍然担心。

其他人有看到自己应用程序中的这个问题吗?

4个回答

14

对于我来说,使用更大的瓷砖大小似乎有些效果,但是当我调整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];
    }

这对我们不起作用。希望有人能分享更多的解决方案。 - Manny
@mzider,你能给个你看到这个建议的苹果文档链接吗?谢谢! - Altealice
1
@Altealice 你可以在ZoomingPDFViewer示例中找到他们的建议 - http://bit.ly/JwA1YD 具体引用如下 - "//为了处理CATiledLayer和高分辨率屏幕之间的交互,我们需要手动将平铺视图的contentScaleFactor设置为1.0。(如果省略此步骤,则在高分辨率屏幕上它将是2.0,这将导致CATiledLayer要求我们提供错误比例的瓦片。)pdfView.contentScaleFactor = 1.0;" - mzider
@Manny,我发现你可以尝试使用contentScaleFactor进行实验。我最终将其降至0.5,只是为了看看性能是否更好,并且我立即注意到了改进。但是,您需要确保应用程序在第三代iPad上运行,因为在iPad2上它会显得模糊。同样,这可能取决于您的实现方式,以及您正在平铺什么、您的LOD以及LOB,您的结果也会有所不同。否则,我唯一做的就是在父视图框架的CGRect中布置子视图。希望这可以帮助到您。 - mzider
自然地,将contentScaleFactor降低到0.5会提高性能:这会导致以1.0的CSF呈现1/4像素。但是,如果你实际上查看结果,你会注意到模糊、断断续续的文本和图像,因为你是在非视网膜(iPad 2)分辨率下呈现。更快,是的,但看起来不太好。 - dkmp
显示剩余2条评论

4
所有TiledLayer在iPad3上的表现都比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;
    }
}

还有其他选项可以在视觉上达到相同的结果,比如增加tileSize,但性能会更差。


1
请注意我的上面的评论:将contentScaleFactor设置为0.5会导致图层以iPad 2(非Retina)分辨率呈现,这可能不被我们中的许多人接受。 - dkmp

3

CATiledLayer的模拟器性能与实际新iPad上的性能不一样。请在实际设备上测试。

CATiledLayer在新的iPad上生成比旧设备更多的图块,即使使用相同的设置。目前,我通过CALayer的contentScale属性检测代码是否在高分辨率屏幕上运行,如果是,则设置更大的图块大小。

我将进行更多的实验,并在这里发布任何重要的发现。


1
谢谢 - 我也发现了同样的问题,我的应用程序问题是它显示了4倍的瓷砖。是的,它看起来很清晰,但当一个普通用户将我的应用程序放在iPad 3上并将其与iPad 1一起显示地图时,iPad 1在显示地图方面远远胜过iPad 3。有没有办法在不修改瓷砖图像的情况下更改此行为?(我有成千上万的瓷砖)。 - Brodie
我认为您不需要修改瓷砖图像。当代码在高分辨率显示器上运行时,您可能只需要显式地将CATiledLayer的tileSize属性设置为更大的尺寸。 - Kenshi

0

请记住,这只是一个模拟器,很可能是软件加速的。另一方面,设备是硬件加速的,核心动画高度优化,因为只有少数目标GPU可供选择。

在您检查新iPad本身的性能之前,不必担心模拟器结果。


4
我有一台iPad3,你应该担心了。明显的性能变差。 - Ralphleon
iPad 3比模拟器好得多...但是,它似乎比iPad 2慢。 - Greg Maletic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接