Na ovoj stranici

Profiling QML aplikacija

Pomoću alata QML Profiler možete pronaći uzroke uobičajenih problema s performansama u vašim aplikacijama, kao što su usporenost i neodzivni, zastajkujući korisnički sučelja. Tipični uzroci uključuju izvođenje previše JavaScripta u premalom broju sličica. Sav JavaScript mora završiti izvršavanje prije nego što GUI nit može nastaviti, a sličice se odgađaju ili izostavljaju ako GUI nit nije spremna.

Još jedan tipičan uzrok sličnih problema s performansama je stvaranje ili ažuriranje nevidljivih stavki, što oduzima vrijeme na GUI niti.

Pokretanje dugotrajnih C++ funkcija, kao što su metode crtanja i rukovatelji signalima, također oduzima vrijeme na GUI niti, ali ih je teže uočiti u QML Profiler jer on ne profilira C++ kod.

Kako biste pronašli pretjeranu upotrebu JavaScripta, provjerite brzinu sličica u animacijama i događajima Scene Grapha, potražite praznine i provjerite ponaša li se aplikacija kako se očekuje. Kategorija JavaScript prikazuje vrijeme izvođenja funkcija, koje biste trebali pokušati održati ispod 16 ms po sličici.

Za otkrivanje problema uzrokovanih rukovanjem nevidljivim stavkama potražite ispuštene sličice i provjerite ne koristite li previše kratkih veza ili rukovatelja signalima koji se ažuriraju po sličici. Također možete vizualizirati precrtavanje Scene Graph-a kako biste provjerili raspored scene i pronašli stavke koje korisnicima nikada nisu vidljive jer se nalaze izvan zaslona ili su skrivene ispod drugih, vidljivih elemenata.

Ako se frameovi gube iako se JavaScript ne izvršava te postoje velike, neobjašnjive praznine na vremenskoj crti, provjerite svoje prilagođene implementacije QQuickItem a. Možete koristiti Valgrind Callgrind ili druge profilere opće namjene za analizu C++ koda.

Možete koristiti praćenje cijelog stoga (full stack tracing ) za praćenje od najviše razine QML-a ili JavaScript koda do C++-a i sve do prostora jezgre. Prikupljene podatke možete pregledati u Chrome Trace Format Viewer.

Analiza prikupljenih podataka

Prikaz Timeline prikazuje grafičke prikaze izvršavanja QML-a i JavaScript koda te sažet prikaz svih zabilježenih događaja.

QML profiler

Svaki redak u vremenskoj crti (6) opisuje vrstu QML događaja koji su snimljeni. Premjestite pokazivač na događaj u retku kako biste vidjeli koliko traje i gdje se poziva u izvornoj kodi. Kako biste prikazali informacije samo kada je događaj odabran, isključite View Event Information on Mouseover (4).

Jump to Previous Event Jump to Next Event Okvir (10) sažima razdoblje za koje su prikupljeni podaci. Povucite raspon zumiranja (8) ili kliknite na okvir kako biste se pomaknuli unutar njega. Također se možete kretati između događaja odabirom gumba za pomicanje naprijed i natrag (1).

Odaberite Show Zoom Slider (2) za otvaranje klizača koji postavlja razinu zumiranja. Također možete povući ručke za zumiranje (9). Za resetiranje zadane razine zumiranja, kliknite desnom tipkom miša na vremensku crtu kako biste otvorili kontekstualni izbornik i odaberite Reset Zoom.

Odaberite vremensku ravnalu kako biste dodali vertikalne linije orijentacije (5) na vremensku crtu.

Odabir raspona događaja

Odaberite raspon događaja (7) kako biste vidjeli brzinu sličica događaja i usporedili je s brzinom sličica sličnih događaja. Odaberite Select Range (3) za aktiviranje alata za odabir. Zatim kliknite na vremenskoj crti kako biste odredili početak raspona događaja. Povucite ručku za odabir kako biste definirali kraj raspona. Duljina raspona označava brzinu sličica događaja.

Za mjerenje kašnjenja između dva uzastopna događaja postavite raspon događaja između kraja prvog događaja i početka drugog događaja. Polje " Duration " (3) prikazuje kašnjenje između događaja u milisekundama.

Za zumiranje raspona događaja dvaput kliknite na njega.

Za sužavanje trenutnog raspona u prikazima Timeline, Statistics i Flame Graph, kliknite desnom tipkom miša na raspon i odaberite Analyze Current Range. Za povratak na cijeli raspon, u kontekstnom izborniku odaberite Analyze Full Range.

Za uklanjanje raspona događaja zatvorite dijalog Selection.

