繁体   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