簡體   English   中英

具有高CPU使用率的GDI繪圖應用程序

[英]GDI drawing application with high CPU usage

我有一個應用程序,用戶可以在其中繪制一些形狀。 當我單擊某個形狀並將其拖動時,由於MouseMove中的Invalidate(),CPU的運行速度為100%。 如果我使用計時器,並從滴答事件中調用Invalidate(),移動就不會那么順利。 還有其他方法可以最大程度地減少CPU並使移動平穩嗎?

  ` Point startDragMousePoint;
    Point startShapeLocation;
    private void Canvas_MouseMove(object sender, MouseEventArgs e)
    {
        if(isMouseDown)
        {
            Point deltaPoint = Point.Subtract(e.Location, new Size(startDragMousePoint));
            shape.Location = Point.Add(startShapeLocation, new Size(deltaPoint));
            Invalidate();
        }
    }

    private void Canvas_Paint(object sender, PaintEventArgs e)
    {
       shape.Render(e.Graphics);
    }`

有三種通用解決方案。

1)不要在移動時畫圖,這是很長一段時間以來在窗戶上的解決方案,當您拖動窗戶時,窗戶消失了,您看到了窗戶的輪廓。

2)創建一個位圖對象,然后將其移動。 請注意,您將不得不重新繪制其下方的區域。

3)不要使孔窗口無效,僅使要更改的區域無效。 繪制到緩沖區(位圖)可以幫助您重用區域。

另外,如果GDI不是世界上最快的繪圖功能。 如果形狀非常復雜,則可能需要考慮使用OpenGL,DirectX或SDL。

除了使整個區域無效之外,您還可以使用以下方法使已更改的控件部分無效:

Rectangle changedArea = new Rectangle(cX, cY, cW, cH);
this.Invalidate(changedArea);

還要確保您的控件設置為使用DoubleBuffering

 this.DoubleBuffered = true;

從您提供的有限代碼來看,我認為無效不會造成任何問題。 問題很可能出在您shape.Render()的真實渲染代碼中。 過去,我編寫過類似的應用程序,其中我在鼠標移動時調用了Invalidate,並且應用程序運行良好。 啟用雙緩沖后,只有一些閃爍發生了。

暫無
暫無

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

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