QML Profiler性能優化教程

QML Profiler

2018年1月26日 vincent

對于一個程序的開發,性能優化是開發中的一個重要步驟。

我們肯定不希望開發出來的程序表現出卡頓,最好是處處流暢,絲滑般的體驗。

對于C++程序,我們有很多方法可以做性能優化,例如Visual Studio Profiler。

而對于QML(QtQuick)程序,我們可以選擇QML Profiler,這是QtCreator的一個功能。

那么QML Profiler是什么呢,官方的描述如下:

You can use the QML Profiler to find causes for typical performance problems in your applications, such as slowness and unresponsive, stuttering user interfaces. Typical causes include executing too much JavaScript in too few frames. All JavaScript must return before the GUI thread can proceed, and frames are delayed or dropped if the GUI thread is not ready.

也就是說,QML Profiler主要功能就是幫助我們去解決程序中典型的性能問題,說簡單就是幫助我們做性能優化。

注意:這個性能優化,僅指QML這里,一般來說就是界面,可能還包含點界面邏輯代碼(JS),而C++這塊,QML Profiler幾乎幫不上忙,最多是能給在QML中調用的槽函數記個耗時。

時間的考慮

作為一名程序開發者,應該努力使渲染引擎的刷新率維持在60fps,也就是說在每幀之間大約有16ms,這段時間包括了基本圖元在圖形硬件上的描畫。具體內容如下:

  1. 盡可能的使用異步事件驅動來編程。
  2. 使用工作者線程來處理重要的事情,比如說QML的WorkerScript類型就是起用了一個新的線程。
  3. 不要手動重復事件循環。
  4. 每幀的函數阻塞的時間不要超過幾毫秒。

++如果不注意上面提到的內容,就會導致跳幀,影響用戶體驗。++

注意:


QML 與 C++ 交互時,為了避免阻塞就去創建自己的  
QEventLoop 或調用QCoreApplication::processEvents(),  
這雖說是一種常見的模式,但也是危險的,因為信號處理  
或綁定進入事件循環時,QML 引擎會繼續運行其它的綁定、  
動畫、狀態遷移等,這些動作就可能帶來副作用,例如,  
破壞包含了事件循環的層級結構。

性能分析

借助于QML Profiler,我們快速的了解程序運行中的主要情況和耗時細則(可以精確到微秒),其中包括但不限于:

  • 圖片緩存使用情況
  • 渲染耗時
  • 內存使用情況
  • 輸入事件
  • 動畫幀率
  • 編譯耗時
  • 創建耗時
  • 綁定耗時
  • 信號處理耗時
  • JS代碼耗時

如何使用QML性能分析工具

QML Profiler的功能開放是從Qt5.7開始的,之前一直是企業版才有的,也就是花錢版。

使用步驟

  1. 打開Qt Creator
    默認安裝了Qt5.7或更高版本。
  2. 打開一個QML項目
    在這里插入圖片描述

選擇debug模式:

在這里插入圖片描述

  1. 啟動QML Profiler

啟動工具后,等待程序運行起來,并且運行一段時間。然后點擊Stop按鈕,停止QML Profiler。

在這里插入圖片描述

時間軸視圖

在這里插入圖片描述

在這里,我們可以以時間軸角度,查看各個細節的耗時。時間軸的起點,就是QQmlApplication實例化的時間。我們可能看不到零點,因為在QQmlApplication被實例化到第一個元素被開始處理,時間可能會有其他的耗時。

在視圖中,從左到右,就是QML Profiler從開始到停止的所有記錄了。越小的塊表示時間越短,反之越大的塊,表示時間越長。這里的方塊具有一定的嵌套關系,下面的方塊對象隸屬于上面的對象。比如說 Windows { } 里面還可能會有一個 Item { } 這樣的嵌套關系。

  • 詳細信息查看
    通過鼠標左鍵點擊顏色區域即可查看詳細信息,如下:

在這里插入圖片描述

看下面這個例子:

在這里插入圖片描述