Razumijevanje podataka

Općenito, događaji u prikazu vremenske crte pokazuju koliko je dugo trajalo izvršavanje QML-a ili JavaScripta. Pređite mišem preko njih da biste vidjeli detalje. Za većinu događaja oni uključuju lokaciju u izvornoj kodi, trajanje i neke relevantne dijelove same izvorne koda.

Odaberite događaj kako biste premjestili pokazivač u uređivaču koda na dio koda s kojim je događaj povezan.

Sljedeće vrste događaja prikazuju se u prikazu vremenske crte na jednom ili više redaka.

Kategorija događajaOpis
Pixmap CachePrikazuje ukupnu količinu keširanih pixmap podataka, u pikselima. Osim toga, prikazuje zaseban događaj za svaku učitavanu sliku, sa specifičnostima o nazivu datoteke i veličini.
Scene GraphPrikazuje vrijeme kada se okviri grafa scene renderiraju i neke dodatne informacije o vremenu za različite faze koje se pri tome izvršavaju.
Memory UsagePrikazuje alokacije blokova upravitelja memorije za JavaScript. Općenito, upravitelj memorije rezerve veće blokove memorije odjednom, a zatim ih kasnije dodjeljuje aplikaciji u manjim dijelovima. Ako aplikacija zatraži pojedinačne blokove memorije koji premašuju određenu veličinu, upravitelj memorije će ih alocirati zasebno. Ta dva načina rada prikazana su kao događaji različitih boja. Drugi red prikazuje stvarnu upotrebu dodijeljene memorije. To je količina JavaScript heapa koju je aplikacija zapravo zatražila.
Input EventsPrikazuje događaje miša i tipkovnice.
PaintingNije korišteno.
AnimationsPrikazuje broj animacija koje su aktivne i brzinu s kojom se izvršavaju. Niti za iscrtavanje animacija prikazane su u zasebnom retku.
CompilingPrikazuje vrijeme provedeno na kompajliranju QML datoteka.
CreatingPrikazuje vrijeme potrebno za stvaranje elemenata u sceni. Stvaranje elemenata odvija se u dvije faze. Prva faza služi za stvaranje podatkovnih struktura, uključujući podređene elemente. Druga faza predstavlja pozive za dovršetak. Međutim, ne aktiviraju svi elementi pozive za dovršetak. Faze su prikazane kao odvojeni događaji na vremenskoj crti.
BindingPrikazuje vrijeme kada se veza evaluira i koliko dugo traje evaluacija.
Handling SignalPrikazuje vrijeme kada se signal obrađuje i koliko dugo traje obrada.
JavaScriptPrikazuje vrijeme provedeno na izvršavanju stvarnog JavaScript koda iza veza i ručitelja signala. Popisuje sve JavaScript funkcije koje možda koristite za evaluaciju veza ili obradu signala.
Quick3DPrikazuje vrijeme provedeno na iscrtavanju okvira s vezama ( Qt Quick 3D ), vremenske informacije za pripremu i sinkronizaciju okvira, vremena ažuriranja sustava čestica i broj ažuriranja čestica, kao i dodjele memorije i potrošnju memorije za teksture i mreže (mesh).

Ova vrsta događaja dostupna je od Qt 6.3.

Analiziranje događaja scene grafa

Da biste razumjeli kategoriju scene grafa, pročitajte više o tome kako Qt Quick scene graf funkcionira u Qt Quick Scene Graph i Qt Quick Scene Graph Default Renderer. Sljedeći se događaji izvještavaju u kategoriji Scene Graph. Nisu svi događaji generirani od strane svih render-petlji. U Windows i Basic render-petljama sve se odvija u istoj niti i razlika između GUI niti i render-niti je besmislena.

Postavite varijablu okruženja QSG_RENDER_TIMING kako biste dobili tekstualni izlaz sličnih, ali neznatno različitih mjerenja vremena aplikacije koja se profilira. Razlike su navedene u nastavku.

