2011-01-28 60 views
1

Custom list style control內存使用和導航的自定義控制問題

上面是我正在處理的自定義控件的圖像。它實際上是一個窗體中的三個獨立控件。這是一個容器控件,它包含「平臺/控制檯」控件的多個實例。 「平臺」控件包含「遊戲」控件的多個實例。遊戲機是可摺疊的,可將遊戲隱藏在列表中。

現在我遇到的問題是,當一個人說3000個遊戲標題時,內存使用量高達500MB左右,而且控制非常緩慢。現在我還沒有優化創建應用程序線程,但即使在創建之後,它仍然是一頭豬。

一個人將如何去除已經移出屏幕的控件的資源?有沒有比測試每個控件更快的方法來查看它是否在某個可見區域?有沒有不同的方式來設計這種控制?

我沒有廣泛的C#知識,所以任何建議將不勝感激。

+0

這是一個真棒集的PS1遊戲,你必須有:d – 2011-01-28 21:28:44

+0

笑。是的,我是一個FF粉絲:) – Redshirt 2011-01-28 21:35:03

回答

1

如果您將控件設置爲「虛擬化」,則可能會減少內存佔用量。看看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(); 
     }