发明内容
针对现有技术的不足,对一般游戏资源缓存***实现的现状与造成的原因加以深入分析,分析逻辑与数据有哪些流程上的特点,以及有哪些小粒度可重用的组件本发明的技术方案提供了一种基于周期成本的游戏资源缓存方法和***,以达到大大缩短游戏***开发周期,增强代码可维护性与可重用性,大大加强游戏的运行稳定性与渲染效率和效果表现的目的。
本发明的技术方案包括一种基于周期成本的游戏资源缓存方法,其特征在于,该方法包括:A.根据主存请求获取新加入缓存的页面数据,在每个页面数据创建一维数组,并在数组创建并初始化对应的自定义第一整数变量;B.每次当页面数据被使用或未被使用时将对应的标识在第一整数变量进行记载,并计算页面的生命周期百分比;C.使用第二整数变量计算不同类型的页面数据的相对成本;D.当新加入的页面时,遍历缓存中所有页面的生命周期百分比及相对成本,根据生命周期百分比及相对成本计算页面被取代时所付出的抖动成本,将抖动成本低于指定阈值的页面替换为新加入页面。
根据所述的基于周期成本的游戏资源缓存方法,该方法还包括:所述一维数组存放于开辟的缓存空间,所述缓存空间可以自定义增加和删除。
根据所述的基于周期成本的游戏资源缓存方法,该方法还包括:所述第一整数变量为32位整数变量,所述第二整数变量为通常变量并且大小没有限制。
根据所述的基于周期成本的游戏资源缓存方法,所述步骤A还包括:根据主存请求加载指定页面至缓存空间,并记录页面数据的类型、大小及加载时间,在页面创建对应的一个32位整数变量并初始化为1,其中的标识位为1。
根据所述的基于周期成本的游戏资源缓存方法,所诉步骤B还包括:S51,每隔固定时间段,当页面被使用时,对第一整数变量的标识位进行左移,并将新增位记载为1,当页面未被使用时,对第一整数变量的标识位进行左移,并将新增位记载为0;S52,标识位左移时,计算生命周期百分比,包括获取位移次数及使用次数,计算使用次数与位移次数的比值。
根据所述的基于周期成本的游戏资源缓存方法,所述相对成本为:通过游戏资源对应的页面数据量与发送页面数据量的计算得到,对应的,对于不同的游戏资源数据其计算相对成本的方式不同。
根据所述的基于周期成本的游戏资源缓存方法,所述步骤D还包括:S71,对放入缓存的超过预设时间量的游戏资源数据页面的生命周期百分比进行检测,并将生命周期百分比作为页面每次使用的生命周期百分比成本;S72,为超过指定阈值生命周期百分比成本的页面创建暂存区,同时在暂存区循环执行步骤S71检查是否存在生命周期百分比成本高于指定阈值且该页面在一定时间内没有被使用,若存在则删除对应游戏资源数据页面。
根据所述的基于周期成本的游戏资源缓存方法,所述步骤D还包括:S81,当有新的游戏资源页面加入时,获取缓存中所有页面的生命周期百分比成本及相对成本;S82,计算替换页面时所产生的抖动成本,当计算结果大于预设的值时,则保留页面,若小于预设值则将页面从缓存中剔除,其中抖动成本为生命周期百分比成本与相对成本的乘积;S83,对于具有相同抖动成本及抖动成本位于阈值附近的页面,优先剔除生命周期百分比成本的页面。
本发明的技术方案还包括一种基于周期成本的游戏资源缓存***,其特征在于,该***包括:页面初始化模块,用于根据主存请求获取新加入缓存的页面数据,在每个页面数据创建一维数组,并在数组创建并初始化对应的自定义第一整数变量;页面记载模块,用于每次当页面数据被使用或未被使用时将对应的标识在第一整数变量进行记载,并计算页面的生命周期百分比;成本计算模块,使用第二整数变量计算不同类型的页面数据的相对成本;页面替换模块,当新加入的页面时,遍历缓存中所有页面的生命周期百分比及相对成本,根据生命周期百分比及相对成本计算页面被取代时所付出的抖动成本,将抖动成本低于指定阈值的页面替换为新加入页面。
本发明的有益效果为:缓存页面替换性能的全面增加;较低的抖动开销和填充缓存所需成本;加强游戏的运行稳定性与渲染效率和效果表现。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。本发明的周期成本的游戏资源缓存方法和***适用于游戏数据的处理。
图1所示为根据本发明实施方式的总体流程图。A.根据主存请求获取新加入缓存的页面数据,在每个页面数据创建一维数组,并在数组创建并初始化对应的自定义第一整数变量;B.每次当页面数据被使用或未被使用时将对应的标识在第一整数变量进行记载,并计算页面的生命周期百分比;C.使用第二整数变量计算不同类型的页面数据的相对成本;D.当新加入的页面时,遍历缓存中所有页面的生命周期百分比及相对成本,根据生命周期百分比及相对成本计算页面被取代时所付出的抖动成本,将抖动成本低于指定阈值的页面替换为新加入页面。
图2所示为根据本发明实施方式的纹理剔除流程图。如下所示
(1)便于去除旧的纹理,让纹理去证明它们是被场景所需要的。一旦证明了这一事实,它们就被保留。一旦获得一50%以上的生命周期百分比成本,它就会很难从缓存中释放。
(2)建立了一个暂存区。还没有证明它们是有用的新的纹理被转化为暂存区,这是一个好方法,因为新的纹理往往是暂时的,在下一帧消失的概率较高。
(3)这是一个修改的最近没有使用方法。在很短的时间内,有较髙可见频率的纹理,可以很容易地跳到50%的生命周期百分比成本,但然后再掉下来,在多帧后,它们的生命周期百分比成本缓慢回落。生命周期提供了访问变量的一个修改了的表示法,并允许额外的分析。因此,如果生命周期百分比成本>60%,但纹理在最近的几帧没有被使用过,那么可以检查此情况并早些清除该纹理。
(4)删除对应的旧纹理。
本发明的技术方案还公开了以下技术特征:生命周期和成本指标概述、生命周期算法及
生命周期和成本指标概述:
当从主存请求数据时,操作***将读出的数据放到一个临时的内存区域中(称为高速缓存或缓存),它可以以比主存更快的速度进行存取。高速缓存本身有一个预定义的尺寸,它被分割成较小的称为页面的内存集合。当内存存取时,缓存本身会被填满,此时,操作***必须从缓存中选择一个页面来存放新来的页面数据。这种情况被称为高速缓存未命中。当需要的页面数大大超过缓存的大小时(通常为2倍或更多),缓存抖动就发生了,也就是说,为了给新来的整个数据集腾出空间,整个缓存都将被丢弃。缓存抖动被认为是任何缓存算法的最坏情况,也是任何缓存替换性能测试的焦点。
存储器处理程序要从主存获取信息时,每次都有相关的消耗。通常是因为采用了额外的、靠近处理器本身的内存芯片,所以从缓存读取的消耗较小。因而,如果发生缓存未命中,在决定清除存储器的哪个页面时,其中的一个主要目标是:选择一个在缓存中并不需要有效槽的页面。例如,如果在故障发生的过程中随机选择一个页面来删除,但是,这个页面被删除后恰好立即被需要,这将引起另外一个从主存重新获取数据的性能开销。目标是建立一个算法,它能最好地描述要从缓存删除的理想页面,以减少缓存未命中和性能负担。
在游戏开发中,程序员必须和硬件和软件层的缓存打交道,尤其是在游戏机领域,程序员不停地努力增加游戏内容,同时还得满足内存限制。如同许多其他的为解决一个具体问题而定做的替换算法,有些共同的游戏和图形***需要一个更类似于内存模式和使用模式的替换***。
本方案以在当代硬件上大多数游戏面临的一个问题为例,那就是设计一个自定义的纹理缓存。要做到这一点,用户将保留一个静态的一维数组缓存页面,可以用来加载和卸载数据。假设用户正在使用一个多维纹理缓存,即放在缓存的数据来自纹理,因为各种大小的多纹理可以容纳在一个单一的缓存页面中,所以缓存是多维的。例如,如果缓存页面可容纳一个256x256的纹理,那么,还可以支持4个64x64的纹理、16个32x32的纹理等,包括可以和谐地存在于同一个页面的每个尺寸的倍数。
这个简单的例子中显示了标准替换函数表现不佳的基础。考虑多维缓存的情况,需要***一个新的256x256的页面到一个缓存,而这个缓存只是用一些32x32的纹理完全填满。简单的最近最少使用算法方案不具备必要的数据来合适地计算哪个缓存页面是最佳替换页面。同时,因为访问模式在很大程度上远不止依赖于页面最后被替换的时间,所以它也不能合适地计算哪组32x32的纹理需要被清空。因此,在这种情况下,为了更好地分析最佳替换页面,本文提出了一套新的替换指标。
生命周期算法:
生命周期算法知道一个页面在缓存中的使用数量,并替换那个在最远的时间才会被使用的页面。大多数替换算法尽其所能地用各种数据访问模式来效仿这一算法。为了最好地预测未来的用法,生命周期算法通过保留一个在前几帧中使用情况的概念来模拟这个过程。即需要掌握在一个时间窗口内一个页面被访问了多少次。为了完成这项任务,在缓存中的每个页面保留一个32位的整数变量,当一个页面首次进入缓存时,此变量被初始化为
1(0x00000001)。
对于每一帧,在缓存中的所有活跃页面左移一位,标志着它随着时间的折旧。如果一个活跃的页面在此帧被使用,那么生命周期变量的最低有效位设置为1,否则设置为0。这个移位和设置模式允许对过去的32帧保留一个使用评估。
例如,一个每两帧被使用一次的页面将有一个生命周期变量OxAAAAAAAA(010101010…01),而一个首次加载时被大量使用但以后再也没有被用的页面,将有生命周期变量OxFFFFOOOO(1111…1100000…00)。
为表明生命周期变量随着时间的变化,在一个8帧的时间窗口,考虑一个在第一、第三、第四和第八帧被使用的页面。生命周期变量将进行如下改变:
第1帧一00000001(使用)
第2帧一00000010(不使用)
第3帧一00000101(使用)
第4帧一00001011(使用)
第5帧一00010110(不使用)
第6帧一00101100(不使用)
第7帧一01011000(不使用)
第8帧一10110001(使用)
有了这样的数据结构,可以计算出指定窗口的生命周期百分比成本。通过用页面被使用过的帧数(位为1的个数)除以生命周期变量中的总帧数,得到一个页面被使用及未被使用的平均帧数。这些数据可以用汇编和处理器启发式得到,而不需要高级代码。虽然可以用自己的方式表达这个数据,但是,提出的生命周期百分比成本作为一个单位化的在(0,1)之间的单一值存在,如“生命周期和成本”一部分所述,此值可以作为一个相对于其他指标的标量。
当使用生命周期来确定目标替换页面时,选择在一定的时间内还没有被使用的页面,及一般不常使用的页面。例如,在一个时间窗口,每帧都被使用的一个页面将有一个100%的生命周期百分比成本,它将几乎是不可能被取代的,而一个有25%的生命周期百分比成本的页面被取代的机会会较高。
抖动成本:
相对成本是一个更重要的指标,并允许该值是一个没有上限的整数变量。例如,如果通过从磁盘连续传送纹理至缓存,相对成本值可能是纹理尺寸除以从资源连续传送一小部分纹理所花费的时间。把生命周期百分比成本当作一个在(0,1)之间的单位化的浮点变量。
用户可以组合这两个值成一个单一的结果,其中,生命周期百分比成本作为相对成本的一个标量,从而使内存抖动成本=相对成本x生命周期百分比成本。这是一个非常好的、用来识别适当的替换页面的启发式。以下是几个生命周期百分比成本/相对成本比率的例子及替换模式的说明。对以下的数据,假定相对成本的最高值可能是10。
表1
正如在此表1所见的,使用简单的相对成本x生命周期百分比成本值可能会导致页面有不同的生命周期百分比成本/相对成本值,但具有相同的内存抖动成本。这将意味着,生命周期百分比成本/相对成本关系为0.5/100的纹理A,可以和生命周期百分比成本/相对成本为1.0/50的纹理B有相同的成本。这两个页面的任何一个都是一个有效的目标,都包含相同的潜在替代数值权重。纹理A有较髙的成本,如果下一帧需要它,替换它将更加昂贵。纹理B的成本较低,但有一个100%的生命周期百分比成本值,因此立即需要此页面的可能性将很大。
当多个页面返回相同的值时,替换一个有较低生命周期百分比成本值的效果要好得多。这就是要使用生命周期指标的原因。通过分析使用模式和成本,可以看到,虽然页面更加昂贵,但是它较少地被使用,它错误地被缓存抖动的概率就较低。在这些情况下,重新扫描缓存来找到一个有较高内存抖动成本及较低生命周期百分比成本值的页面是一个好方法。
本发明的技术方案进一步对声明周期算法及替换成本进行了扩展,具体如下:
扩展的生命周期算法:
考虑同时加载到缓存的两个页面(纹理A和纹理B),纹理A被使用在场景中50%的物体上,而纹理B只使用在10%的物体上。两个页面有相同的生命周期百分比成本值,但可以确定这两个页面有着非常不同的使用数量。当必须找出一个替换页面时,应该考虑到,在当前帧纹理A被使用了较多次的事实,增加了它将在随后帧也被使用的可能性,因此,较少使用的纹理(纹理B)应该被替代。通过存储这一额外的每帧数据,提供了其他的统计分析操作,来帮助确定从缓存清除的最佳页面。
其详细包括:
(1)用时间窗口内的非零帧的数量除以总帧数,生命周期百分比成本变量仍然可以从扩展的生命周期算法得到。
(2)在给定的帧窗口寻找最少使用的页面,将找出一般而言最少使用的页面,这将有助于确定替换页面。
(3)利用最大分析,可以确定在窗口内访问最多的页面,来帮助它们避免从缓存中清除。
(4)在窗口内,找到平均的使用和得到类似于生命周期百分比成本的第二个简单化了的变量一样简单。
扩展替换的成本
大多数替换页面识别算法只使用一个单一的启发式。也就是说,它们的算法是专门针对导致最少的缓存页面未命中的访问模式而量身定做的。例如,最近最少使用算法只保留最旧页面的信息。然而,自定义软件缓存常常有涉及缓存未命中的第二个启发式——用新数据填充缓存页面的成本。对于大多数硬件缓存,都有一个恒定的成本。这个成本与存储器处理程序访问主存及读取所需数据相关。
然而,对于游戏软件需要,这个成本通常可以在页面本身之间波动。因此,替换页面识别考虑到,实际上用一个给定内存块来填充一个页面的性能打击量是很明智的。这个性能消耗(或只是消耗)可以有多种来源,它可以用一个外部数据集来手动定义(例如,一个定义哪些纹理被真正使用的XML文件),或者它可以用填充页面的实际成本来定义。
因为较大的纹理有更多的信息要从资源中传送,而较小的或简单的纹理只是那些消耗的一小部分,所以较大的纹理有较长的、涉及把它们放到缓存的性能时间。在这种情况下,在替换页面识别过程中,考虑涉及有可能取代内存中一个页面的成本将是非常明智的。如果替换的页面具有较高的相关成本,且接下来的几帧需要该页面,那么将导致不必要的开销。相反,如果替换了一个有较低成本的页面,错误地把它从缓存中删除的性能打击则低得多。概括地说,把成本作为页面替换的一个变量让可以回答问题“清除5个较小的纹理给1个大纹理腾出空间会更便宜吗?”
成本可让用户关注将一个给定页面重新装入缓存会如何损害性能。如果需要,这个***的一个扩展允许替换页面识别功能更加关心缓存未命中的性能成本,而不是帧之间的连贯性。
当抖动发生时,在缓存中找到并清除最便宜的纹理。因为总有一个便宜的页面存在,如果负荷足够大,整个缓存可能抖动。它可以把非常昂贵的页面无限期地留在缓存。如果像天空盒纹理这样的东西被装载到缓存,那么这是一个很好的特性,因为天空盒在每一帧都将是活跃的,而且由于它的大尺寸,我们不太可能想把它从缓存中删除。
通过用替换指标来偏向访问模式算法的替换识别,允许缓存找到一个在页面替换需求和抖动之间的折中。此外,访问模式的识别帮助消除纯粹的成本指标所涉及的问题,当高成本的资源到达已经不再需要的状态时,让它们最终从缓存中清除。
以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,都应属于本发明的保护范围。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。