[英]Custom control problem with memory usage and navigation
上面是我正在處理的自定義控件的圖像。 它實際上是Windows窗體中的三個單獨的控件。 它是一個容器控件,其中包含“平台/控制台”控件的多個實例。 “平台”控件包含“游戲”控件的多個實例。 控制台是可折疊的,這會將游戲隱藏在列表中。
現在,我遇到的問題是,當一個人說出3000個游戲標題時,內存使用量增加了500MB左右,並且控制非常緩慢。 現在我還沒有優化應用程序線程之外的創建,但是即使在創建之后,它仍然是豬。
一個人如何釋放屏幕外控件上的資源? 是否有比測試每個控件以查看是否在某個可見區域中更快的方法? 我應該設計此控件有其他方法嗎?
我沒有C#的豐富知識,因此任何建議將不勝感激。
如果將控件“虛擬化”,則可以減少內存占用。 看一下ListView,如果您設置ownerDrawn = true以及VirtualMode = true和VirtualListSize = 3000,則以下代碼將創建項目(並存儲它們)並進行自定義繪制。
您可能需要進行一些額外的編程,因為在您的所有者繪制的控件上沒有免費提供的...
// should be a cache of some sort, WeakReference'd etc, this is NOT reducing memory load (it is adding memory load)
Dictionary<Int32, ListViewItem> dict = new Dictionary<int, ListViewItem>();
private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
ListViewItem lvi = null;
if (dict.ContainsKey(e.ItemIndex))
{
Debug.WriteLine(String.Format("from cache:{0}", e.ItemIndex));
lvi = dict[e.ItemIndex];
}
else
{
Debug.WriteLine(String.Format("created:{0}", e.ItemIndex));
lvi = new ListViewItem { Text = String.Format("item:{0}", e.ItemIndex) };
lvi.SubItems.Add( new ListViewItem.ListViewSubItem{Text = String.Format("si:{0}", e.ItemIndex)});
dict.Add(e.ItemIndex, lvi);
}
e.Item = lvi;
}
private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
// you can draw yourself...
// e.Graphics.DrawString(e.Item.Text, System.Drawing.SystemFonts.DefaultFont, new SolidBrush(Color.Red), 0f, 0f);
e.DrawText();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.