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!
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
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 –
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