2011-01-31 15 views
7

Dodaję kilka CALayerów jako podwarstwy warstwy UIView. Zawartość każdej warstwy jest innym obrazem pobranym z serwera. Każda warstwa jest animowana od poza ekranem do losowo generowanej pozycji. Dane obrazu są pobierane asynchronicznie. Każde zdjęcie ma wymiary około 300 x 300 lub mniejsze.Optymalizacje CALayer?

W wyniku losowego umieszczenia warstwy nakładają się, a niektóre są zasłaniane przez warstwy nad nimi. To wszystko jest dobre.

Usuwam warstwy, które całkowicie zasłaniają widok za pomocą sugestii w the answer to this question. Obliczenia w celu określenia pokrycia występują w oddzielnym wątku.

Mam narzędzie UIPanGestureRecognizer, które umożliwia użytkownikowi przeciąganie warstw na ekranie.

Występuje problem z wydajnością, gdy liczba warstw dodaje podejścia 25-30 i stopniowo się pogarsza. Animacje stają się nierówne i często są całkowicie nieobecne (nowo dodane warstwy pojawiają się w końcowej pozycji). A gesty panoramy są ignorowane lub powodują raptowne przesunięcie wybranej warstwy.

Przypuszczam, że zabijam GPU z nakładającymi się warstwami i kolejną warstwą animującą się powyżej?

Wszelkie sugestie dotyczące poprawy wydajności?

Najlepsze metody postępowania z dużą liczbą warstw?

Czy lepiej jest, aby warstwa była animowana w oddzielnym view.layer niż poprzednio dodane warstwy?

Dzięki!

Odpowiedz

4

Kilka szybkich rzeczy do sprawdzenia.

Uruchom instrument Core Animation i poszukaj krycia. Samo ustawienie nieprzezroczystej flagi warstwy na TAK to za mało, jeśli obraz bazowy ma komponent alfa, warstwa weźmie to pod uwagę.

Jeśli dane otrzymywane od twojego serwera mają alfa, powinieneś przerysować za pomocą kwarcu i zapisać plik lokalnie w nowym formacie, który nie zawiera alfa.

Upewnij się, że nie umieszczasz obrazów 1 megapiksela w płytkach 100x100. Również Core Animation Instrument, włączanie "Color Misaligned Images" i poszukaj żółtego.

30 do 50 warstw nie powinno stanowić problemu.

+0

Dzięki Bill. Dam ci szansę. Miałem wrażenie, że nieprzezroczystość została zignorowana podczas dostarczania layer.contents (używane tylko podczas rysowania warstwy?). Bit alpha będzie trudniejszy - używam przezroczystego obramowania o szerokości 2 pikseli wokół krawędzi obrazów, aby wygładzić obrócone krawędzie. Off do instrumentów !! – TomH

+0

Witaj Tom - yep nieprzezroczysty jest ignorowany, chyba że rysunek, możesz myśleć o nim jako o drugim argumencie do UIGraphicsBeginImageContextWithOptions, jeśli twoja zawartość ma kanał alfa, wtedy warstwa będzie przezroczysta - jeśli masz czas, zgłoś błąd na temat krawędzi flagi'AmitaliasingMask –

+1

Niesamowite.Dodałem kanał alfa do mojego UIImage, dodając przezroczystą obramowanie 2px, a następnie używając obrazu jako zawartości dla warstwy. Perf został znacznie poprawiony, nie dodając alfa i przezroczystej krawędzi - bez problemów z> 30 warstwami. Niestety, krawędźAntialiasingMask nie ma żadnego efektu. Złożę błąd. – TomH

3

Jeśli wszystkie warstwy nie mieszczą się w pamięci procesora lub części pamięci, rzeczy spowolnią się znacznie. Załadowanie i wyładowanie pamięci GPU jest dość powolne w porównaniu z warstwami kompozycyjnymi w pamięci GPU. Musisz eksperymentować z tym limitem pamięci, ponieważ starsze urządzenia mają mniej dostępnej pamięci GPU niż nowsze urządzenia.