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čelji. 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 se 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.
Pozivanje dugotrajnih C++ funkcija, kao što su metode crtanja i ručatelji signala, također oduzima vrijeme u GUI niti, ali ih je teže uočiti u alatu 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 Graph-a, 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 pronalaženje 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 preklapanje 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 okviri gube iako se JavaScript ne izvršava te postoje velike, neobjašnjive praznine u 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 -a prikazuje grafičke prikaze izvršavanja QML-a i JavaScript-a te sažeti prikaz svih zabilježenih događaja.

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. Da 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 tijekom kojeg su prikupljeni podaci. Povucite raspon zumiranja (8) ili kliknite na okvir kako biste se pomaknuli na njemu. 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 za postavljanje razine zumiranja. Također možete povlačiti ručke za zumiranje (9). Za vraćanje zadane razine zumiranja desnom tipkom miša kliknite 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 aktivaciju 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 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 uključuju lokaciju u izvornoj kodu, trajanje i neke relevantne dijelove samog izvornog koda.
Odaberite događaj kako biste premjestili pokazivač u uređivaču koda na dio koda povezan s tim događajem.
Sljedeće vrste događaja prikazuju se u prikazu vremenske crte na jednom ili više redaka.
| Kategorija događaja | Opis |
|---|---|
| Pixmap Cache | Prikazuje ukupnu količinu keširanih pixmap podataka, u pikselsima. Osim toga, prikazuje zaseban događaj za svaku učitavanu sliku, sa specifičnostima o nazivu i veličini datoteke. |
| Scene Graph | Prikazuje vrijeme kada se okviri grafa scene iscrtavaju i neke dodatne informacije o vremenu za različite faze koje se pri tome izvršavaju. |
| Memory Usage | Prikazuje dodjelu 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 dodijeliti zasebno. Ta dva načina rada prikazana su kao događaji različitih boja. Drugi redak prikazuje stvarnu upotrebu dodijeljene memorije. To je količina JavaScript hrpe koju je aplikacija zapravo zatražila. |
| Input Events | Prikazuje događaje miša i tipkovnice. |
| Painting | Nije korišteno. |
| Animations | Prikazuje broj animacija koje su aktivne i brzinu s kojom se izvršavaju. Render niti animacija prikazuju se u zasebnom retku. |
| Compiling | Prikazuje vrijeme provedeno na kompajliranju QML datoteka. |
| Creating | Prikazuje vrijeme provedeno na stvaranju 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. |
| Binding | Prikazuje vrijeme kada se veza evaluira i koliko dugo traje evaluacija. |
| Handling Signal | Prikazuje vrijeme kada se signal obrađuje i koliko dugo traje obrada. |
| JavaScript | Prikazuje 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. |
| Quick3D | Prikazuje vrijeme provedeno na iscrtavanju okvira E Qt Quick 3D -a, 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. Ova vrsta događaja dostupna je od Qt 6.3. |
Analiza događaja scene grafa
Da biste razumjeli kategoriju scene grafa, pročitajte više o tome kako radi scene graf Qt Quick a u člancimaQt 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 render-petljama Windows i Basic 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đaja | Nit | Vrste render-petlji | Oznaka u izlazu naredbe QSG_RENDER_TIMING | Opis |
|---|---|---|---|---|
| Polish | GUI | Višenitni, Osnovni, Windows | polish | Završna dorada stavki prije njihovog iscrtavanja pomoću QQuickItem::updatePolish(). |
| GUI Thread Wait | GUI | Višenitni | lock | Izvrš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 Sync | GUI | Višenitni | blockedForSync | Vrijeme dok je GUI nit blokirana, čekajući render nit. |
| Animations | GUI | Višenitni, Windows | animations | Napredovanje animacija u GUI niti. Osnovna render-petlja ne pokreće animacije sinkrono s renderiranjem. Zbog toga se pri korištenju osnovne render-petlje neće prikazivati događaji animacije. Pogledajte kategoriju " Animations " kako biste vidjeli vremensko trajanje animacije u ovom slučaju. |
| Render Thread Sync | Renderiranje | Višenitni, Osnovni, Windows | Frame rendered ... sync | Sinkronizacija QML stanja u graf scenu pomoću QQuickItem::updatePaintNode(). |
| Render | Render | Višenitni, Osnovni, Windows | Frame rendered ... render | Render 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. |
| Swap | Renderiranje | Višenitni, Osnovni, Windows | Frame rendered ... swap | Zamjena kadrova nakon renderiranja. |
| Render Preprocess | Renderiranje | Višenitno, Osnovno, Windows | time in renderer ... preprocess | Pozivanje QSGNode::preprocess() na svim čvorovima koje je potrebno predobraditi. Ovo je dio grubog koraka Render. |
| Render Update | Render | Višenitni, Osnovni, Windows | time in renderer ... updates | Ponavljajuć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 Bind | Renderiranje | Višenitni, Osnovni, Windows | time in renderer ... binding | Povezivanje ispravnog framebuffera za OpenGL renderiranje. Ovo je dio grubog koraka Render. |
| Render Render | Renderiranje | Threaded, Basic, Windows | time in renderer ... rendering | Stvarni proces slanja svih podataka na GPU putem OpenGL-a. Ovo je dio grubog koraka Render. |
| Material Compile | Renderiranje | Nitani, Osnovni, Windows | shader compiled | Kompilacija GLSL shader programa. |
| Glyph Render | Renderiranje | Threaded, Basic, Windows | glyphs ... rendering | Renderiranje glifova fonta u teksture. |
| Glyph Upload | Renderiranje | Višenitni, Osnovni, Windows | glyphs ... upload | Učitavanje tekstura glifova na GPU. |
| Texture Bind | Renderiranje | Višenitni, Osnovni, Windows | plain texture ... bind | Povezivanje teksture u OpenGL kontekstu pomoću glBindTextures. |
| Texture Convert | Render | Nitno, Osnovno, Windows | plain texture ... convert | Konverzija formata i smanjenje veličine slike kako bi bila prikladna za upotrebu kao tekstura. |
| Texture Swizzle | Renderiranje | Višenitni, Osnovni, Windows | plain texture ... swizzle | Rotiranje podataka teksture na CPU-u ako je potrebno. |
| Texture Upload | Renderiranje | Višenitni, Osnovni, Windows | plain texture ... upload / atlastexture uploaded | Učitavanje podataka teksture na GPU. |
| Texture Mipmap | Renderiranje | Višenitni, Osnovni, Windows | plain texture ... mipmap | Mipmapping teksture na GPU-u. |
| Texture Delete | Renderiranje | Višenitni, Osnovni, Windows | plain texture deleted | Brisanje teksture s GPU-a koja je postala nepotrebna. |
Analiza događaja Qt Quick 3D
Slijedi popis događaja za Qt Quick 3D. Svaki renderirani kadar sastoji se od faza sinkronizacije, pripreme i iscrtavanja, koje se izvode tim redoslijedom. Sinkronizacija se događa u fazi sinkronizacije grafa scene, dok priprema i iscrtavanje slijede u fazi iscrtavanja grafa scene.
Postavite varijablu okoline QSG_RENDERER_DEBUG=render kako biste dobili dodatni tekstualni izlaz o broju poziva različitih render pasova. Ti se brojevi zbrajaju u događaju Render Frame.
| Tip događaja | Nit | Opis |
|---|---|---|
| Render Frame | Renderiranje | Vrijeme iscrtavanja okvira. Također prikazuje broj draw poziva. |
| Prepare Frame | Renderiranje | Vrijeme 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 Frame | RenderiranjeVrijeme renderiranja kadra. Također prikazuje broj draw callova.RenderiranjeVrijeme potrebno za prip | Vrijeme sinkronizacije kadra. Sinkronizacija se brine o ažuriranju vrijednosti backenda iz frontenda. Također upravlja zajedničkim resursima između Scene Graph-a u Qt Quick -u i Qt Quick 3D-a. |
| Mesh Load | Renderiranje | Vrijeme učitavanja mreže. Prikazuje ukupnu potrošnju memorije svih mreža. Također prikazuje neotpremljene mreže. |
| Custom Mesh Load | RenderiranjeVrijeme sinhronizacije kadra. Sinhronizacija se brine o ažuriranju vrijednosti back | Vrijeme učitavanja prilagođenog mreža. Prikazuje ukupnu potrošnju memorije svih mreža. Također prikazuje razdoblja neaktivnosti. |
| Texture Load | Render | Vrijeme učitavanja teksture. Prikazuje ukupnu potrošnju memorije svih tekstura. Također prikazuje isključivanja. |
| Generate Shader | Renderiranje | Vrijeme za generiranje shadera za materijal. |
| Load Shader | Renderiranje | Vrijeme učitavanja ugrađenog shadera. |
| Particle Update | GUI | Ažuriranje vremena sustava čestica. Prikazuje broj ažuriranih čestica. |
| Mesh Memory Consumption | Renderiranje | Prikazuje stupanjski prikaz ukupne potrošnje memorije mreže. |
| Texture Memory Consumption | Render | Prikazuje stupanjski prikaz ukupne potrošnje memorije za teksture. |
| Render Call | Renderiranje | Vrijeme potrebno za jedan draw ili compute poziv. Korisno za identifikaciju zahtjevnih GPU operacija. |
| Render Pass | Render | Vrijeme potrebno za cijeli render pas. Prikazuje grupirane operacije renderiranja za buffer okvira. |
Pregled statistike
Pregled " Statistics " prikazuje broj puta kada se svaki binding, create, compile, JavaScript ili signal događaj aktivira i prosječno vrijeme potrebno za to. Pregledajte statistiku kako biste saznali koje događaje treba optimizirati. Veliki broj pojavljivanja može ukazivati na to da se događaj aktivira nepotrebno. Za prikaz medijane, najdužeg i najkraćeg vremena za pojavljivanja odaberite " Extended Event Statistics " u kontekstnom izborniku.
Odaberite događaj da biste se u izvornoj kodu u uređivaču koda premjestili na njega.

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 premjestili na njega.
Kada odaberete događaj u prikazu Timeline, informacije o njemu prikazuju se u prikazima Statistics i Flame Graph.
Da biste kopirali sadržaj jednog prikaza ili retka u međuspremnik, odaberite Copy Table ili Copy Row u kontekstnom izborniku.
Visualizacija statistike kao grafova plamena
Pregled Flame Graph prikazuje sažetiji statistički pregled izvršavanja QML-a i JavaScript koda. U prikazu Total Time vodoravne trake prikazuju ukupno vrijeme koje su sve pozive određene funkcije potrošile zajedno, u odnosu na ukupno vrijeme izvršavanja svih JavaScript i QML događaja. Ugniježđivanje prikazuje koje su funkcije pozivane od kojih drugih.

Za pregled ukupne količine memorije dodijeljene funkcijama, u padajućem izborniku odaberite Memory.
Za prikaz broja dodjela memorije koje su izvršile funkcije odaberite Allocations.
Dvokliknite stavku u prikazu za uvećanje. Dvokliknite prazno područje u prikazu za povratak na prethodni prikaz.
Za razliku od prikaza Timeline, prikaz Flame Graph ne prikazuje vremenska razdoblja 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 Profiliranje QML aplikacija, Kako: Analizirati, Analizatori i Analiziranje koda.
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.