2014-03-31 81 views
0

我有一個圖形WinForms控件的兩個實例。該圖形由DirectX渲染,並可能包含動畫內容。Winforms飢餓控制失效

我開始通過實施不斷呈現的內容:

public override void OnPaint(...) 
{ 
    base.OnPaint(...); 

    // Render scene 

    this.Invalidate(); 
} 

而且CPU佔用率過高,這種方法會導致其他控件的無效的飢餓:一個控件的是一次又一次的重新描繪和其它控制等待爲CPU執行失效請求,這是永遠不會發生的(除非以某種方式強制它像調整窗口大小)。

所以我刪除'this.Invalidate()'調用,只有在需要刷新時調用它。當沒有動畫顯示時它確實解決了問題,但是如果兩個控件都顯示動畫內容,則問題再次出現。

我想過在一個集中式管理器中管理應用程序中的所有控件,它將「調度」循環法中的無效調用。然而,我並不滿意在一個集中的位置需要了解應用程序中的所有控件,我不確定這是否是解決問題的正確方法。

有沒有解決這個問題的標準方法?

回答

1

在塗料事件期間您不需要Invalidate。這隻會導致另一個油漆事件,一次又一次永遠。當你的數據改變時你想要Invalidate,並且如果可能的話,你也可以只用一個區域來最小化重繪。

對於一個動畫,你會想要根據你的幀率調用Invalidate。您可以使用Timer或其他一些機制來執行此操作。

+0

感謝您的回覆,很高興知道我的實施不符合標準。然而,當使用動畫時,在渲染每幀之後立即一次又一次地失效導致更平滑的動畫(並且我有一些客戶注意到不同之處......)。因爲動畫是短時間的,所以我可以通過渲染這種方式並使用CPU,但我仍然不希望動畫控件會導致其他控件捱餓。有沒有辦法做到這一點? – MaMazav

+0

@MaMazav:就像我說的,使用計時器。假設你想以20fps刷新。因此,創建一個計時器,將間隔設置爲1000/20 = 50ms,並在Tick事件中調用「Invalidate」。 –