2012-04-15 22 views
14

Buduję aplikację zawierającą UIWebView zawierającą dużą liczbę obrazów, CSS, osadzone wideo i obsługę znaczników JavaScript. Wydajność przewijania to stuttery i szukam wglądu w najbardziej skuteczne sposoby, aby to poprawić.Sposoby poprawy wydajności przewijania UIWebView?

Która z poniższych cech powoduje przewijanie opóźnionego UIWebView? Jakie inne czynniki mogą utrudniać wydajność?

  • Ilość obrazów
    • powinienem być usunięcie obrazów z DOM jako użytkownik przewija obok nich i dodając je z powrotem, jeśli przewijać z powrotem?
  • Rozmiar obrazów
      zdjęć
    • Will Retina jakości w widoku internetowej wpływają na wydajność przewijania dużo więcej niż mniejsze wersje chciał?
  • Obraz skalowania
    • byłaby zmiana rozmiaru obrazów przed czasem robi dużą różnicę, zamiast polegać na widoku WWW do skali na podstawie deklaracji, jak width: 100%;?
  • CSS
    • mam unikać box-shadow, ale istnieją inne właściwości CSS, które znane są również niekorzystnego wpływu na wydajność przewijania?

Jeśli są jakieś inne środki i narzędzia, które mogą być wykorzystywane do profilowania, mam usłyszeć o nich.

Odpowiedz

1

Jakiś czas temu miałem podobny problem. Zauważyłem, że umieszczenie widoku web wewnątrz przewijania znacznie poprawia wydajność przewijania. Po zakończeniu ładowania strony internetowej wyłączam przewijanie w widoku internetowym, ustaw ramkę widoku na przeglądarkę, a zawartość scrollview w contentSize na rozmiar treści widoku.

-(void) webViewDidFinishLoad:(UIWebView *)webView { 
    float size = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue]; 
    [self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, size)]; 
    [webView setFrame:CGRectMake(webView.frame.origin.x, 
           webView.frame.origin.y, 
           webView.frame.size.width, 
           size)]; 

    [(UIScrollView*)[webView.subviews objectAtIndex:0] setScrollEnabled:NO]; 
} 

jestem przy założeniu, że nie WebView załadować obraz, aż ma się pojawić na ekranie, który spowodował jąkanie i umieszczając go w Scrollview i ustawienie ramki do rozmiaru nim zawartości musi załadować je z wyprzedzeniem, ale nie jestem pewien. Jestem również pewien, że ma to konsekwencje (np. Zwiększone wykorzystanie pamięci z góry), ale nigdy nie miałem żadnych problemów z robieniem tego w ten sposób.

+3

nie mogę jeszcze w dół głos, ale jest to poważny nie-nie. To rozwiązanie powoduje, że cały webView jest wciągany w jego CALayer (unieważniający mechanizm wyświetlania kafelków UIWebView), powodując ogromne zużycie pamięci. Opis jego stron, "zawierający dużą liczbę obrazów, CSS, osadzonego wideo i przewijanie kodu JavaScript", spowodowałby nadmierną ilość pamięci w aplikacji. –

+2

Więc mówisz, że wymieniłem pamięć na wydajność? To było coś, co wymyśliłem. Zgadzam się, że to nie jest świetne rozwiązanie, ale był to jedyny sposób na ulepszenie przewijania. A biorąc pod uwagę, że dokładnie wiedziałem, co zostanie załadowane do webview z wyprzedzeniem, a wszystkie zasoby zostały dołączone do aplikacji, nie miałem problemu z robieniem tego w ten sposób. – rjowens

+1

Ten rodzaj handlu jest bardzo niebezpieczny w przypadku UIWebView, ponieważ rośnie w pamięci bardzo szybko i agresywnie. A gdy zawartość stanie się większa i bardziej złożona, wkrótce znajdziesz zaporę na didReceiveMemoryWarning-s i ostatecznie zawiesza się. –

8

Jest to odpowiedź dostałem od firmy Apple Developer pomocy technicznej jakiś czas temu:

W tej chwili nie oferujemy żadnych mechanizmów w celu optymalizacji renderingu UIWebView. Powód, dla którego widzisz różnicę, wynika z tego, że Mobile Safari i UIWebView nie używają tego samego silnika renderującego.

Wydajność zależy od załadowanej treści. Jeśli używane są javascripts lub wtyczki, może to utrudnić działanie.

Polecam złożyć raport o błędzie pod numerem http://developer.apple.com/bugreporter/ opisujący Twoją sytuację. Dzięki temu będziesz na bieżąco informować o statusie raportu o błędzie.

Możliwą alternatywą dla UIWebView będzie open-source DTCoreText biblioteka: https://github.com/Cocoanetics/DTCoreText, który napędza App Float Reader: http://itunes.apple.com/us/app/float-reader/id447992005?mt=8

+0

Wiem, że wydajność zależy od załadowanej treści. Rozumiem, że zmiany w mojej zawartości (np. Mniejsze obrazy, mniej obrazów, unikanie niektórych właściwości CSS itp.) Będą miały największy wpływ. –

Powiązane problemy