簡體   English   中英

Qt中屏幕繪制和鍵盤按鍵事件的確切延遲

[英]Exact delay in screen draw and keyboard keypress event in Qt

我正在做一個Qt項目,其中某些事件的確切發生時間至關重要。 具體來說:我有一個非常簡單的動畫,必須在特定時間繪制到屏幕上,例如t1。 一旦我發布了QWidget更新以開始動畫,它將花費一小段時間dt(取決於屏幕刷新率等)在屏幕上實際顯示更新。 我需要測量這額外的時間dt。 我不確定該怎么做。

我考慮過在QWidget的paint事件中使用QTimeQElapsedTimer對象,但是我不確定這是否可以實現我的目標。

類似地,當用戶按下某個鍵時,將基於鍵盤的輪詢速率在短暫的延遲后將其注冊。 我還需要考慮這一延遲。 如果我能獲得投票率,我平均知道延遲將達到多少。

根據定義,您要的是無法從計算機內部實現的。

您希望如何分辨像素“實際顯示”在屏幕上的時間,而傳感器不會粘在顯示器上,也不會同步到計算機也可以訪問的原子鍾? :-)

由於Qt通常用作Win / OSX / Linux之上的抽象層,因此與Qt的可能性甚至更大。 首先,這些不是任何種類的實時操作系統

您所知道的只是當您要求發生某些事情時。 然后,您可以確定要重新控制另一個請求所花費的時間。 通過執行此操作,可以對基本的“幀速率”吞吐量設置一些期望,但是有無數因素可能隨時導致性能差異很大。

如果您可以深入研究內核/驅動程序級別,則可以找到對硬件產生實際影響的更精確的度量。 但這不是Qt的領域,並且仍然沒有告訴您這種影響何時在外界顯現的“實際”答案。

關於Qt的最佳建議是定期QTimer 它可以以(大約)毫秒的分辨率進行回調。 如果那還不夠好……您將需要一艘較小的船。 :-)

與搜索字詞“高分辨率計時器”相關的內容可能會給您帶來一些幫助:

我考慮過在QWidget的paint事件中使用QTimeQElapsedTimer對象,但是我不確定這是否可以實現我的目標。

實際上,這是唯一的方法,並且實際上是您可以做的所有事情。 如果不依靠實時操作系統,自定義驅動程序或外部硬件,則無法做其他任何事情。

您可能不需要兩者QElapsedTimer測量自上一次更新以來經過的時間。

請注意,當事件循環為空時,假設未搶占您的進程,則在widget.update()調用與paintEvent執行之間的延遲不到一微秒。

這是一些研究的反應時間實驗。 呈現了視覺輸入,用戶可以通過鍵盤或鼠標對其進行響應。 為了能夠精確地找到反應時間,我需要知道何時在屏幕上顯示刺激,何時按下鍵。

實際上,只有一種方法可以正確地做到這一點,而無需借助實時操作系統或自定義驅動程序,而還有很多方法可以做到這一點。 那么,正確的方法是什么?

屏幕的一小部分需要與視覺刺激的呈現同時改變顏色或亮度。 您將光纖連接到屏幕,然后將其饋送到連接到外部事件計時器的接收器中 鍵盤中的觸點閉合也被饋送到同一事件計時器。 這使您可以精確地對響應的延遲進行計時,而無需考慮操作系統延遲,線程搶占等問題。如果您願意做更多的開發工作,則事件計時器可以和Arduino一樣便宜。

如果要重復顯示刺激並且在刺激演示之間需要一定的時間,則只需重復演示一次,並在數據中收集響應延遲和刺激到刺激的時間。 然后,您可以丟棄超出所需公差的演示文稿。

這種方法與屏幕無關,只要您可以在某種程度上與計時器硬件接口,您就可以在移動設備上使用它。 計時器硬件當然可以聯網,從而簡化了接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM