内存使用和导航的自定义控制问题

时间:2011-01-28 20:55:28

标签: c# winforms custom-controls

Custom list style control

上面是我正在处理的自定义控件的图像。它实际上是Windows窗体中的三个独立控件。它是一个容器控件,它包含“平台/控制台”控件的多个实例。 “平台”控件保存“游戏”控件的多个实例。控制台是可折叠的,可以隐藏列表中的游戏。

现在我遇到的问题是,当一个人说3000个游戏时,内存使用量大约为500MB,控制非常缓慢。现在我还没有优化应用程序线程的创建,但即使在创建之后它也是一头猪。

一个人如何在已经移出屏幕的控件上释放资源?有没有比测试每个控件更快的方法来查看它是否在某个可见区域?我应该采用不同的方式来设计这种控制吗?

我对C#没有广泛的知识,所以我们非常感谢任何建议。

1 个答案:

答案 0 :(得分: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();
        }