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

C#中类似缓存的数据结构的最佳结构?,c#,data-structures,C#,Data Structures,这更像是一个概念性的问题,但我想知道对于类似缓存的结构来说,最好的C#数据结构是什么。我会解释我在找什么 我正在制作一个游戏,使用精灵来制作图形。sprite是基于图像的(SFML库图像,不是标准的C#图像,但我认为这并不重要)。这些图像需要从磁盘上的文件中加载,当需要快速连续创建多个精灵时,这可能会导致成本高昂(时间方面)。为了减少一些加载时间,我想使用类似cahce的结构来存储图像文件,以及它们上次更新的时间(我将使用此更新时间来确定何时从缓存中移出内容)。缓存将使用精灵名称和一些其他详细信

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

我正在制作一个游戏,使用精灵来制作图形。sprite是基于图像的(SFML库图像,不是标准的C#图像,但我认为这并不重要)。这些图像需要从磁盘上的文件中加载,当需要快速连续创建多个精灵时,这可能会导致成本高昂(时间方面)。为了减少一些加载时间,我想使用类似cahce的结构来存储图像文件,以及它们上次更新的时间(我将使用此更新时间来确定何时从缓存中移出内容)。缓存将使用精灵名称和一些其他详细信息的组合进行索引。此索引将映射到如下结构:

struct ImageEntry
{
    Image image;
    TickCount lastupdate;
    TickCount evictionTime;
}
当游戏请求一个精灵时,该请求将发送给内容管理器,内容管理器将在缓存结构中查找匹配项。如果找到匹配项,则会找到类似上面的结构。内容管理器将使用该图像制作精灵,然后将lastupdate时间更新为调用该结构的时间。如果未找到匹配项,将创建新的strucut,并从图像文件加载图像(用于制作精灵)。lastupdate时间将设置为当前时间。逐出时间是基于预定义的常量或请求中的可选组件设置的

现在我需要做的是:定期运行整个缓存,将每个结构的上次更新与当前游戏时间进行比较。如果这两者之间的差异大于逐出时间,我想从缓存中逐出struct条目。此外,如果一个sprite请求发出一个新的结构,并且缓存的大小大于预定义的值,我需要找到最近更新最少的结构并将其逐出,以便为新结构腾出空间

本质上,我正在寻找理想的数据结构,它具有索引键的快速查找和时间更新/大小溢出驱逐的快速迭代

制作字典是我的第一个想法,这当然有快速的索引,但考虑到我将定期删除元素并添加新元素,我担心性能。列表>可以工作,但是查找需要时间

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

我想知道是否有人能提供一些关于用于此的最佳数据结构类型的见解


谢谢

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

但要记住的核心是,保留两个独立的数据结构并不是最糟糕的事情,因为ImageEntry是一个类(提示:不要将其设为结构),并且原始图像数据将比维护字典和列表的额外开销(例如)大几个数量级。

(缓存中有40项,每1秒逐出检查一次)字典应该是一个完全精细的数据结构

如果您是针对.NET 4开发的,还可以尝试内置的MemoryCache类:


无论如何,你都应该做一些性能测试,以确保你的应用程序运行顺畅。

我一直在认真阅读这个问题,直到“大约每1-2秒30-40个图像,从2 kb到500 kb”……真的吗?这显然是一个过早的问题,尽管我不确定这是否是一个优化。MemoryCache与类一起工作,而不是与类一起工作在我的例子中,我想从磁盘缓存一个24字节的对象——使用结构(而不是类)比使用MemoryCache节省更多。