发明内容
为了解决由于磁盘的I/O速度与内存速度的不匹配,以及对大量高清晰度高分辨率素材进行编码、解码或特效应用过程中产生的大量计算所需的时间开销这一技术问题,本发明采用一种智能缓存机制没有限制,根据磁盘剩余空间的大小确定,在编辑过程中,当对某一个序列或者某个编辑节点使用缓存后,在进行一次播放后,记录当前序列或节点的效果到指定的缓存文件中。
首先,定义缓存的有如下三种状态:
1、CacheToNone表示:没有缓存;
2、CacheToMemory表示:将缓存信息保存在内存中;
3、CacheToDisk表示:将缓存信息保存在磁盘文件中。
保存在内存中的CacheToMemory文件读取速度是最快的,但是需要消耗一定的内存空间,同时受内存地址空间的限制,保存在内存中的缓存有一定的颗粒度,采用队列的方式进行存储,这样可能导致之前记录的缓存信息被后面保存的缓存给覆盖,于是定义一种保存在磁盘中的CacheToDisk类型,将缓存文件保存在磁盘上,但速度较之CacheToMemory慢一些,CacheToNone则表示没有缓存,并且定义其优先次序逐次提高,我们按缓存文件保存的位置来划分缓存的优先级,即CacheToNone的优先级最低,CacheToDisk(是否应该是CacheToMemory)的优先级最高,当同一个流程图节点的管脚或者同一时间段出现不同的缓存状态时,取优先级高的状态进行设置。
当需要引用这段已经编辑好的素材时,可以直接从相应的缓存文件中读取信息,从而减少重新计算需要的时间开销,以达到播放实时性的要求。
从而有效的减少对I/O的依赖,以及后台大量运算所消耗的时间开支,进而提高节目编辑过程中的实时性。
将在下面的描述中解释并且将由附图说明本发明的实施例的实施方式。
具体实施方式
本发明有关流程图和时间线上的智能缓存的方法,可以用于非线性编剪辑软件及视音频后期特效处理与合成软件中,具体的实施方式如下:
考虑到两种工作方式,以下将分别介绍时间线和流程图上的智能缓存机制。
一、时间线上的智能缓存机制
由于时间线上没有类似流程图上“节点”的概念,因此时间线上的智能缓存是按照区间划分的。其记录缓存的规则为:若时间线上的记录的缓存标志为“不记录缓存状态”,则将时间线上的缓存类型设置为CacheToNone,否则,将时间线上的缓存类型设置为CacheToDisk。
在时间线上渲染一帧或进行播放操作时,若当前帧已经添加至缓存文件中,则直接从缓存文件中读取相关信息,否则,将处理后的当前帧的信息根据缓存类型写入到缓存文件中,当修改时间线上某个参数值或者对时间线某段区域进行操作时,则使该操作区域的缓存无效。
时间线上的缓存设置各部分工作规则如图2所示。
具体缓存效果如图1所示。
流程图上的智能缓存机制
流程图表示的为一系列节点之间的拓扑关系,因此当修改某一个节点的状态、参数,或者改变查看的节点以及查看节点的输出都会引发流程图上节点的缓存状态,流程图上的缓存是以节点及节点的某个输出管脚为单位的,其设置规则为:
(1)改变当前查看节点的输出管脚
当从一个节点的某一个输出管脚(管脚A)移到查看该节点的另外一个输出管脚(管脚B)时,此时该节点管脚A的缓存状态和管脚B的缓存状态都将发生改变。对于管脚A:
若这个节点为记录缓存状态,则对管脚A的缓存的状态分别以如下情况判断:若管脚A没有被连接,该节点的管脚A的缓存状态为CacheToNone,否则,逐一考虑其连接的节点,若这些节点中有被查看的节点,将该节点的管脚A的缓存状态设置为CacheToDisk,否则,设置为CacheToNone;
若这个节点没有被记录为缓存状态,设置该节点的管脚A的缓存状态为CacheToNone。
对于管脚B:
若管脚B没有被连接,若这个节点为记录缓存状态,设置管脚B的缓存状态为CacheToDisk,否则设置管脚B的缓存状态为CacheToNone;
若管脚B连接有其他节点,且其连接的节点中有被查看的,若这个节点为记录缓存状态,设置管脚B的缓存状态为CacheToDisk,否则设置管脚B的缓存状态为CacheToMemory;否则,同a。
(2)节点间的切换
当在流程图上,从一个节点切换到另外的一个节点,查看的节点发生变化,这时需要改变这两个节点的缓存类型,以及与这两节点相关的节点的缓存类型。假设从查看的节点A的输出管脚A切换到查看的节点B的输出管脚B,对于节点A:
若节点A输出管脚A仍然被查看且为写缓存状态,则设其缓存状态为CacheToDisk,否则,则逐一判断与管脚A相连节点,若有被查看的节点,则设与A节点相连的管脚Index的缓存状态为CacheToMemory,否则设为CacheToNone;
若节点A输出管脚A没有被查看,则判断与A节点相连的所有节点,若其被查看且为写缓存状态,则修改这个节点的缓存状态为CacheToDisk,否则判断该节点的所有下游节点,若下游节点中存在被查看的节点,设置这个节点的缓存状态为CacheToMemory,否则设置这个节点的缓存状态为CacheToNone,继续判断与A相连的下一个节点直到全部结束。
对于节点B:
如果B节点的管脚B被查看,首先判断其与B节点相连的所有上游节点,若上游节点被查看,且该节点为写缓存状态,则置与B节点相连的管脚Index的缓存状态为CacheToDisk,否则置与B节点相连的管脚Index的缓存状态为CacheToMemory。逐一判断所有连接B的节点。然后若B节点为写缓存状态,则B节点的管脚B置其缓存状态为CacheToDisk,否则,判断与管脚B相连的下游节点,若下游节点中存在被看的节点,则置节点B的管脚B的缓存的状态为CacheToMemory,否则,置节点B的管脚B的缓存的状态为CacheToNone;
否则,若B节点的管脚B没有没查看,首先判断其与B节点相连的所有上游节点,若上游节点被查看,且该节点为写缓存状态,则置与B节点相连的管脚Index的缓存状态为CacheToDisk,否则置与B节点相连的管脚Index的缓存状态为CacheToNone,逐一判断所有连接B的节点。然后判断与管脚B相连的下游节点,若下游节点中存在被看的节点,且B节点为写缓存状态,则B节点的管脚B置其缓存状态为CacheToDisk,否则,则置节点B的管脚B的缓存的状态为CacheToMemory,否则,置节点B的管脚B的缓存的状态为CacheToNone。
时间线上的缓存设置各部分工作规则如图3所示。