簡體   English   中英

內存使用和導航的自定義控制問題

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM