10

我希望这可能只是模拟器的一个问题,但当然这让我很担心,因为我已经提交了支持视网膜的应用程序,直到 16 日才有办法对其进行测试。

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

在 iPad 1 和 iPad2 上,它运行良好。您几乎无法注意到 iPad 2 上正在渲染的图块,即使它们来自互联网。

在 iPad 模拟器上,它运行良好。

我的问题是 iPad 视网膜模拟器。从视觉上看,它看起来还不错。地图大小合适,并与我用来显示数据叠加层的另一层对齐,但加载速度非常慢。在我尝试的大部分时间里,它根本不会加载任何图块,直到我开始滚动,然后当它加载图块时,它可能每秒 1 次,看起来很糟糕。

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

有没有其他人在他们自己的应用程序中看到过这个?

4

4 回答 4

14

更大的瓷砖尺寸对我来说有点用,但是当我调整 CATiledLayer 的 levelsOfDetailBias 属性时,它会重新制作小瓷砖,并且需要永远加载。关闭细节偏差是不可接受的,因为放大需要看起来清晰的视图,所以我查看了一些 Apple 的文档 - 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(第 3 代)和 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];
    }
于 2012-03-20T12:47:15.730 回答
4

所有 TiledLayers 在 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;
    }
}

There are other options to achieve the same result visually ie increasing tileSize but the performance will be much worse.

于 2012-06-16T06:26:02.110 回答
3

模拟器上的 CATiledLayer 性能似乎与实际的新 iPad 上的性能完全不同。在实际硬件上进行测试。

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

我会做更多的实验,并会在这里发布任何重要的发现。

于 2012-03-18T20:22:59.883 回答
0

请记住,它只是一个模拟器,而且很可能是软件加速的。另一方面,该设备是硬件加速的,Core Animation 是高度优化的,因为只有很少的目标 GPU 可供寻找。

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

于 2012-03-13T21:30:59.477 回答