Kada počnemo razvijati s Jetpack Composeom, lako nas zanese magija deklarativnih sučelja. Međutim, ako nismo oprezni, možemo završiti s aplikacijom koja se čini tromo ili pati od dosadnog mucanja. Ključ za glatko funkcioniranje leži u savladavanju... rekompozicija, taj proces u kojem Compose odlučuje koji dijelovi zaslona trebaju biti ažurirani kada se podaci promijene.
Optimizacija performansi nije stvar intuicije ili slijepog mijenjanja koda, već primjene... znanstveni pristupKako bismo postigli uistinu besprijekorno korisničko iskustvo, moramo shvatiti da se ne izvršava sav kod na isti način i da postoje specifični trikovi koji sprječavaju preopterećenje procesora na zadacima koji ne pružaju neposrednu vizualnu vrijednost.
Životni ciklus renderiranja u Composeu
Kako biste izbjegli lutanje u mraku, prvo morate razumjeti kako Compose crta sučelje. Sve se događa u tri faze: prvo faza sastavljanjagdje definirate koji se elementi prikazuju i stvarate stablo čvorova. Zatim dolazi faza projektiranja (izgled)koji je odgovoran za mjerenje komponenti i određivanje im točno gdje ih postaviti na ekranu. Konačno, dolazimo do faza renderiranja, što je trenutak kada se pikseli fizički crtaju.
Problem je u tome što je kompozicija daleko najskuplja faza. Ako se stanje promijeni i uzrokuje regeneraciju cijelog stabla, aplikacija će postati spora. Tajna profesionalaca je izolirati državu tako da se ponovno izgrade samo komponente kojima je nova vrijednost striktno potrebna, sprječavajući da kaskada ažuriranja dosegne dijelove korisničkog sučelja koji se nisu promijenili.
Strategije za smanjenje opterećenja procesora
Jedna od najčešćih zamki je izvođenje teških izračuna izravno unutar tijela kompozitnog objekta. Budući da se te funkcije mogu izvršiti bezbroj puta (čak i u svakom kadru animacije!), trebali bismo koristiti zapamtiti za spremanje rezultata u predmemoriju. Ako imate popis koji treba sortirati, nemojte to učiniti unutar LazyColumna; učinite to izvan njega i pohranite ga u memoriju kako bi se ponovno izračunao samo kada se izvorni podaci stvarno promijene.
Prilikom rada s popisima, važno je dodijeliti stabilni ključevi elementima. Bez njih, ako stavka promijeni položaj, Compose bi mogao pomisliti da su se svi sljedeći elementi promijenili i ponovno ih sastaviti. S jedinstvenim ključem, sustav razumije da se element jednostavno pomaknuo, ušteda vremena izvršenja znatno optimizirajući Izrada učinkovitih popisa pomoću LazyColumna.
Moć derivedStateOf i odgođenog čitanja
Ponekad se stanje mijenja tako brzo da pokreće besmislene rekompozicije. Tipičan primjer je pomicanje popisa. Ako želimo prikazati gumb "natrag na vrh" samo kada se korisnik malo pomakne prema dolje, ne zanima nas svaki piksel koji se pomiče, već samo ako je indeks prve vidljive stavke veći od nule. Ovdje izvedenoStanjeOf Priskače u pomoć, djelujući kao filter koji obavještava Compose samo kada se rezultat uvjeta promijeni, drastično smanjujući učestalost ažuriranja.
Još jedna napredna tehnika je odgoditi državna čitanjaUmjesto izravnog prosljeđivanja vrijednosti, možemo proslijediti lambda signal. Na taj način, očitavanje vrijednosti se ne događa tijekom faze sastavljanja, već se odgađa. Ako koristimo modifikatori temeljeni na lambda-oznakama (kao što je offset { ... } umjesto da offset(dp)), možemo preskočiti fazu kompozicije i dizajniranja i prijeći izravno na crtanje, što je prava prednost za performanse baterije i glatkoću rada.
Stabilnost podataka i zadani način rada
Compose je vrlo inteligentan i može preskočiti rekompoziciju ako zna da su ulazni parametri stabilni. Jedan tip je stabilan Ako je nepromjenjivo ili ako kompajler može jamčiti da ako se vrijednost nije promijenila, korisničko sučelje ne treba ažurirati. Ako koristite klase iz vanjskih biblioteka ili tipove koje Compose smatra nestabilnima, funkcija će se uvijek ponovno sastaviti, čak i ako su podaci isti.
Da bismo to riješili, možemo koristiti anotaciju @ Nepromjenjivo o @Stabilan u našim klasama podataka. Ako se kod nalazi u vanjskom modulu koji Compose kompajler ne koristi, možemo se poslužiti datoteka za konfiguraciju stabilnosti ručno označiti te pakete kao stabilne. Osim toga, omogućite način snažnog preskakanja U Gradleovoj konfiguraciji, Composeu je omogućeno korištenje jednakosti instanci za preskakanje funkcija čak i s nestabilnim parametrima, optimizirajući aplikaciju bez ikakvog diranja koda.
Dijagnoza i mjerenje s pravim alatima
Ne možemo optimizirati ono što ne možemo izmjeriti. Inspektor izgleda Osnovni alat Android Studija za otkrivanje "vrućih točaka" brojanjem rekompozicija je [naziv alata]. Ako vidite da se broj stalno povećava tijekom izvođenja jednostavne radnje, imate problem. Za dublju analizu koristite [naziv alata]. Makrobenchmark a Perfetto-ovi zapisnici vam omogućuju da točno vidite koliko vremena svaka funkcija troši u glavnoj niti.
Bitno je spriječiti glavna nit Zamrzava se kod teških zadataka. Učitavanje velikih slika s painterResource Registriranje sistemskih prijemnika može uzrokovati mikro prekide. Rješenje je premjestiti te operacije na korutine s Dispatchers.IO i, ako je moguće, uzdignuti državu tako što ćete SastavLokalno tako da su informacije dostupne u cijelom stablu bez potrebe za ručnim propuštanjem kroz svaki parametar, čime se čisti arhitektura sučelja.
Fluidna aplikacija zahtijeva ravnotežu između korištenja remember-a, ispravnog upravljanja stabilnošću klase i mogućnosti odgađanja stanja čitanja pomoću lambda funkcija kako bi se iskoristile faze dizajna i crtanja, uvijek se oslanjajući na alate za mjerenje kako bi se potvrdilo da svaka promjena stvarno smanjuje opterećenje sustava. Podijelite ovaj vodič i pomozite drugim korisnicima da ostanu informirani o ovoj temi.

