C#中数据结构缓存的最佳结构?

时间:2010-11-15 07:02:48

标签: c# data-structures

这更像是一个概念性的问题,但我想知道最好的C#数据结构对于类似缓存的结构是什么。我会解释我在寻找什么。

我正在制作一款使用精灵来制作图形的游戏。精灵基于图像(SFML库图像,而不是标准的C#图像,但我认为这并不重要)。这些图像需要从磁盘上的文件加载,当需要快速连续创建许多精灵时,这会花费很多时间(时间)。为了减少一些加载时间,我想利用类似结构来存储图像文件,并在上次更新它们时(我将使用此更新时间来确定何时从缓存中清除内容)。将使用精灵名称和一些其他细节的组合来索引缓存。该索引将映射到如下结构:

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

当游戏请求精灵时,请求将发送给内容管理员,内容管理员将在缓存结构中查找匹配项。如果找到匹配,将找到如上所述的结构。内容管理器将使用该图像来制作精灵,然后将最后更新时间更新为调用结构的时间。如果未找到匹配项,将创建一个新的结构,并从图像文件加载图像(并用于制作精灵)。 lastupdate时间将设置为当前时间。驱逐时间基于预定义常量或请求中的可选组件设置。

现在继续我需要做的事情:定期,我需要遍历整个缓存,将每个struct的lastupdate与当前游戏时间进行比较。如果这两者之间的差异大于驱逐时间,我想从缓存中逐出结构条目。另外,如果精灵请求发出一个新的结构,并且缓存的大小大于预定义的值,我需要找到最近最新更新的结构并逐出它以为新结构腾出空间。

基本上,我正在寻找理想的数据结构,它可以快速查找索引键,并快速迭代时间更新/大小溢出驱逐。

制作字典是我的第一个想法,并且肯定有快速索引,但鉴于我将要删除元素并定期添加新元素,我关注性能。列表>可以工作,但随后查找需要时间。

作为参考,我可能会将cahce限制在每次约30-40张图像,范围从2 kb到500 kb,驱逐时间通常约为6分钟。我希望能够至少每1-2秒检查一次驱逐

我想知道是否有人可以提供一些有关最佳数据结构类型的信息。

由于

2 个答案:

答案 0 :(得分:3)

对于您陈述的用例(缓存中的40个项目,每1秒进行一次驱逐检查),字典应该是一个完全精细的数据结构。

如果您正在针对.NET 4进行开发,您还可以尝试使用内置的MemoryCache类:http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

无论哪种方式,您都应该进行一些性能测试,以确保您的应用程序顺利运行。

答案 1 :(得分:1)

我写的库中的一个类可能会给你一些启发 - 它类似但没有你描述的基于时间的缓存驱逐:

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

要记住的核心问题是,保留2个独立的数据结构并不是最糟糕的事情,因为您的ImageEntry是一个类(提示:不要使它成为结构)并且原始图像数据将是例如,大于维护字典和列表的额外开销。