我們可以看出這里Image創建時間消耗78.7ms,對應的代碼文件是main.qml和行數37行。

  • 根據事件類型展開
    在左側不同類型的事件中,我們可以點擊那個展開按鈕,這樣我們就可以看到展開的詳細數據,這樣看數據對應關系時會更加的清楚,但是當數據很多的時候也會更加的凌亂,所以酌情使用。

在這里插入圖片描述

  • 縮放按鈕
    在左側有一個放大鏡,可以縮放視圖的比例,這對于分析一段比較長的QML Profiler或者想看某一個細節點的數據會非常有用

在這里插入圖片描述

詳細介紹:

  • Pixmap Cache

在QML中使用的Image,默認是開緩存的。而所有緩存的圖片,都會在這里顯示,包括用了多少像素的緩存,還包括了圖片的加載耗時、文件名等信息。(沒有緩存的圖片也會顯示,但不會記入到緩存的階梯里)

  • Scene Graph

這里顯示渲染時各個階段的耗時,如果我們發現程序的動畫有卡頓,除了一些函數的阻塞導致的卡頓外,還可以分析一下渲染的耗時開銷,看看是不是渲染的量太大導致的卡頓。

這里我們主要關注Render Render這個數據,這個數據表示將OpenGL數據發送到GPU的過程。看到一個Render Render的結束,基本表示這一幀已經結束渲染,并且即將顯示出來了。

另外還有Glyph Upload這個數據,這個數據表示字形紋路上傳。如果你的程序是嵌入式,并且有很多的字,那么Glyph Upload有可能會帶來一定的性能開銷。減少這個開銷的方式基本就是減少字,比如說用圖片(Image)代替文字(Text或者Label)。

  • Memory Usage

顯示內存使用情況,如果這里有大塊的內存增長,看看是不是這里在初始化很多東西,或者是有很多不必要的組件被創建出來了。

  • Input Events

顯示用戶輸入事件,例如鼠標和鍵盤事件

  • Debug Messages

顯示調試輸出的時間點,如果你需要對照Debug輸出和對應的QML事件,那么這會很有幫助

  • Animations

顯示是否有動畫在執行,以及動畫的FPS,在多線程渲染時還會顯示多線程的信息。如果我們發現FPS低于18,那么視覺上可能就會有明顯的卡頓了。而30到60的FPS,一般就可以認為是流暢的。

  • Compiling

顯示編譯的耗時。這里要說下,從Qt5.8開始,QtQuick引入了qmlc機制,讓編譯時間大幅度縮減,基本上是從幾百毫秒,縮減到幾十甚至十毫秒以內。之前在csdn發過文章講這個,這里再放下鏈接:

  • Creating

顯示創建的耗時,一般也是啟動優化的主要部分

  • Binding

顯示綁定的耗時

  • Hangling Signal

顯示信號處理的耗時

  • Javascript

顯示JS執行的耗時。如果在QML里調用了一個C++的槽,那么這里也會有計時,但是也只有槽函數的總耗時,C++那里的運行情況這里看不出來。

統計圖視圖

選擇統計Statistic Tab如下:

在這里插入圖片描述

在這里,我們可以看到每個細則,例如編譯、創建、綁定、JavaScript或者信號處理的次數以及它們所消耗的時間。

除了在時間軸那里,通過肉眼觀察,我們在這里,通過對百分比的排序,也可以迅速的看出哪個東西最耗時。

火焰視圖

選擇Flame Graph Tab。

在這里插入圖片描述

在這里,我們可以看到更加簡潔的QML和JS統計。其中也直觀的告訴了我們一些嵌套關系。

綜上,這是最基本的3個功能區,構成了QML Profiler。我們程序的性能分析,主要也圍繞著這三點展開。

性能優化建議

如果程序有明顯的加載慢問題,那么可以先去看創建,找大塊,去延后加載或者異步加載。讓首界面先顯示出來。尤其是圖片,圖片的加載比較慢,盡量選擇合適分辨率的圖片,不要過大。對于不會再第一時間顯示的東西,盡量不要在第一時間加載。

