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?
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];
}
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.
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ę.
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.
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