问题背景
游戏中存在较多对象管理系统,如常见的部队,道具,邮件等等。随着系统的增多,内存必然无序膨胀,为了避免内存膨胀,这些对象管理器都需要定期检查内存中是否闲置的对象数据是否可以卸载,因此实现一种通用且高效的闲时卸载组件就有比较高的应用价值。
那有什么方法可以卸载掉进程中闲置的对象呢?
首先想到的最笨的也是最快的方法大概是使用暴力遍历,即通过定时遍历全部存储对象,检测它的当前状态和最近使用时间,根据一定自定义策略卸载掉当前被判定为闲置的对象。但是如此,会存在许多问题:运行效率低,时间复杂度为O(n)。
解决方案
现在市面上有两种算法可以用来解决该问题:LRU和LFU。
LRU:网上的说法是,LRU基于一种假设:如果某个数据长期不被使用,在未来被用到的几率也不大;因此缓存容量达到上限时,应在写入新数据之前卸载最久未使用的数据,从而为新数据腾出空间,或者定时(10分钟)检测卸载符合闲置条件的对象。
LFU:LFU同样有这样的假设:如果一个数据在最近一段时间被访问到的频率很低,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被卸载;当存在多个键具有相同的使用频次时,则淘汰最久未使用的数据。
LFU和LRU类似,LFU主要在意访问频率,LRU主要在意最近的访问时间,实现上来说LFU会比LRU复杂一些,但是这也是LRU的优点,维护比较容易,且适合游戏的使用场景。比如说,玩家可能在某个时间段上线活跃,之后下线长时间不活跃。