如果程序有明顯卡頓問題,那么可以看渲染那里,是不是渲染的東西太多了,例如用了過多的clip。或者有很多在視覺上看不到的元素,例如xy為-1000這樣的Item,沒有被隱藏,這些Item照樣會渲染,照樣會有性能開銷,對于這些元素可以將visible設置為false,直接影藏掉,這就不會有渲染耗時了。例外值得一提的是,對于有動畫的場景,建議把每幀時間控制在16ms以內,以維持60FPS的流暢界面。

關于性能優化進一步的細節點,這里不展開,以后單獨發文章講,本文只講QML Profiler的基礎。更多關于QML Profiler的信息,可以前往官網查看:

Profiling QML Applications

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536162.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536162.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536162.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uburntu在不能自動獲取網絡時的聯網設置

一:網絡基礎配置 1. eth0設置不正確,導致無法正常啟動,修改eth0配置文件就好 ubuntu 12.04的網絡設置文件是/etc/network/interfaces,打開文件,會看到 auto lo iface lo inet loopback 這邊的設置是本地回路。在后…

計算機顯卡知識普及

顯卡知識普及 一、什么是顯卡? 顯示接口卡(Video card,Graphics card)、顯示器配置卡簡稱為顯卡,是個人電腦基本組成部分之一。 用途是將計算機系統所需要的顯示信息進行轉換驅動,并向顯示器提供信號&…

整除的尾數

Problem Description 一個整數&#xff0c;只知道前幾位&#xff0c;不知道末二位&#xff0c;被另一個整數除盡了&#xff0c;那么該數的末二位該是什么呢&#xff1f; Input 輸入數據有若干組&#xff0c;每組數據包含二個整數a&#xff0c;b(0<10000,10<b<100)&…

QML 控件大全

QML TypeContainerDelayButtonDialDialogButtonBoxDialogDrawerMenuMenuBarOverlayPageIndicatorRangeSliderScrollViewSpinBoxStackViewSwipeViewSwitchTabBarToolBarToolSeparatorToolTipTumbler QML Type 本篇主要介紹QtQuick Controls 2,Qt Creator 5.10 1.Container im…

斐波那契的整除

Description 已知斐波那契數列有如下遞歸定義&#xff0c;f(1)1,f(2)1, 且n>3,f(n)f(n-1)f(n-2)&#xff0c;它的前幾項可以表示為1&#xff0c; 1&#xff0c;2 &#xff0c;3 &#xff0c;5 &#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34…&#xff0c;現在的…

Qt與QML的枚舉綁定(C++枚舉)

Qt到QML的枚舉綁定 QML中是不支持c的枚舉類型的&#xff0c;所以我們可以使用Qt的元對象系統&#xff0c;即MOS,來幫助我們實現。 進行綁定的好處就是&#xff0c;以后數據發生變化的時候&#xff0c;就是枚舉發生增加修改&#xff0c;添加等的時候&#xff0c;不需要在QML中…

深入理解Qt的.pro文件

深入理解Qt的pro文件模板變量生成目錄生成的應用程序名編譯選項目標文件目錄包含頭文件包含源文件包含資源文件附加頭文件包含鏈接庫預編譯宏平臺相關性處理指定來自ui文件位置指定界面翻譯文本列表指定圖標 深入理解Qt的.pro文件 一般Qt項目我們是使用Qt Creator自動生成的&…

Ubuntu 用vsftpd 配置FTP服務器

最近開學&#xff0c;有好多課程結束后都需要將文件考到優盤里&#xff0c;而本人又有健忘的毛病&#xff0c;經常忘記帶優盤&#xff0c;所以就搭建了自己的ftp服務器&#xff0c;也算是用技術放松自己吧。閑話少敘&#xff0c;進入正題&#xff1a; 網上關于ftp搭建的文章很…

linux的程序打包deb

deb安裝包 deb是Unix系統(其實主要是Linux)下的安裝包&#xff0c;基于 tar 包&#xff0c;因此本身會記錄文件的權限(讀/寫/可執行)以及所有者/用戶組。 由于 Unix 類系統對權限、所有者、組的嚴格要求&#xff0c;而 deb 格式安裝包又經常會涉及到系統比較底層的操作&#…

