Вопрос по retina-display, ipad, catiledlayer, ios – CATiledLayer в iPad Retina Simulator дает низкую производительность

10

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

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

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

На симуляторе iPad работает прекрасно.

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

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

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

Ваш Ответ

4   ответа
0

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

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

У меня есть ipad3, и вы должны быть обеспокоены. Заметно хуже производительность. Ralphleon
IPad 3 намного лучше, чем симулятор ... но да, он кажется медленнее, чем iPad 2. Greg Maletic
3

новом iPad. Тест на реальном оборудовании.

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

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

Я не думаю, что вам нужно изменить ваши изображения плитки. Возможно, вам просто нужно явно установить свойство tileSize в CATiledLayer на больший размер, когда код выполняется на дисплее высокого разрешения. Kenshi
Спасибо - я нашел то же самое, и проблема с моим приложением состоит в том, что оно отображает 4 раза плитки. Да, это выглядит чётко, но когда обычный пользователь держит мое приложение на iPad 3 рядом с iPad 1 и отображает карту - iPad 1 превосходит iPad 3 с большим отрывом при отображении карты. Есть ли способ изменить это поведение без изменения мозаичных изображений? (У меня есть сотни тысяч плиток). Brodie
4

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

Обратите внимание на мой комментарий выше: если для параметра contentScaleFactor установлено значение .5, слой будет отображаться с разрешением iPad 2 (не сетчатки), что может быть неприемлемым для многих из нас. dkmp
14

однако, когда я настраивал свойство levelsOfDetailBias в CATiledLayer, это возвращалось к созданию крошечных плиток, и загрузка длилась бы вечно. Отключение смещения деталей было недопустимо, поскольку для увеличения масштаба необходимо было увеличить изображение, поэтому я посмотрел некоторые документы Apple -https://web.archive.org/web/20120323033735/http://developer.apple.com/library/ios/samplecode/ZoomingPDFViewer/Listings/Classes_PDFScrollView_m.html - и одним из их предложений было переопределить метод layoutSubviews вашего плиточного представления, чтобы всегда устанавливать 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];
    }
Я пробую это, но я не вижу никакой разницы? Должно ли это иметь такой же эффект, как удвоение плиток, а затем эффективное отрицание отображения сетчатки? Brodie
IOS говорит обрабатывать размеры плиток, как это обычно делается на дисплеях без сетчатки, вместо того, чтобы пытаться масштабировать их, хотя это может быть не так в зависимости от вашей реализации. Одна вещь, которую вы должны перепроверить, это размер мозаики, вам все равно нужно будет увеличить его до 1024X1024, и, если это PDF-файл, который вы отображаете, время рендеринга может варьироваться в зависимости от размера и качества PDF. В моей реализации некоторые PDF-файлы открываются быстрее и меньше, чем другие, я все еще пытаюсь понять, почему это так. Если вы разместите какой-то код, я буду более чем счастлив взглянуть на него. mzider
@Altealice Вы можете найти их предложение в примере ZoomingPDFViewer -bit.ly/JwA1YD Точная цитата такова: «// чтобы справиться с взаимодействием между CATiledLayer и экранами с высоким разрешением, нам нужно вручную установить // contentScaleFactor представления мозаичного изображения на 1.0. (Если мы опускаем это, это будет 2.0 на экранах с высоким разрешением, / / что заставит CATiledLayer запрашивать у нас плитки неправильных масштабов.) pdfView.contentScaleFactor = 1.0; " mzider
@mzider, можете ли вы дать ссылку на документы Apple, где вы видели это предложение? Спасибо! Altealice
Это не работает для нас. Надеюсь, кто-то может поделиться больше решений. Manny

Похожие вопросы