[英]How do I reduce high CPU usage because of a C# Windows forms custom control being redrawn frequently?
Ogmo Editor是使用C#編寫的一個不錯的開源2D地圖編輯器,不幸的是它具有很高的CPU使用率問題-每當您打開實際的關卡編輯屏幕時,它就會完全飽和單個CPU內核。 我查看了源代碼,並進行了分析,得出的結論是, LevelEditor自定義控件的OnPaint處理程序被重復調用。 我對Windows Forms API不太熟悉,並查看了有關自定義控件的MSDN文檔 ,但無法確定問題的根源。
然后,我查看了另一個名為tIDE的類似開源項目,對我來說,它似乎正在渲染其編輯屏幕-MapPanel控件以一種非常相似的方式-有關詳細信息,請參見鏈接中的OnMapPaint()函數定義。
我不確定控件為什么在不更改時應該刷新,我認為熟悉API的人也許可以提出解決方案。
嘗試這個。 派生自己CustomLevelEditor
從OgmoEditor.LevelEditors.LevelEditor
。 然后像這樣重寫OnPaint事件。
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
System.Threading.Thread.Sleep(1);
}
在兩次繪畫事件之間的UI線程中睡眠1毫秒將大大降低CPU周期。 如果OnPaint
不停地被基本控件觸發,那么您可以嘗試這樣的操作。
int paintReps = 0;
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
System.Threading.Thread.Sleep(1);
if(paintReps++ % 500 == 0)
Application.DoEvents();
}
我希望這有幫助。 照顧自己。
問題是關卡編輯器文件中的以下代碼:
void Application_Idle(object sender, EventArgs e)
{
Invalidate();
LevelView.Update();
}
Application Idle事件恰好在應用程序即將變得空閑之前發生,這導致了無限的重繪循環,這會占用大量處理器。 刪除Invalidate()調用需要更新代碼,以便每當發生用戶交互時都可以重繪,這需要更改項目中的多個文件,並且可以在Bitbucket上看到生成的提交。
對於其他有類似問題的人,可能由於控件或手動Invalidate()調用的更改而導致重繪過多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.