簡體   English   中英

為什么該方法這么慢?

[英]Why that method work so slow?

我已經編寫了一個Windows Forms C#應用程序,用於繪制矢量原語,例如線條。 橢圓等。我有一種方法來更改選定圖形的邊框寬度。 這是方法:

   public void SetBorderWidth(int border)
    {
        if (border < 0) 
            return;

        if ((SelectedItem != null) && (SelectedItem.isGroup == false)) 
        {              
            SelectedItem.BorderWidth = border;
        }

        if ((SelectedItem != null) && (SelectedItem.isGroup == true))
        {

            ChangeCascadeBorderWidth(SelectedItem, border);
        }

        foreach (Shape figure in ObjectsDrawn)
        {
            if (figure.Selected)
            {
                ObjectsDrawn[ObjectsDrawn.IndexOf(figure)].BorderWidth = border;
            }

            if (figure.isGroup)
            {
                ChangeCascadeBorderWidth(figure, border);
            }
        }            
    }

誰調用該方法:

    private void ChangeCascadeBorderWidth(Shape group, int width)
    {
        foreach (Shape item in ((Grouping)group).GroupedElements)
        {
            if (item.isGroup == true)
            {
                ChangeCascadeBorderWidth(item, width);
            }
            else
            {
                item.BorderWidth = width;
            }
        }
    }

如果該圖是幾個圖的組。 但這工作太慢。 無論選擇一個還是一組數字,有時我都必須等待10-15秒。 用於更改邊框寬度。 為什么這么慢?

我的想法:

一個像素的寬度導致更快的性能,因為可以使用基於行的圖元渲染邊框。

當您使用大於1的寬度時,必須使用實體填充的基元,該基元會很慢。

您的代碼正在編輯SelectedItem的邊框,任何將Selected屬性設置為true的ObjectDrawn的邊框以及所有屬於組的所有繪制對象的邊框。

您是否要根據是否選擇了組形狀來過濾組邊界圖?
figure.isGroup && figure.Selected否則,似乎它將修改所有組的邊框,如果有很多,則無論選擇什么內容,都可能導致性能問題。

其他性能改進建議:
您可以在SetBorderWidth中執行此操作:
ObjectsDrawn[ObjectsDrawn.IndexOf(figure)].BorderWidth = border; 但是,您可以在ChangeCascadeBorderWidth中執行此操作: item.BorderWidth = width; 我建議您在SetBorderWidth函數中執行相同的操作,因為您已經擁有要修改的對象的實例,則IndexOf查找似乎不是必需的。

同樣,如果設置BorderWidth屬性的成本很高(即使設置為相同的現有值),則將對SetBorderWidth的調用包裝如下: if(item.BorderWidth != width) item.BorderWidth = width; 可以節省性能。 但是您必須根據設置邊框寬度的成本來評估比較的成本。

您發布的所有瓶頸似乎都來自於在形狀上設置BorderWidth屬性。 我猜想您會在BorderWidth中重新粉刷或更新形狀的布局。 如果在容器上設置BorderWidth,將會有很多不必要的重繪和布局更改,這在WinForms中是很慢的(特別是對於布局,如果形狀是從Control繼承的)。

可能我建議像其他WinForms控件一樣使用BeginUpdate * EndUpdate *機制嗎?

暫無
暫無

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

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