簡體   English   中英

由於頻繁重繪C#Windows表單自定義控件,如何減少高CPU使用率?

[英]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的人也許可以提出解決方案。

嘗試這個。 派生自己CustomLevelEditorOgmoEditor.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.

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