Tip događajaNitVrste render-petljiOznaka u izlazu naredbe QSG_RENDER_TIMINGOpis
PolishGUIVišenitni, Osnovni, WindowspolishZavršna dorada stavki prije njihovog iscrtavanja pomoću QQuickItem::updatePolish().
GUI Thread WaitGUIVišenitnilockIzvršavanje slotova povezanih sa signalom QQuickWindow::afterAnimating() i zatim zaključavanje mutexa render-thread-a prije čekanja na isti mutex u GUI Thread Sync. Ako se ovo pokrene znatno prije Render Thread Sync, u GUI-threadu postoji slobodno vrijeme koje biste mogli iskoristiti za izvođenje dodatnog QML-a ili JavaScript koda.
GUI Thread SyncGUIVišenitniblockedForSyncVrijeme dok je GUI nit blokirana čekajući render nit.
AnimationsGUIVišenitni, WindowsanimationsNapredovanje animacija u GUI niti. Osnovna render-petlja ne pokreće animacije sinkrono s renderiranjem. Zato se pri korištenju osnovne render-petlje neće prikazivati događaji animacije. Pogledajte kategoriju " Animations " da biste vidjeli vremensko trajanje animacije u ovom slučaju.
Render Thread SyncRenderiranjeVišenitni, Osnovni, WindowsFrame rendered ... syncSinkronizacija QML stanja u graf scenu koristeći QQuickItem::updatePaintNode().
RenderRenderVišenitni, Osnovni, WindowsFrame rendered ... renderRender Render Ukupno vrijeme potrebno za iscrtavanje okvira, uključujući pripremu i učitavanje svih potrebnih podataka na GPU. Ovo je bruto vrijeme iscrtavanja. Nemojte ga miješati s neto vremenom iscrtavanja u nastavku.
SwapRenderiranjeVišenitni, Osnovni, WindowsFrame rendered ... swapZamjena okvira nakon renderiranja.
Render PreprocessRenderiranjeVišenitno, Osnovno, Windowstime in renderer ... preprocessPozivanje funkcije QSGNode::preprocess() na svim čvorovima koje je potrebno predobradi­ti. Ovo je dio grubog koraka Render.
Render UpdateRenderVišenitni, Osnovni, Windowstime in renderer ... updatesPonavljajući i obrađujući sve čvorove u grafu scene kako bi se ažurirala njihova geometrija, transformacije, prozirnost i ostalo stanje. U fazi Render Thread Sync, svaki se čvor ažurira zasebno sa stanjem s GUI niti. U fazi Render Update, svi se čvorovi kombiniraju kako bi se stvorila konačna scena. Ovo je dio grubog koraka Render.
Render BindRenderiranjeVišenitni, Osnovni, Windowstime in renderer ... bindingPovezivanje ispravnog framebuffera za OpenGL renderiranje. Ovo je dio grubog koraka Render.
Render RenderRenderiranjeThreaded, Basic, Windowstime in renderer ... renderingStvarni proces slanja svih podataka na GPU putem OpenGL-a. Ovo je dio grubog koraka Render.
Material CompileRenderiranjeThreaded, Basic, Windowsshader compiledKompilacija GLSL shader programa.
Glyph RenderRenderiranjeParalelno, Osnovno, Windowsglyphs ... renderingRenderiranje glifova fonta u teksture.
Glyph UploadRenderiranjeVišekernično, Osnovno, Windowsglyphs ... uploadUčitavanje tekstura glifova na GPU.
Texture BindRenderiranjeVišenitni, Osnovni, Windowsplain texture ... bindPovezivanje teksture u OpenGL kontekstu pomoću glBindTextures.
Texture ConvertRenderParalelno, Osnovno, Windowsplain texture ... convertKonverzija formata i smanjenje veličine slike kako bi bila prikladna za upotrebu kao tekstura.
Texture SwizzleRenderiranjeVišenitni, Osnovni, Windowsplain texture ... swizzleSwizzlanje podataka teksture na CPU-u ako je potrebno.
Texture UploadRenderiranjeVišenitni, Osnovni, Windowsplain texture ... upload / atlastexture uploadedUčitavanje podataka teksture na GPU.
Texture MipmapRenderiranjeVišenitni, Osnovni, Windowsplain texture ... mipmapMipmapping teksture na GPU-u.
Texture DeleteRenderiranjeVišenitni, Osnovni, Windowsplain texture deletedBrisanje teksture s GPU-a koja je postala nepotrebna.

Analiziranje događaja Qt Quick 3D

Slijedi popis događaja za Qt Quick 3D. Svaki renderirani kadar sastoji se od faza sinkronizacije, pripreme i renderiranja, koje se izvršavaju tim redoslijedom. Sinkronizacija se događa u fazi sinkronizacije scene grafa, dok priprema i renderiranje slijede u fazi renderiranja scene grafa.

Postavite varijablu okruženja QSG_RENDERER_DEBUG=render kako biste dobili dodatni tekstualni izlaz s brojem poziva različitih prolaza renderiranja. Ti se brojevi zbrajaju u događaju Render Frame.

