簡體   English   中英

像C#中的數據結構一樣,緩存的最佳結構?

[英]Best structure for cache like data structure in C#?

這是一個概念上的問題,但是我想知道對於像緩存這樣的結構來說,最佳的C#數據結構是什么。 我會解釋我在尋找什么。

我正在制作一個使用精靈圖形的游戲。 Sprite基於圖像(SFML庫圖像,而不是標准C#圖像,但我認為這並不重要)。 這些圖像需要從磁盤上的文件中加載,並且當需要快速連續創建許多精靈時,這樣做可能會增加成本(在時間上)。 為了減少一些加載時間,我想使用類似cahce的結構來存儲圖像文件以及它們的最后更新時間(我將使用此更新時間來確定何時從緩存中刪除內容)。 高速緩存將使用精靈名稱和其他一些詳細信息的組合進行索引。 該索引將映射到如下結構:

struct ImageEntry
{
    Image image;
    TickCount lastupdate;
    TickCount evictionTime;
}

當游戲請求精靈時,該請求將發布給內容管理員,后者將在緩存結構中尋找匹配項。 如果找到匹配項,則將找到上述結構。 內容管理器將使用圖像制作精靈,然后將lastupdate時間更新為調用該結構的時間。 如果找不到匹配項,將創建一個新的結構,並從圖像文件中加載圖像(並用於制作精靈)。 最后更新時間將設置為當前時間。 驅逐時間是基於預定義常量或請求中的可選組件設置的。

現在,這里是我需要做的:定期,我需要遍歷整個緩存,將每個結構的lastupdate與當前游戲時間進行比較。 如果兩者之間的差異大於收回時間,我想從緩存中逐出struct條目。 另外,如果一個sprite請求發出一個新的結構,並且緩存的大小大於預定義的值,那么我需要找到更新最少的結構並將其逐出以為新結構騰出空間。

本質上,我正在尋找理想的數據結構,該結構具有用於索引鍵的快速查找以及用於時間更新/大小溢出逐出的快速迭代。

制作字典是我的第一個想法,並且肯定具有快速的索引編制能力,但是鑒於我將定期刪除元素並添加新元素,因此我擔心性能。 List>可以工作,但是查找將需要一些時間。

作為參考,我可能一次將cahce限制為大約30-40張圖像,范圍從2 kb到500 kb,逐出時間通常約為6分鍾。 我希望能夠至少每1-2秒檢查一次驅逐

我想知道是否有人可以提供一些有關最佳數據結構類型的見解。

謝謝

對於您陳述的用例(高速緩存中有40個項目,每1秒鍾進行逐出檢查),字典應該是一個完全好的數據結構。

如果您是針對.NET 4開發的,則還可以嘗試使用內置的MemoryCache類: http : //msdn.microsoft.com/zh-cn/library/system.runtime.caching.memorycache.aspx

無論哪種方式,您都應該進行一些性能測試,以確保您的應用程序可以平穩運行。

我編寫的庫中的一個類可能會給您一些啟發-相似,但是沒有您描述的基於時間的緩存驅逐:

https://github.com/xpaulbettsx/ReactiveXaml/blob/master/ReactiveXaml/MemoizingMRUCache.cs#L31

不過要記住的核心是,保留2個單獨的數據結構並不是最糟糕的事情,因為ImageEntry是一個類(提示:不要使其成為結構),並且原始圖像數據將比例如,同時維護字典和列表的額外開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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