摘要:QCustomPlot是一種Qt中常用的繪制圖表、圖像的C++庫類。針對圖像繪制大量數(shù)據(jù)時性能下降問題,文章提出一種多圖繪制性能提升方法。通過數(shù)據(jù)預處理進行抽樣疊加;增加緩存優(yōu)化提高數(shù)據(jù)存儲和訪問效率;同時利用多線程處理提高繪制性能。數(shù)據(jù)仿真表明,該方法保證了圖像繪制質量,進一步提升了多圖繪制的效率。
關鍵詞:QCustomPlot庫類;繪圖;多圖;緩存優(yōu)化;多線程處理
中圖分類號:TP319" 文獻標志碼:A
0" 引言
QCustomPlot是一個功能強大的數(shù)據(jù)可視化庫[1-2],主要應用于Qt中。隨著國內科技的不斷進步與發(fā)展,國產化數(shù)據(jù)庫需求也逐漸成為各個領域的關注焦點,Qt作為一個跨平臺、穩(wěn)定可靠的開發(fā)框架成為許多企業(yè)的選擇,QCustomPlot在功能性、易用性、跨平臺支持和持續(xù)更新等方面都表現(xiàn)出色。在雷達終端的應用中,QCustomPlot可以用于繪制和顯示各種雷達相關的數(shù)據(jù),比如頻率幅度圖、一維像、ISAR成像等。為了對不同參數(shù)下的數(shù)據(jù)進行比較,同時繪制多幅圖成為不可缺少的環(huán)節(jié)。
然而,QCustomPlot進行多圖繪制時,沒有數(shù)據(jù)預處理,大數(shù)據(jù)量情況下可能會對主進程的性能產生一定的負載影響。除此之外,各個圖之間也可能相互影響,造成數(shù)據(jù)丟失、繪制卡頓等。如何合理地優(yōu)化和管理繪制方式,實現(xiàn)更高效、更流暢的數(shù)據(jù)可視化體驗成為迫切需要解決的問題。
本文旨在優(yōu)化雷達數(shù)據(jù)可視化過程中多幅CustomPlot圖繪制卡頓、主進程被阻塞問題,提出了一種繪圖數(shù)據(jù)預處理、緩存優(yōu)化[3-4],多線程處理繪制的方法[5],確保多圖繪制的完整性和性能[6]。
1 相關知識介紹
1.1 QCustomPlot介紹
QCustomPlot是一個用于繪制二維圖表和圖形的C++庫,特別是針對Qt應用程序,它提供了豐富的功能且具有靈活性,使開發(fā)者能夠創(chuàng)建高度可定制的圖表和圖形。以下是QCustomPlot的主要特點和功能。
(1)靈活性和可定制性。QCustomPlot允許開發(fā)者通過各種選項來定制圖表的外觀和行為,包括圖表的坐標軸、圖例、圖形等。
(2)多種圖表類型。支持多種常見的圖表類型,如折線圖、散點圖、柱狀圖、餅圖等以及自定義圖形。
(3)交互功能。QCustomPlot提供了豐富的交互功能,如縮放、拖動、選擇、標注等,使用戶能夠與圖表進行互動并探索數(shù)據(jù)。
(4)高性能。經過優(yōu)化,能夠處理大量數(shù)據(jù)并快速渲染圖表,適用于需要實時更新或大數(shù)據(jù)量的應用場景。
(5)跨平臺支持。QCustomPlot基于Qt框架開發(fā),因此可以在跨平臺的環(huán)境中運行,包括Windows、Linux和macOS等。
(6)豐富的文檔和示例。它有詳細的文檔和豐富的示例代碼,幫助開發(fā)者快速上手并了解如何使用庫中的各種功能。
總的來說,QCustomPlot是一個強大而靈活的圖表庫,適用于各種不同類型的應用程序。
1.2 QCustomPlot的性能影響因素
在使用QCustomPlot繪圖的過程中,大量的數(shù)據(jù)處理、繪制的實時性、主線程耗時等都會對性能產生影響,主要原因如下。
(1)大數(shù)據(jù)量。如果嘗試繪制大量的數(shù)據(jù)點,比如數(shù)千個或更多,QCustomPlot可能需要較長的時間來處理和繪制這些數(shù)據(jù),從而導致卡頓現(xiàn)象。
(2)實時更新。如果須要在圖表中實時更新數(shù)據(jù),比如數(shù)據(jù)流可視化或實時監(jiān)控,頻繁的數(shù)據(jù)更新可能會導致QCustomPlot重新繪制圖表,進而出現(xiàn)卡頓。
(3)UI線程阻塞。如果在用戶界面(User Interface, UI)線程中進行了耗時的計算或I/O操作,這可能會導致UI線程被阻塞,進而影響QCustomPlot的響應性。
2 QCustomPlot性能提高方法的分析與設計
本文主要采用數(shù)據(jù)緩存和預處理、定時刷新繪制內容以及多線程處理的方法優(yōu)化了1.2節(jié)中的影響因素。
2.1 預處理數(shù)據(jù)
在繪圖過程中經常會遇到大規(guī)模的數(shù)據(jù),有必要對其進行數(shù)據(jù)抽樣和降采樣,在對數(shù)據(jù)點進行密度降低的同時保持原有數(shù)據(jù)的趨勢和特征,可以有效地減少繪制計算量,從而提高繪制效率。
在實際應用中,會同時接收多幅圖的數(shù)據(jù),建立合理的緩存區(qū)進行數(shù)據(jù)存儲,并根據(jù)數(shù)據(jù)標識并發(fā)處理不同的圖片數(shù)據(jù),可以大幅度減少用戶界面的響應速度,提高用戶體驗。
2.2 定時繪制
在接收端收到繪圖數(shù)據(jù)時,一般有2種繪制方法:數(shù)據(jù)驅動(實時繪制)和定時處理(通過定時器周期性繪制)[7]。
在數(shù)據(jù)量小、數(shù)據(jù)率不高的場景,實時繪制能夠在數(shù)據(jù)到達的瞬間進行圖標的更新,對于金融市場、網(wǎng)絡監(jiān)控等場景十分契合。但是較高的性能開銷、難以控制的刷新頻率、復雜的資源管理都有可能導致界面的響應變慢以及卡頓。
對于雷達這種數(shù)據(jù)更新頻率相對穩(wěn)定的應用產品,定時更新是十分合適的選擇。根據(jù)實際應用場景選擇相應的刷新頻率可以避免頻繁的重繪和資源浪費,確保應用的性能;由于定時更新機制具有固定的時間間隔,不依賴于外部數(shù)據(jù)的到達時間,整個應用程序更加穩(wěn)定,也利于維護和調試。
2.3 多線程處理
為了保證線程安全,Qt的繪圖操作必須在主線程中進行。對于單幅QCustomPlot,會選擇直接在主進程中使用定時器繪制,但同時繪制多幅時,不同的刷新頻率以及不同的復雜計算都會影響用戶界面的響應速度,單線程在一定情況下還會導致性能瓶頸和用戶界面卡頓。
多線程能夠提高資源的使用效率,通過后臺子線程進行數(shù)據(jù)的處理和計算,讓主線程專注于繪制,提高數(shù)據(jù)處理和繪制效率,保證了主線程的流暢性,提高了用戶界面的響應性。將定時器放到子線程中運行,通常可以提高應用程序的整體性能,特別是在處理繁重任務或需要高定時精度的情況下。同時,使用多線程定時器可以將數(shù)據(jù)處理邏輯和圖表繪制邏輯分離,增強代碼的模塊化和可維護性。這樣可以更方便地進行擴展和調試,提高代碼的靈活性。
3 方法實現(xiàn)
本文的應用場景是雷達的頻率-幅度-時間瀑布圖以及多圖一維像同時顯示,具體流程如圖1所示。
3.1 預處理數(shù)據(jù)
3.1.1 數(shù)據(jù)抽樣
常用的數(shù)據(jù)抽樣方法包括:隨機抽樣、系統(tǒng)抽樣、分層抽樣、均值抽樣、最大(最?。┲党闃拥?。對于一維像、頻率幅度數(shù)據(jù),一般需要保留數(shù)據(jù)中的極端值和突變,而不是通過均值的方法將數(shù)據(jù)進行平滑處理,所以一般選取最大值抽樣的方法。例如:一維像數(shù)據(jù)給定了距離上10000點,可以通過最大值抽樣,每間隔5個點選取其中的最大點進行繪制。
3.1.2 緩存區(qū)的選取
隊列緩存和環(huán)形緩存是最為常用的2種緩存方式。其中環(huán)形緩存雖然可以更高效地利用內存空間以及更加實時地處理數(shù)據(jù),但是隊列緩存的動態(tài)數(shù)據(jù)流以及遵循先進先出順序的處理方式更加適合繪圖的流程。一維像、瀑布圖的繪制都可以有一定的延遲并且要嚴格按照順序進行數(shù)據(jù)繪制,所以本文選取隊列緩存的方式,其原理如圖2所示。
隊列緩存由隊列和緩存組成。隊列是一種數(shù)據(jù)結構,數(shù)據(jù)項按照進入的順序被處理,第一個進入的數(shù)據(jù)項最先被處理。緩存是一種存儲機制,臨時存儲頻繁訪問的數(shù)據(jù),以減少訪問時間。隊列緩存的工作流程為:接收數(shù)據(jù)后寫指針將數(shù)據(jù)寫入緩存塊,寫指針向后偏移,讀線程通過讀指針進行數(shù)據(jù)讀取,每讀取一次,讀指針向后偏移一次,當讀指針等于寫指針時數(shù)據(jù)讀取完畢,如果緩存區(qū)大小不夠,還可以通過動態(tài)開辟的方式進行緩存區(qū)擴展。
3.2 定時繪制
QTimer是Qt中一個非常方便的類,用來設置定時器,讓它在固定的時間間隔觸發(fā)一個信號,從而實現(xiàn)定時任務。
3.3 多線程處理方法
在Qt中每個線程都有自己的事件循環(huán),定時器依賴于事件循環(huán),因此如果要在一個線程中使用定時器,該線程必須有一個事件循環(huán)。
QTimer對象和它所依附的QObject必須在同一個線程中??梢允褂肣Thread管理工作線程,通過moveToThread()方法,將QObject移到一個特定的線程中,以確保它的定時器和事件處理與該線程關聯(lián)。具體操作如下。
創(chuàng)建一個QObject類timer,編寫QTimer的實現(xiàn),接著創(chuàng)建一個QThread類thread,設置thread的父類為主進程,然后在new timer時,通過timer-gt;moveToThread(thread)的方式,將定時器放入thread線程中,通過創(chuàng)建多個timer類和thread類實現(xiàn)多線程定時器。使用該方法須注意線程退出之前是否停止定時器,線程可能會因為定時器的存在而無法正常退出,須先關閉定時器,再退出線程。
4 實驗結果與分析
本文驗證平臺選型為:以飛騰2000系列為代表的國產CPU,操作系統(tǒng)為銀河麒麟V10操作系統(tǒng),采用Qt進行軟件的生成和應用。
首先,通過對多線程處理定時器繪圖和單線程處理定時器繪圖進行響應性與效率測試,分別選用繪制2張圖、繪制5張圖、繪制10張圖進行實驗,每組實驗進行50次左右的數(shù)據(jù)統(tǒng)計計算平均值,結果如表1—3所示。(響應繪制時間為第一次繪圖開始與數(shù)據(jù)發(fā)送之間的時間,總共耗時為數(shù)據(jù)發(fā)送直至所有圖繪制完畢的時間)。同時,本文還繪制了15、20、30、35、40、45、50張圖,并統(tǒng)計了數(shù)據(jù)趨勢如圖3—4所示。
通過表1—3數(shù)據(jù)可以得出:多線程繪圖對于性能有一定提升。
通過圖3—4可以得出:隨著繪圖個數(shù)的增加多線程響應繪制的時間基本不受影響,且相對于單線程耗時的增長趨勢更慢。
然后將多線程處理定時器應用于多圖繪制中,本文通過隨機數(shù)模擬的方式進行了數(shù)據(jù)的生成(非真實數(shù)據(jù)),通過生成數(shù)據(jù)進行繪制,其中瀑布圖的數(shù)據(jù)周期為200 ms,9幅曲線圖的數(shù)據(jù)發(fā)送間隔為5ms,數(shù)據(jù)周期為2 s,最終可以流暢地繪制多幅QCustomplot圖,并且具有較好的流暢性以及實時性效果,實驗結果如圖5所示。
最后,通過多次測試比較單線程方法與本文方法的響應時間和刷新時間,結果如表4所示。表4中," 單線程的刷新耗時為第一幅圖到最后一幅圖繪制完畢的時間,本文方法的刷新耗時是將所有圖的刷新耗時疊加。
綜上所述,本文提出的QCustomPlot多圖繪制方法在性能上有一定的提升,通過數(shù)據(jù)抽樣、緩存優(yōu)化、多線程的方式提供了更好的可視化需求。
5 結語
本文提出的QCustomPlot多圖繪制性能提高的方法通過實驗得到了驗證,在圖數(shù)量較多的情況下,能夠保持較快的實時性以及高度的流暢性。多圖繪制性能的提高,使得用戶可以更為直觀地從多個角度分析問題,提高了信息獲取效率,給用戶帶來了更好的用戶體驗。
但是,QCustomPlot繪制復雜圖片時數(shù)據(jù)樣本的復雜性對數(shù)據(jù)抽樣的選擇有極大的影響,只依靠一種抽樣方式得出的繪制結果可能不滿足預期,更加全面的抽樣方法須要進一步研究。
參考文獻
[1]鐘權,沈靜波,路偉欣.基于QCustomPlot和Qt的曲線繪制及顯示技術[J].科技視界,2017(6):46-47.
[2]史國舉.數(shù)據(jù)可視化技術在大數(shù)據(jù)分析領域的應用及發(fā)展研究[J].無線互聯(lián)科技,2021(18):96-97.
[3]張?zhí)炜?,單思洋,許曉耕,等.信息中心網(wǎng)絡緩存技術研究綜述[J].北京郵電大學學報,2016(3):15.
[4]蔣培培,吳昊,錢進.基于DDS傳輸?shù)妮^大數(shù)據(jù)包粘包的處理方法[J].無線互聯(lián)科技,2023(24):113-115,132.
[5]申時全.基于Linux多線程技術的網(wǎng)絡并發(fā)編程及應用研究[J].現(xiàn)代計算機(專業(yè)版),2016(31):65-70.
[6]陳旭濤.多圖層并行渲染關鍵技術與電力系統(tǒng)態(tài)勢可視化應用研究[D].廣州:華南理工大學,2022.
[7]倪桂強,陳志龍,姜勁松,等.基于多線程和緩存機制的定時器管理算法[J].計算機仿真,2015(12):142-145.
(編輯 沈 強編輯)
Performance improvement method for QCustomPlot multi-image drawing based on domestic platform
WU" Hao, JIANG" Peipei
(No.8 Research Academy of CSSC, Nanjing 211153, China)
Abstract:" QCustomPlot is a C++library class commonly used in Qt for drawing charts and images. The article proposes a method to improve the performance of multi image rendering in response to the problem of performance degradation when drawing large amounts of data in images, sample stacking through data preprocessing, increasing cache optimization to improve data storage and access efficiency, simultaneously utilizing multi-threaded processing and other methods to improve rendering performance. Data simulation shows that this method ensures the quality of image rendering and further improves the efficiency of multi image rendering. The results demonstrate the effectiveness of this method.
Key words: QCustomPlot library class; drawing; multiple charts; caching optimization; multi threaded processing