2011-01-28 67 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(); 
     }