[英]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.