CATiledLayer w symulatorze siatkówki iPada daje słabą wydajność

Mam nadzieję, że może to tylko problem z symulatorem, ale oczywiście mnie to martwi, ponieważ już złożyłem aplikacje zdolne do siatkówki i nie ma sposobu, aby przetestować go do 16.

Zaimplementowałem w aplikacji CATiledLayer do przeglądania bardzo dużych map. Płytki do mapy pochodzą z internetu, ale również są buforowane, więc zazwyczaj są ładowane bezpośrednio z urządzenia.

Na iPadzie 1 i iPad2 działa pięknie. Możesz tylko ledwo zauważyć kafelki są renderowane na iPadzie 2, nawet jeśli pochodzą z Internetu.

Na symulatorze iPada działa pięknie.

Moim problemem jest symulator siatkówki iPada. Wizualnie wygląda w porządku. Mapa ma odpowiedni rozmiar i łączy się z inną warstwą, której używam do wyświetlania nakładki danych, jednak ładuje się niesamowicie powoli. Przez większość czasu próbuję, nie ładuje żadnych płytek, dopóki nie zacznę przewijać, a następnie gdy jest ładuje płytki, to robi może 1 na sekundę i wygląda okropnie.

Nie mam kodu, który działałby inaczej na siatkówce niż ekran o standardowej rozdzielczości, więc mam nadzieję, że to tylko problem z symulatorem...ale nadal się martwię.

Czy ktoś jeszcze widział to w swoich aplikacjach?

Author: Alexsander Akers, 2012-03-14

4 answers

Większe rozmiary płytek były dla mnie jak najlepsze, jednak kiedy regulowałem właściwości levelsOfDetailBias CATiledLayer, wracało do robienia malutkich płytek i ładowanie trwało wieczność. Wyłączenie zniekształcania szczegółów było niedopuszczalne, ponieważ powiększanie widoku musiało wyglądać ostro, więc przejrzałem niektóre dokumenty Apple - https://web.archive.org/web/20120323033735/http://developer.apple.com/library/ios/samplecode/ZoomingPDFViewer/Listings/Classes_PDFScrollView_m.html - jedną z ich sugestii było nadpisanie metody layoutsubview w widoku kafelkowym, aby zawsze ustawić contentScaleFactor = 1. Jedyną rzeczą, którą musiałem zrobić po tym było wywołanie setNeedsLayout za każdym razem scrollViewDidEndZooming zwolniony. Zakładając, że używasz UIScrollView. Przetestowałem to na moim iPadzie (3rd Gen) i iPad2, oba wydają się działać bardzo dobrze. Mam nadzieję, że to pomoże.

Przykładowy kod-zakładając, że podklasujesz UIView i nadpisujesz warstwę wierzchnią widoku za pomocą 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;
    }

Następnie zakładając, że kontroler widoku jest ustawiony jako UIScrollViewDelegate -

    -(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{
        //do any other stuff you may need to do.
       [view setNeedsLayout];
    }
 14
Author: mzider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-08 16:57:24

Wydajność na ipad3 wszystkich Tiledlayerów jest gorsza niż na iPad2 - jest to również widoczne w aplikacji GoogleMaps.

Jednak najlepszą wydajność można uzyskać, dodając następujące zmiany do klasy UIView, która używa 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;
    }
}

Istnieją inne opcje, aby osiągnąć ten sam wynik wizualnie, tj. zwiększenie tileSize, ale wydajność będzie znacznie gorsza.

 4
Author: jfischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-16 06:26:02

Wydajność CATiledLayer na symulatorze wygląda zupełnie inaczej niż na nowym iPadzie. Test na rzeczywistym sprzęcie.

CATiledLayer generuje o wiele więcej płytek na nowym iPadzie niż na starszych urządzeniach, nawet przy użyciu tych samych ustawień. W tej chwili wykrywam, czy kod działa na ekranie hires (poprzez właściwość contentScale Calayera), a jeśli tak, ustaw większy rozmiar kafelka.

Będę robił więcej eksperymentów i będę zamieszczał wszelkie istotne ustalenia proszę.

 3
Author: Kenshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-18 20:40:48

Pamiętaj, że to tylko symulator i najprawdopodobniej przyspieszony programowo. Z drugiej strony, urządzenie jest przyspieszane sprzętowo, a animacja rdzenia jest wysoce zoptymalizowana, ponieważ istnieje tylko kilka docelowych GPU do szukania.

Dopóki nie sprawdzisz swojej wydajności na samym nowym iPadzie nie przejmowałbym się wynikami symulatora.

 0
Author: Bartosz Ciechanowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-13 21:30:59