骨骼动画系统优化方法、装置及骨骼动画系统与流程

文档序号:13513945阅读:1020来源:国知局
骨骼动画系统优化方法、装置及骨骼动画系统与流程
本发明涉及骨骼动画系统,尤其涉及一种骨骼动画系统优化方法、装置。
背景技术
:目前骨骼动画广泛应用于游戏引擎中。骨骼动画从技术角度可以分为两部分:骨骼和蒙皮,蒙皮即为顶点网格,它依附在骨骼上,跟随骨骼位置变化做出扭曲运动。骨骼位置的计算依赖于已有的动画数据资源,然后依据时间做出位置插值。骨骼动画中的骨骼分为两种类型,一种是基本骨骼,一种是辅助骨骼。基本骨骼就是构成骨架的必要骨骼,比如构成角色骨架的头骨、大腿骨、小腿骨、盆骨等,用于对依附的蒙皮提供位置信息。辅助骨骼并非角色骨架的必要骨骼,多用于链接绑定特效、模型等。随着游戏行业的发展,角色越来越复杂,角色本身拥有的骨骼数量以及辅助骨骼数量也越来越多。骨骼动画系统的运行消耗和角色数量、单根骨骼的计算量以及整个骨架的骨骼数量成正比。骨骼数量的增多,势必增加骨骼动画系统的消耗,进而影响整个游戏引擎的运行效率。综上可知,有必要对骨骼动画系统进行优化,以尽可能在保证骨骼动画系统运行正确的前提下减少要计算的骨骼数量,进而提高骨骼动画系统的运行效率。技术实现要素:本发明所要解决的技术问题在于克服现有技术不足,提供一种骨骼动画系统优化方法,可在保证骨骼动画系统运行正确的前提下减少要计算的骨骼数量,进而提高骨骼动画系统的运行效率。本发明具体采用以下技术方案解决上述技术问题:一种骨骼动画系统优化方法,为系统中的每一根骨骼设置两个初始值均为0的参数:第一引用计数参数和第二引用计数参数;对于系统中的每一根骨骼,其第一引用计数参数和第二引用计数参数按照以下方法更新:当该骨骼每被一个新的蒙皮引用或者被绑定一个新的模型或特效时,则将该骨骼的第一引用计数参数加1,并检查该骨骼当前的第一引用计数参数和第二引用计数参数是否都为0,如是,则向上逐级递归查找到第一个第一引用计数参数和第二引用计数参数不都为0的父骨骼,并将所找到的每根父骨骼的第二引用计数参数加1;在进行骨骼动画计算时,将第一引用计数参数和第二引用计数参数都为0的骨骼排除,仅对第一引用计数参数和第二引用计数参数不都为0的骨骼进行动画计算。根据相同的发明思路还可以得到以下技术方案:一种骨骼动画系统优化装置,包括:引用计数模块,用于为系统中的每一根骨骼设置两个初始值均为0的参数:第一引用计数参数和第二引用计数参数;并按照以下方法对系统中每一根骨骼的第一引用计数参数和第二引用计数参数进行更新:当该骨骼每被一个新的蒙皮引用或者被绑定一个新的模型或特效时,则将该骨骼的第一引用计数参数加1,并检查该骨骼当前的第一引用计数参数和第二引用计数参数是否都为0,如是,则向上逐级递归查找到第一个第一引用计数参数和第二引用计数参数不都为0的父骨骼,并将所找到的每根父骨骼的第二引用计数参数加1;优化模块,用于在进行骨骼动画计算时,将第一引用计数参数和第二引用计数参数都为0的骨骼排除,仅将第一引用计数参数和第二引用计数参数不都为0的骨骼提供给系统进行动画计算。一种骨骼动画系统,包括上述优化装置。相比现有技术,本发明具有以下有益效果:本发明通过设置骨骼的引用计数参数,在骨骼动画计算时,将未被蒙皮所使用且未绑定特效和模型的骨骼剔除在外,不对其进行动画计算,从而在保证骨骼动画系统运行正确的前提下大幅减少要计算的骨骼数量,可比现有技术减少50%以上骨骼计算数量,进而有效提高了骨骼动画系统的运行效率。本发明仅通过设置两个引用计数参数即可实现,算法简单,不会占用额外的软硬件资源。附图说明图1为具体实施方式中骨骼引用计数参数的更新流程示意图;图2为具体实施方式中骨骼动画计算的判断流程示意图。具体实施方式骨骼动画系统中,基础骨骼用于对附加在其上的蒙皮提供位置信息,辅助骨骼用于对绑定其上的特效和模型提供位置信息。美术制作的骨骼包括所有该角色可能使用的蒙皮以及绑定信息所对应的骨骼,但一个角色在同一时间往往不可能同时用到该骨架可以使用的所有蒙皮以及绑定的特效和模型。比如,游戏中的无头骑士,头部是没有的,那么头部骨骼的位置计算在这个时候就毫无意义,属于计算资源的浪费。再比如,角色目前没有绑定特效a,但是用于绑定特效a的辅助骨骼还在计算。本发明将针对这两种情况,通过剔除多余的骨骼计算来对骨骼动画系统进行优化。另外在骨骼动画计算过程中,每根骨骼bone的已有动画数据位置是相对于其父骨骼的位置,因此如果要计算当前骨骼bone,那么在这之前一定要计算其父骨骼fbone。这是我们在做骨骼动画引用计数时不得不考虑的一点:bm=bam*fbm(bm为bone骨骼动画计算结果,bam为bone动画插值结果,fbm为父骨骼fbone的最终骨骼动画计算结果)。根据以上思路可得到本发明技术方案如下:一种骨骼动画系统优化方法,为系统中的每一根骨骼设置两个初始值均为0的参数:第一引用计数参数和第二引用计数参数;对于系统中的每一根骨骼,其第一引用计数参数和第二引用计数参数按照以下方法更新:当该骨骼每被一个新的蒙皮引用或者被绑定一个新的模型或特效时,则将该骨骼的第一引用计数参数加1,并检查该骨骼当前的第一引用计数参数和第二引用计数参数是否都为0,如是,则向上逐级递归查找到第一个第一引用计数参数和第二引用计数参数不都为0的父骨骼,并将所找到的每根父骨骼的第二引用计数参数加1;在进行骨骼动画计算时,将第一引用计数参数和第二引用计数参数都为0的骨骼排除,仅对第一引用计数参数和第二引用计数参数不都为0的骨骼进行动画计算。一种骨骼动画系统优化装置,包括:引用计数模块,用于为系统中的每一根骨骼设置两个初始值均为0的参数:第一引用计数参数和第二引用计数参数;并按照以下方法对系统中每一根骨骼的第一引用计数参数和第二引用计数参数进行更新:当该骨骼每被一个新的蒙皮引用或者被绑定一个新的模型或特效时,则将该骨骼的第一引用计数参数加1,并检查该骨骼当前的第一引用计数参数和第二引用计数参数是否都为0,如是,则向上逐级递归查找到第一个第一引用计数参数和第二引用计数参数不都为0的父骨骼,并将所找到的每根父骨骼的第二引用计数参数加1;优化模块,用于在进行骨骼动画计算时,将第一引用计数参数和第二引用计数参数都为0的骨骼排除,仅将第一引用计数参数和第二引用计数参数不都为0的骨骼提供给系统进行动画计算。一种骨骼动画系统,包括上述优化装置。为便于公众理解,下面以一个具体实例并结合附图来对本发明技术方案进行进一步详细说明。本发明的基础是对每根骨骼建立骨骼引用计数,本实施例中对每根骨骼增加如下数据结构:该结构体中,common_ref表示当前骨骼与多少个蒙皮、模型、特效有绑定关系。child_ref表示当前骨骼有多少根子骨骼在使用中。在骨骼初始化时,将所有骨骼的骨骼引用计数参数设置为0。bonerefs.common_ref=0bonerefs.child_ref=0骨骼引用计数参数的更新流程如图1所示。对引用计数会产生影响的操作有绑定蒙皮、特效、模型。蒙皮是在角色初始化的时候绑定到角色的整个骨架上,在蒙皮数据中有一个骨骼列表,保存了该蒙皮绑定所对应的多根骨骼。而绑定模型和特效的操作一般发生在游戏过程中,一般情况下模型和特效只绑定在一根骨骼上。蒙皮初始化或者检查到模型特效的绑定操作后,首先查找要绑定的骨骼bone(一根或者多根),检查bone的骨骼引用bonerefs:如果bone的bonerefs.common_ref和bonerefs.child_ref不都为0,说明bone已经被引用,无需检查bone的父骨骼fbone,直接将bonerefs.common_ref做加1操作;如果bonerefs.common_ref和bonerefs.child_ref都为0,表示当前骨骼从未被引用过,因为当前骨骼的计算依赖于其父骨骼fbone,所以当我们将bone的引用参数bonesrefs.common_ref加1后需要查找bone的父骨骼fbone。如果父骨骼fbone的common_ref和child_ref不都为0,表示父骨骼已经被引用过,只需要将fbone的child_ref加1即可。如果父骨骼fbone的common_ref和child_ref都为0,表示fbone也从未被引用过,因为它的计算也依赖于它的父骨骼ffbone,所以在fbone加1操作后需要递归检查fbone的父骨骼ffbone;依次类推,做递归检查,直到检查到父骨骼的引用参数common_ref和child_ref不都为0时,停止检查,并对这个父骨骼的child_ref做加1操作。之所以有检查父骨骼的操作,原因正如之前提到的,每根骨骼的计算需要用到其父骨骼fbone的骨骼动画运算结果。如果我们只将当前骨骼bone引用计数common_ref增加,而父骨骼的引用计数common_ref和child_ref都为0,父骨骼的位置没有计算,那么无法得到bone的骨骼动画运算结果。骨骼动画计算时的判断流程如图2所示,在决定是否对bone进行骨骼动画计算时,要同时考虑它的common_ref和child_ref,如果common_ref不为0,表示该骨骼被蒙皮或者特效或者模型引用,如果child_ref不为0,表示当前骨骼被子骨骼引用,需要对骨骼bone进行计算。只有bone的common_ref和child_ref都为0的时候,表示该骨骼既没被蒙皮或者特效引用也没有被子骨骼引用,不需要进行计算。为了验证本发明技术效果,使用本发明优化方法前后所需的骨骼计算数量进行测试比较(所选角色为常态下只绑定一件武器),测试结果如下表1所示:表1使用前骨骼计算数量使用后骨骼计算数量14069可以看出,就此角色而言,本发明方法将骨骼动画计算效率提升约51%。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1