Co uruchamia offscreen rendering, blending i layoutSubviews w iOS?
Excactly na co powinienem zwracać uwagę?
Chcę listę z jak największą liczbą przykładów. Lub listę najlepszych praktyk.
1 answers
Offscreen rendering / Rendering na CPU
[51]}największe wąskie gardła w wydajności grafiki to renderowanie poza ekranem i mieszanie-mogą występować dla każdej klatki animacji i mogą powodować wahania przewijania.Renderowanie Offscreen (renderowanie oprogramowania) ma miejsce, gdy konieczne jest wykonanie rysowania w oprogramowaniu (offscreen) przed przekazaniem go do GPU. Sprzęt nie obsługuje renderowania tekstu i zaawansowanych kompozycji z maskami i cienie.
Poniższe wywołają renderowanie poza ekranem:
Każda warstwa z maską (
layer.mask
)-
Dowolna warstwa z
layer.masksToBounds
/view.clipsToBounds
być prawdziwym Każda warstwa z
layer.allowsGroupOpacity
ustawioną na YES Ilayer.opacity
jest mniejsza niż 1.0
kiedy widok (lub warstwa) wymaga renderowania poza ekranem?Każda warstwa z cieniem (
layer.shadow*
).
Porady jak naprawić: https://markpospesel.wordpress.com/tag/performance/-
Każda warstwa z {[6] } Jest Prawdziwa
Dowolna warstwa z
layer.cornerRadius
,layer.edgeAntialiasingMask
,layer.allowsEdgeAntialiasing
-
Jakąkolwiek warstwę z
layer.borderWith
ilayer.borderColor
?
Brak odniesienia / dowodu Tekst (dowolny rodzaj, w tym
UILabel
,CATextLayer
,Core Text
, itp.).Większość rysunku wykonujesz
CGContext
WdrawRect:
. Nawet pusta implementacja będzie renderowana poza ekranem.
Mieszanie
resizableImage
Może powodować mieszanie.
unikanie warstw mieszanych podczas korzystania z resizableImages na iOS-
Każda warstwa, która nie jest
opaque
i mabackgroundColor
zalpha
mniej niż 1,0 -
Każda warstwa o
alpha
mniejszej niż 1,0 -
Każda warstwa z
layer.content
lub dowolnaUIImageView
zUIImage
posiadająca kanał alfa
Układ
The po uruchomieniu UIView zostanie wywołane następujące rzeczy: layoutSubviews
:
-
Zmiana
bounds
wyzwalaczy w tym samym widoku i superview -
Zmiana
frame
wyzwalaczy w tym samym widoku i superview -
Zmiana
transform
lublayer.transform
wyzwalaczy na superview
Uwaga: mam na myśli rzeczywiste zmiany, gdzie wartości faktycznie się zmieniają
Sprzeczne te zmiany nie wywołują layoutSubviews
, aby: center
, layer.position
, layer.zPosition
, layer.anchorPoint
, layer.anchorPointZ
.
Numer referencyjny: https://github.com/hfossli/LayoutSubviewsInconsistency
Ogólne wskazówki dotyczące poprawy wydajności
Często lepiej jest
blend
niżrender offscreen
.Rozważ użycie
drawRect:
zamiast widoku z wieloma etykietami i podglądami.Rysowanie w kolejce tła do
UIImage
lubCGImageRef
.Draw to a
CGLayer
(który jest buforowany lepiej naGPU
w porównaniu doUIImage
) i wciągnij w to, co chcesz.
Update, don ' t: http://iosptl.com/posts/cglayer-no-longer-recommended/-
Spłaszczyć swoją hierarchię
-
Ponowne użycie widoków – nie twórz i nie dodawaj nowych podczas przewijania
-
Mieć
opaque
widoki z jednolitym kolorem tła -
Unikaj ustawienia
alpha
ilayer.opacity
na mniej niż 1,0 WŁĄCZ
layer.shouldRasterize
(używaj ostrożnie). Lubię tego unikać. osobiście, ale w niektórych przypadkach działa szybciej, ponieważ rastry warstwy będą buforowane i ponownie używane. Pamiętaj, jeśli włączyszshouldRasterize
na warstwach, które często zmieniają zawartość lub zawartość podwarstw spowoduje spadek wydajności, ponieważ system iOS będzie rasteryzował warstwę na każdej z nich zmiana.
Linki
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
2017-05-23 12:10:36