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.

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đaja | Opis |
|---|---|
| Pixmap Cache | Prikazuje 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 Graph | Prikazuje vrijeme kada se okviri grafa scene renderiraju i neke dodatne informacije o vremenu za različite faze koje se pri tome izvršavaju. |
| Memory Usage | Prikazuje 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 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. Niti za iscrtavanje animacija prikazane su u zasebnom retku. |
| Compiling | Prikazuje vrijeme provedeno na kompajliranju QML datoteka. |
| Creating | Prikazuje 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. |
| 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 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đ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. 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 Sync | Renderiranje | Višenitni, Osnovni, Windows | Frame rendered ... sync | Sinkronizacija QML stanja u graf scenu koristeći 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 okvira nakon renderiranja. |
| Render Preprocess | Renderiranje | Višenitno, Osnovno, Windows | time in renderer ... preprocess | Pozivanje funkcije 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 | Threaded, Basic, Windows | shader compiled | Kompilacija GLSL shader programa. |
| Glyph Render | Renderiranje | Paralelno, Osnovno, Windows | glyphs ... rendering | Renderiranje glifova fonta u teksture. |
| Glyph Upload | Renderiranje | Višekernično, Osnovno, 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 | Paralelno, 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 | Swizzlanje 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. |
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đaja | Nit | Opis |
|---|---|---|
| Render Frame | Renderiranje | Vrijeme renderiranja kadra. Također prikazuje broj draw callova. |
| 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 s frontenda. Također upravlja zajedničkim resursima između Qt Quick Scene Graph i Qt Quick 3D. |
| Mesh Load | Renderiranje | Vrijeme učitavanja mreže. Prikazuje ukupnu potrošnju memorije svih mreža. Također prikazuje neuspjela učitavanja. |
| Custom Mesh Load | Render | Vrijeme učitavanja prilagođenog mreža. Prikazuje ukupnu potrošnju memorije svih mreža. Također prikazuje neujednačena stanja. |
| Texture Load | Render | Vrijeme učitavanja teksture. Prikazuje ukupnu potrošnju memorije svih tekstura. Također prikazuje iskrcavanja. |
| Generate Shader | Renderiranje | Vrijeme za generiranje shadera za materijal. |
| Load Shader | Render | 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
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.

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.

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.