WPF繪製圖表時,1ms更新一次數據,界面變得特別卡?

如題,各位大神有沒有什麼好的方法可以解決這個問題。

需求是這樣的:這個的目的是有一個下位機,是一個自動控制系統,控制周期是1ms,然後要把控制量和輸出發送到電腦上,在電腦上繪製出來曲線,最好的效果是把每一毫秒的數據都顯示出來。


60fps的刷新率,每幀之間的間隔是16ms,如果要求30fps那interval就可以翻倍,就算顯示器是120Hz的,8ms刷新一次也夠了,你搞個1ms刷新一次,是要做雙屏120Hz 3D顯示嗎23333333

你要顯示每一毫秒的數據,沒必要每毫秒都刷新啊,攢夠32ms的數據,一下子畫出來肯定快不少


降低到1秒更新一次數據


思路錯了吧……

界面那裡起碼分兩層,收數據那裡隨便你多快,1ms一份就1ms一份,緩存起來,別畫。

但是畫面刷新顯示不能做到那麼快,做個比如0.1s刷新一次,一次讀那麼個100份,一次性畫出來。然後看起來就像實時了,畢竟人的反應能力有限。

這東西可以做的,我也做過,可以實現。


1ms更新一次那是1000FPS啊,別說WPF,大部分遊戲都做不到這種速度。如果確實需要這種更新頻率,Windows已經滿足不了你的要求了,請考慮實時操作系統。


0、1ms一次已經超出顯示器刷新頻率了,沒意義,可以設定一個小緩衝池,設定一個N ms的時間窗去更新

1、使用DataTable代替Column綁定,這樣可以避免顯式使用binding,只要DataTable一更新,DataGrid就會自動更新。

方法是將DataTable的DefautView置給ItemSource即可。

DataTable在自動生成列的時候,會默認產生DataGridTextColumn,然後有AutoGenerateColumn事件供你一個機會來修改。一般不要去替換這個自動生成的。

2、絕對不要使用DataGridTemplateColumn,性能非常差。

只要能用默認的DataGridTextColumn就用。效果可以通過CellStyle來修改

3、在數據進入DataTable以前提前計算好String並放入,而不是丟進去後靠ValueConvertor來計算。後者調用次數太多,影響性能


就算有實時要求也沒必要1ms更新一次吧,顯示器刷新率一般是60hz。。。。。。。最快也不必短於16ms的更新間隔


樓主說最好是每1ms的數據都要有。那就弄個緩衝區,界面的更新如樓上所說降低到1s或者多少也好。重點是緩衝區吧,把1ms的數據收集一下,每次更新前1秒的緩衝區所有數據。


降低刷新率啊,你的刷新速度都完爆顯示屏了,這麼刷新也沒意義

實際上我開始做這種帶實時曲線軟體的時候也是想做到實時刷新。但是後來想了下,你1ms刷一次和30ms刷30個數據點,只要數據點不太稀疏(1k/s)肉眼看沒什麼區別嘛。。。。


加錢上顯卡,你這fps1000普通顯卡受不了啊


樓主啊,你顯示那麼快是用來做實時模式識別嘛?

哈哈哈,模式識別本來就談不上實時啊,再說,攝像頭才100,你也犯不上整1000啊。。

如果是眼看,你還是緩存下來沒1到2秒刷新一次吧。。。

再說了,曲線顯示就是看個趨勢。我才不信你能用眼睛分辨的出毫秒的數,尤其通常來說時間軸是1秒一寸這個量級的時候。。。所以我的建議是,數據後台存文件,前台100個裡面挑1個顯示就得了唄


一般顯示適配器刷新率定義在50Hz和60Hz,而且這個刷新率也超過了視覺暫留的極限。

所以建議將刷新間隔改為至少20ms。

其實緩存一下數據,100ms的繪圖間隔也是可以接受的。


這是一個把本應時速60的車開到時速1000的概念……

開慢點,或者換開飛機,你自己選一個


需求沒寫清楚啊,是要只分析幾秒鐘的數據還是一直要實時顯示?只分析幾秒鐘的數據的話沒必要刷新,默默收集就好了,收集完之後從緩存中讀數據一次性繪製表格,不過CPU資源也夠嗆;要實時顯示,人眼最多就分辨1/10S的畫面啊~1000FPS有什麼卵用


你可以想想示波器1g採樣率按照你的思路來,啥顯示器招的住呢。

這方面做了好多年了,抽時間好好寫寫。


題主好厲害,以前我做itron都沒幹過1ms刷新一次。。。

建議數據接收和UI刷新分開考慮,實時接收數據,定時(1秒)刷新UI。

如果真的真的需要毫秒級的數據(不是用來實時目視的吧?),可以先累積寫在內存里,定時或定量寫文件。


要使界面變得看起來流暢只需要刷新頻率超過人眼能識別的範圍就好了。

所以為保證實時性,下位機有數據就更新上來,在上位機軟體中緩存。

上位機的界面我一般都寫成50ms刷新一次。


題主是有什麼特殊需求嗎?刷新這麼快


如果不是實時需求的話,建議降低更新頻率


推薦閱讀:

Mono的應用廣泛嗎?
誰能介紹學習.net core的書籍或者大神寫的blog?
WPF如何判斷程序是不是第一次啟動?
微軟的.NET戰略是不是已經失敗了?
同事離職,我接盤了個垃圾項目,該如何是好?

TAG:微軟Microsoft | NET | WindowsPresentationFoundationWPF |