利用pyinstaller打包python3程序

pyInstaller是一款用于將pyhon程序打包成exe文件的工具&#xff0c;pyInstaller不是一個python的包&#xff0c; 只需要把pyInstaller的文件下載下來放到任意為止都可以&#xff0c;也就是說pyInstaller相當于獨立出來專門干打包python的工具&#xff0c;這貨是工具不是庫&…

C++11新特性之左值右值及移動語句與完美轉發

C左值右值左值和右值的由來什么是左值和右值左值右值的本質引用左值引用右值引用 移動語句與完美轉發移動語句實現移動構造函數和轉移賦值函數stdmove完美轉發Perfect Forwarding C左值右值 自從C11發布之后&#xff0c;出現了一個新的概念&#xff0c;即左值和右值&#xf…

nginx中的nginx.conf.default配置

#運行用戶 user nobody; #啟動進程,通常設置成和cpu的數量相等 worker_processes 1;#全局錯誤日志及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;#工作模式及連接數上限 events {…

C++11新特性之泛型編程與模板

模板泛型編程函數模板普通函數模板成員函數模板函數模板重載模板函數的特化 類模板類模板中的成員函數模板類模板的特化與偏特化類模板成員特化 模板 Template所代表的泛型編程是C語言中的重要組成部分。 泛型編程 泛型編程&#xff08;Generic Programming&#xff09;是…

WordPress更改“固定鏈接”后 頁面404原因及解決方法(Nginx版)

網上盛傳的方法是&#xff1a; 在 /etc/nginx/nginx.conf文件的 loction / {} 中添加 if (-f $request_filename/index.html){rewrite (.*) $1/index.html break; }if (-f $request_filename/index.php){rewrite (.*) $1/index.php; }if (!-f $request_filename){rewrite (.*…

C++類型萃取之type_traits和type_info

類型萃取類型判斷typeiddecltype和declvalenable_if 類型萃取 通過type_traits可以實現在編譯期計算、查詢、判斷、轉換和選擇&#xff0c;增強了泛型編程的能力&#xff0c;也增強了我們程序的彈性&#xff0c;讓我們能夠在編譯期就能夠優化改進甚至排錯&#xff0c;進一步提…

使用Phpstorm實現遠程開發

Phpstorm除了能直接打開本地文件之外&#xff0c;還可以連接FTP&#xff0c;除了完成正常的數據傳遞任務之外&#xff0c;還可以進行本地文件與服務端文件的異同比較&#xff0c;同一文件自動匹配目錄上傳&#xff0c;下載&#xff0c;這些功能是平常IDE&#xff0c;FTP軟件中少…

什么是遞歸函數?

文章目錄遞歸函數遞歸例題特點效率優點遞歸函數 遞歸 遞歸就是一個函數在它的函數體內調用它自身。執行遞歸函數將反復調用其自身&#xff0c;每調用一次就進入新的一層。遞歸函數必須有結束條件。 當函數在一直遞推&#xff0c;直到遇到墻后返回&#xff0c;這個墻就是結束條…

apache ab壓力測試報錯

今天用apache 自帶的ab工具測試&#xff0c;當并發量達到1000多的時候報錯如下&#xff1a; [rootaa~]# This is ApacheBench, Version 2.3 <Revision:655654> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Sof…

ngOnInit與constructor的區別

前世今生 Angular會管理一個組件的生命周期,包括組件的創建、渲染、子組件創建與渲染、當數據綁定屬性變化時的校驗、DOM移除之前毀銷。 Angular提供組件生命周期鉤子便于我們在某些關鍵點發生時添加操作。 組件生命周期鉤子 指令和組件實例有個生命周期用于創建、更新和銷…

Nginx配置性能優化

大多數的Nginx安裝指南告訴你如下基礎知識——通過apt-get安裝&#xff0c;修改這里或那里的幾行配置&#xff0c;好了&#xff0c;你已經有了一個Web服務器了。而且&#xff0c;在大多數情況下&#xff0c;一個常規安裝的nginx對你的網站來說已經能很好地工作了。然而&#xf…