CATiledLayer в iPad Retina Simulator дает низкую производительность - PullRequest
10 голосов
/ 14 марта 2012

Я надеюсь, что, возможно, это просто проблема с симулятором, но, конечно, меня это беспокоит, так как я уже представил свои приложения, поддерживающие сетчатку глаза, и до 16-го числа нет возможности проверить это.

Iреализовал CATiledLayer в моем приложении для просмотра очень больших карт.Плитки для карты поступают из Интернета, однако они также кэшируются, поэтому, как правило, они на самом деле загружаются непосредственно с устройства.

На iPad 1 и iPad2 работает прекрасно.Вы можете едва заметить плитки, отображаемые на iPad 2, даже если они поступают из Интернета.

На iPad Simulator все работает прекрасно.

Моя проблема - симулятор сетчатки iPad.Визуально это выглядит хорошо.Карта имеет правильный размер и выравнивается с другим слоем, который я использую для отображения наложения данных, однако она загружается НЕВЕРОЯТНО медленно.В большинстве случаев, когда я пытаюсь, он не загружает никакие плитки до тех пор, пока я не начну прокручивать, затем, когда он равен , загружает плитки, он делает, возможно, 1 в секунду и выглядит ужасно.

IУ меня нет кода, который работал бы на сетчатке иначе, чем экран со стандартным разрешением, поэтому я надеюсь, что это просто проблема с симулятором ... но я все еще обеспокоен.

Кто-нибудь еще видел это в своих собственных приложениях?

Ответы [ 4 ]

14 голосов
/ 20 марта 2012

Большие размеры плиток работали для меня, однако, когда я настраивал свойство levelsOfDetailBias в CATiledLayer, это возвращалось к созданию крошечных плиток, и загрузка длилась бы вечно.Отключение смещения деталей было недопустимо, так как для увеличения резкости необходимо было увеличить масштаб изображения, поэтому я посмотрел на некоторые документы Apple - https://web.archive.org/web/20120323033735/http://developer.apple.com/library/ios/samplecode/ZoomingPDFViewer/Listings/Classes_PDFScrollView_m.html - и одним из их предложений было переопределить метод layoutSubviews вашего мозаичного представления, чтобы всегда устанавливатьthe contentScaleFactor = 1. Единственное, что я должен был сделать после этого, это вызывать setNeedsLayout каждый раз при запуске scrollViewDidEndZooming.Это предполагает, что вы используете 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;
    }

, а затем предполагаете, что ваш View Controller настроен как UIScrollViewDelegate -

    -(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{
        //do any other stuff you may need to do.
       [view setNeedsLayout];
    }
4 голосов
/ 16 июня 2012

Производительность на iPad3 всех TiledLayers хуже, чем на iPad2 - это также видно в приложении GoogleMaps.

Однако наилучшая производительность достигается при добавлении следующих изменений в ваш класс UIView, который использует CATiledLayer

- (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, но производительность будет намного хуже.

3 голосов
/ 19 марта 2012

Производительность CATiledLayer на симуляторе не похожа на производительность на новом iPad.Тест на реальном оборудовании.

CATiledLayer генерирует гораздо больше плиток на новом iPad, чем на старых устройствах, даже при использовании тех же настроек.В данный момент я определяю, выполняется ли код на экране найма (через свойство contentScale CALayer), и если да, устанавливаю больший размер плитки.

Я буду проводить больше экспериментов и опубликую любые существенные изменения.выводы здесь.

0 голосов
/ 14 марта 2012

Помните, это просто симулятор , и, скорее всего, он ускорен программно. С другой стороны, устройство имеет аппаратное ускорение, а Core Animation сильно оптимизирована, поскольку целевых графических процессоров для поиска мало.

Пока вы не проверите свою производительность на новом iPad, меня не будут беспокоить результаты симулятора.

...