Tip događajaNitOpis
Render FrameRenderiranjeVrijeme renderiranja kadra. Također prikazuje broj draw callova.
Prepare FrameRenderiranjeVrijeme potrebno za pripremu kadra. Resursi se dodjeljuju i učitavaju u fazi pripreme. Prvi kadar nakon učitavanja scene obično traje duže od ostalih jer se tada učitava većina resursa.
Synchronize FrameRenderiranjeVrijeme renderiranja kadra. Također prikazuje broj draw callova.RenderiranjeVrijeme potrebno za pripVrijeme sinkronizacije kadra. Sinkronizacija se brine o ažuriranju vrijednosti backenda s frontenda. Također upravlja zajedničkim resursima između Qt Quick Scene Graph i Qt Quick 3D.
Mesh LoadRenderiranjeVrijeme učitavanja mreže. Prikazuje ukupnu potrošnju memorije svih mreža. Također prikazuje neuspjela učitavanja.
Custom Mesh LoadRenderVrijeme učitavanja prilagođenog mreža. Prikazuje ukupnu potrošnju memorije svih mreža. Također prikazuje neujednačena stanja.
Texture LoadRenderVrijeme učitavanja teksture. Prikazuje ukupnu potrošnju memorije svih tekstura. Također prikazuje iskrcavanja.
Generate ShaderRenderiranjeVrijeme za generiranje shadera za materijal.
Load ShaderRenderVrijeme učitavanja ugrađenog shadera.
Particle UpdateGUIAžuriranje vremena sustava čestica. Prikazuje broj ažuriranih čestica.
Mesh Memory ConsumptionRenderiranjePrikazuje stupanjski prikaz ukupne potrošnje memorije mreže.
Texture Memory ConsumptionRenderPrikazuje stupanjski prikaz ukupne potrošnje memorije za teksture.
Render CallRenderiranjeVrijeme potrebno za jedan draw ili compute poziv. Korisno za identifikaciju zahtjevnih GPU operacija.
Render PassRenderVrijeme potrebno za cijeli render pas. Prikazuje grupirane operacije renderiranja za buffer okvira.

Pregled statistike

Prikaz " Statistics " prikazuje broj puta kada se svaka operacija povezivanja, stvaranja, kompajliranja, JavaScript događaj ili signalni događaj aktivira te prosječno vrijeme potrebno za to. Pregledajte statistiku kako biste saznali koje događaje treba optimizirati. Velik broj pojava može ukazivati na to da se događaj aktivira nepotrebno. Za prikaz medijana, najdužeg i najkraćeg vremena za pojave odaberite " Extended Event Statistics " u kontekstnom izborniku.

Odaberite događaj da biste se u izvornoj kodu u uređivaču koda premjestili na njega.

Pregled statistike

Callers i Callees prikazuju ovisnosti između događaja. Omogućuju vam pregledavanje unutarnjih funkcija aplikacije. Callers sažima QML događaje koji pokreću vezu. To vam govori što je uzrokovalo promjenu u vezi. Callees sažima QML događaje koje veza pokreće. To vam govori koji su QML događaji pogođeni ako promijenite vezu.

Odaberite događaj da biste se u izvornoj kodu u uređivaču koda prebacili na njega.

Kada odaberete događaj u prikazu Timeline, informacije o njemu prikazuju se u prikazima Statistics i Flame Graph.

Za kopiranje sadržaja jednog prikaza ili retka u međuspremnik odaberite Copy Table ili Copy Row u kontekstnom izborniku.

Visualizacija statistike kao flame grafova

Pregled Flame Graph prikazuje sažetiji statistički pregled izvršavanja QML-a i JavaScripta. U pregledu Total Time, vodoravne trake prikazuju količinu vremena koju su sve pozive određene funkcije zajedno potrošile, u odnosu na ukupno vrijeme izvršavanja svih JavaScript i QML događaja. Ugniježđivanje prikazuje koje su funkcije pozvale koje druge.

Pregled grafa plamena

Za pregled ukupne količine memorije dodijeljene funkcijama, u padajućem izborniku odaberite Memory.

Za pregled broja dodjela memorije koje su izvršile funkcije, odaberite Allocations.

Dvaput kliknite na stavku u prikazu za uvećanje. Dvaput kliknite na prazno područje u prikazu za povratak na prethodni prikaz.

Za razliku od prikaza Timeline, prikaz Flame Graph ne prikazuje vremenske intervale kada se uopće ne izvršavaju QML niti JavaScript. Stoga nije prikladan za analizu vremena izvršavanja po sličici. Međutim, ondje je vrlo lako vidjeti ukupni utjecaj različitih QML i JavaScript događaja.

Vidi također Kako: Analizirati, Analizatori, Analiza koda i Profiliranje QML aplikacija.

Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.