Unity3d骨骼动画插件SmoothMoves的加载优化方法

文档序号:6640709阅读:1505来源:国知局
Unity3d骨骼动画插件SmoothMoves的加载优化方法
【专利摘要】本发明所提供的Unity3d骨骼动画插件SmoothMoves的加载优化方法,改变了传统的Unity3d中骨骼动画插件的加载方法,其通过将原本存储于触发帧中的各个触发帧骨骼数据存储在一建立的触发帧骨骼集合中,而触发帧中只存储其原来所存储的触发帧骨骼的索引表,通过索引的方式减少触发帧在骨骼动画反序列化过程中触发GC Alloc的次数。此外,通过去除骨骼颜色信息为空的数据,实现了大幅缩减骨骼列表的占用空间,也提高了骨骼列表的调用效率。本发明方法有效地减少了骨骼动画触发帧数组内各元素的数据存储量,减少了大量的垃圾内存分配,加快了骨骼动画反序列化的进程,进而有效地提高了骨骼动画的加载速度。
【专利说明】Un i ty3d骨路动画插件SmoothMoves的加载优化方法

【技术领域】
[0001]本发明涉及一种动画插件加载方法,特别涉及一种Unity3d骨骼动画插件SmoothMoves的加载优化方法。

【背景技术】
[0002]Unity3d是由来自美国的Unity Technologies公司开发的在全球占主导地位的一款游戏开发软件。Unity是一种开创性的开发平台,用于创建游戏和交互式3D和2D体验,能够用于三维视频游戏、建筑可视化、实时三维动画等类型互动内容的设计。Unity编辑器运行在 Windows 和 Mac OS X 下,并可发布游戏至 Windows、Mac、Wi1、iPhone、Windowsphone 8和Android众多平台,也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。正因如此,在智能设备迅猛发展的今天,Unity成功占据了移动游戏开发引擎的半壁江山。在世界范围内,Unity占据全功能游戏引擎市场45%的份额,大约三倍于其直接竞争对手。
[0003]Unity的最初定位为3d游戏引擎,为3d制作整个流水线提供了全面的支持,同时Unity也支持第三方工具插件,并可以在其官方的Asset Store (资源商店)中发布和购买,这也是其迅速发展的重要原因。Unity在游戏制作流程及跨平台方面的良好表现,使得众多的2d游戏开发也选择Unity,同时辅助使用一些第三方的2d插件,在这些工具插件中,SmoothMoves作为一款2d骨骼动画插件得到了较多关注。
[0004]SmoothMoves依托于Unity,提供了类似于flash操作方式的2d骨骼动画解决方案,大大减少2d游戏的资源占用。但是SmoothMoves动画文件加载时速度较慢,在加载一个含有50个bone,10个clip的动画文件时,大概需要I秒,如此在加载一个有20个类似动画文件的场景时便需要20秒左右,即便是将同一个动画文件实例化20份也要耗费同样的时长,如此长时间的加载将大大降低游戏者的使用体验。在通过Unity编辑器中的Profiler (性能分析工具)分析加载过程后,可以发现在动画文件加载过程中产生的大量的GC Alloc (会导致垃圾回收的内存分配),每个类似前述的动画产生大约IMB的GCAlloc0正是如此大量的GC Alloc使得加载速度非常之慢。
[0005]现有的SmoothMoves动画运行时需要依靠脚本BoneAnimat1n (骨骼动画)来控制,其包含的所有的动画信息,如关键帧、骨骼贴图等等。在加载动画时,需要对BoneAnimat1n进行反序列化,即将内存中的字节序列恢复为动画,此时将触发GC Alloc。而BoneAnimat1n的触发帧中存在大量属性相同的触发帧骨骼,而骨骼列表中也存在大量骨骼颜色信息为空的数据。因此,对该些触发帧骨骼进行反序列化时,将反复触发GC Alloc从而会导致大量的垃圾内存分配,拖慢了动画加载速度。


【发明内容】

[0006]本发明的目的在于提供一种Unity3d骨骼动画插件SmoothMoves的加载优化方法,以解决现有的Unity3d中SmoothMoves动画加载速度较慢的问题。
[0007]本发明的第二目的在于提供一种Unity3d骨骼动画插件SmoothMoves的加载优化方法,以解决现有的Unity3d中动画加载和复制时产生的垃圾内存分配较多的问题。
[0008]为实现上述目的,本发明提供了一种Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,包括对骨骼动画的触发帧进行优化,所述对骨骼动画的触发帧进行优化具体包括以下步骤:
511:建立触发帧骨骼集合,所述触发帧骨骼集合包含属性不同的若干触发帧骨骼;
512:建立骨骼动画触发帧数组,所述骨骼动画触发帧数组包括若干触发帧,每个触发帧包括若干触发帧骨骼;
513:对每个触发帧均建立一对应的索引表,该索引表中存储其对应的触发帧中的所有触发帧骨骼在所述触发帧骨骼集合的索引;
所述步骤S13还包括,在对每个触发帧建立对应的索引表后,清除该触发帧的全部触发帧骨骼。
[0009]较佳地,该方法在对骨骼动画的触发帧进行优化的同时还包括:
优化轻量化动画剪辑数组的存储的步骤,其中,该动画剪辑数组的每个轻量化动画剪辑均包括一骨骼列表,所述骨骼列表对应一骨骼数据索引,所述骨骼列表包括若干数据,每个数据对应一骨骼颜色信息;该步骤具体包括:
521:去除骨骼颜色信息为空的数据;
522:更新骨骼列表并建立更新后的骨骼数据索引。
[0010]较佳地,所述步骤S14后还包括:采用反序列化加载过程对Unity3d骨骼动画插件SmoothMoves进行加载。
[0011]较佳地,所述反序列化加载过程具体为:通过触发帧中的索引表进行骨骼动画的加载。
[0012]较佳地,在采用反序列化加载过程对Unity3d骨骼动画插件SmoothMoves进行加载的同时调用更新后的骨骼数据索引。
[0013]较佳地,所述步骤13具体包括:
5131:选取骨骼动画触发帧数组中的一个触发帧;
5132:为该触发帧中的各触发帧骨骼建立索引表;
5133:判断是否骨骼动画触发帧数组中尚存在未建立索引表的触发帧,如果存在,则选取下一个未建立索引表的触发帧,继续执行S132;
5134:如果不存在,则步骤S13完成。
[0014]较佳地,所述步骤S132具体包括:
51321:选取该触发帧中的一个触发帧骨骼;
51322:判断所述触发帧骨骼集合中是否已包括与该触发帧骨骼属性相同的触发帧骨骼,如果已包括,则建立该触发帧骨骼的索引,并将该索引添加至所述索引表中;
51323:如果不包括,则将该触发帧骨骼添加至所述触发帧骨骼集合中,并建立该触发帧骨骼对应的索引,将该索引添加至所述索引表中;
51324:返回继续执行步骤S1321~S1323,直至该触发帧中的全部触发帧骨骼均建立了索引。
[0015]较佳地,所述步骤S21具体包括:在所述轻量化动画剪辑的构造函数(说明书中具体介绍)中添加骨骼颜色信息是否为空的判断,如所述骨骼颜色信息为空,则将所述轻量化动画剪辑的骨骼列表中的该骨骼颜色信息删除;如所述骨骼颜色信息不为空,则保留该骨骼颜色信息。
[0016]较佳地,所述步骤S22具体包括:将所有骨骼颜色信息为空的骨骼颜色信息删除后剩下的骨骼颜色信息组成更新后的骨骼列表。
[0017]较佳地,将所述更新后的骨骼列表转换为以骨骼数据索引为键值的映射表。
[0018]本发明所提供的Unity3d骨骼动画插件SmoothMoves的加载优化方法,改变了传统的Unity3d中骨骼动画插件的加载方法,其通过将原本存储于触发帧中的各个触发帧骨骼数据存储在一建立的触发帧骨骼集合中,而触发帧中只存储其原来所存储的触发帧骨骼的索引表,通过索引的方式减少触发帧在骨骼动画反序列化过程中触发GC Alloc的次数。而通过去除骨骼颜色信息为空的数据,实现了大幅缩减骨骼列表的占用空间,也提高了骨骼列表的调用效率。
[0019]此外,由于在原有的不同触发帧中存在大量属性相同的触发帧骨骼(骨骼动画BoneAnimat1n大量的动画信息以触发巾贞triggerFrames和动画剪辑mAnimat1nClips所占比例最大,占BoneAnimat1n总数据量的90%以上,且对于越复杂的动画,占比越高),通过建立集合再索引的方式不仅有效地减少了骨骼动画触发帧数组内各元素的数据存储量,且骨骼动画加载时索引的方式将使所产生的GC Alloc大大减少,从而减少了大量的垃圾内存分配,提高了骨骼动画反序列化的进程,进而有效地提高了骨骼动画的加载速度。

【专利附图】

【附图说明】
[0020]图1为本发明提供的优化轻量化动画剪辑数组的存储的主要步骤图;
图2为图1所示步骤中更新骨骼列表的示意图;
图3为本发明提供的对骨骼动画的触发帧进行优化的主要步骤图;
图4为本发明提供的对骨骼动画的触发帧进行优化的整体流程图;
图5为本发明提供的优化后的加载过程与优化前的加载过程对比示意图。

【具体实施方式】
[0021]为更好地说明本发明,兹以一优选实施例,并配合附图对本发明作详细说明,具体如下:
本发明提供的方法包括优化轻量化动画剪辑数组的存储以及对骨骼动画的触发帧进行优化。
[0022]其中,骨豁动画的动画剪辑(BoneAnimat1n.mAnimat1nClips)是以 clip name为键值的轻量化动画剪辑(Animat1nClipSM_Lite)数组,每个Animat1nClipSM_Lite中存储了所属剪辑(clip)的所有骨骼颜色信息,即骨骼(bones)列表。
[0023]在进行优化轻量化动画剪辑数组的存储时,该部分实施步骤具体如图1所示,包括:
S21:去除骨骼颜色信息为空的数据;
由于轻量化动画剪辑数组的骨骼列表(Animat1nClipSM_Lite.bones)中存在大量的没有实际意义的元素,即骨骼颜色信息(其存储在轻量化动画骨骼数组中,该轻量化动画骨骼数组表示为Animat1nClipBone_Lite)为空,也即下述a~e项数据的数值全部为O时骨骼颜色为空(而这5项数据任意项值越大则颜色信息越多),a~e项数据表示如下:
a.co I or A CurveSeriali zed.keyframes.Count (表不透明度曲线上的关键巾贞数量)
b.colorRCurveSerialized.keyframes.Count (表不红色曲线上的关键巾贞数量)
c.colorGCurveSerialized.keyframes.Count (表不绿色曲线上的关键巾贞数量)
d.colorBCurveSerialized.keyframes.Count (表不蓝色曲线上的关键巾贞数量)
e.colorBlendCurveSerialized.keyframes.Count (表不融合曲线上的关键巾贞数量) 如此,在轻量化动画剪辑的构造函数(原构造函数包含上述a~e项的各骨骼颜色信息)
中添加骨骼颜色信息是否为空的判断,具体为如当某个骨骼颜色信息对应的上述a~e项数据为O (即骨骼颜色信息为空)时,则将轻量化动画剪辑的骨骼列表中的该骨骼颜色信息删除;如该骨骼颜色信息对应的上述a~e项数据中有一项不为0(即骨骼颜色信息不为空),则保留该骨骼颜色信息。
[0024]S22:更新骨骼列表并建立更新后的骨骼数据索引。
[0025]如图2所示,优化前的骨骼(bones)列表(该列表存储上述的轻量化动画骨骼数组 Animat1nClipBone_Lite)中的 Animat1nClipBone_Lite_l、Animat1nClipBone_Lite_2及Animati0nClipB0ne_Lite_3为空数据,该三个空数据删除后,剩下的骨骼颜色信息(Animat1nClipBone_Lite_0 及 Animat1nClipBone_Lite_4)组成更新后的骨豁列表(即优化后bones列表)。
[0026]由于在原有的加载过程中,加载的骨骼列表(优化前bones列表)是以骨骼数据索引(boneDatalndex)为键值的映射表,因此,在骨骼列表更新后,需要将更新后的骨骼列表(即优化后bones列表)转换为以骨骼数据索引(boneDatalndex)为键值的映射表。
[0027]进行了优化轻量化动画剪辑数组的存储的处理后,多余的无实际意义的信息被删除,以此,骨骼动画插件加载时可以大大减少骨骼动画的数据量,进而达到减少GC Alloc的目的。
[0028]如图3所示,对骨骼动画的触发帧进行优化具体包括以下步骤:
511:建立触发巾贞骨骼集合(trggerFrameBoneSet),该触发巾贞骨骼集合中包含属性不同的若干触发巾贞骨骼(TrggerFrameBone )
512:(本步骤图3中未示出,为已有的技术手段)建立骨骼动画触发帧数组(BoneAnimat1n.trggerFrames),骨骼动画触发巾贞数组中包含若干个触发中贞(TriggerFrame),触发巾贞是以动画剪辑的索引(cliplndex)和巾贞(frame)为键值,且每个触发帧中存储了相应的动画剪辑的相应帧上的所有骨骼关键帧信息,即触发帧骨骼列表(TriggerFrame.trggerFrameBones),该列表包括若干触发巾贞骨豁(TriggerFrameBone)。
[0029]S13:对每个触发帧均建立一对应的索引表,该索引表中存储其对应的触发帧中的所有触发帧骨骼在触发帧骨骼集合的索引,具体如下:
5131:选取骨骼动画触发巾贞数组(BoneAnimat1n.trggerFrames)中的一个触发中贞(即元素tf);
5132:为tf建立触发巾贞骨骼索引表(triggerFrameBonelndexes);
S1321:选取该触发帧中的一个触发帧骨骼,即在tf的触发帧骨骼列表(tf.triggerFrameBones)选取一个兀素 tfb。
[0030]S1322:判断trggerFrameBoneSet中是否已包括与tfb属性相同的触发巾贞骨骼,如果已包括,则建立tfb在trggerFrameBoneSet中的索弓I,并将该索引添加至元素tf的索引表(tf.triggerFrameBonelndexes)中。
[0031]S1323:如果不包括,则将tfb添加至trggerFrameBoneSet中,并建立tfb在trggerFrameBoneSet中的索弓I,并将该索引添加至元素tf的索引表(tf.triggerFrameBonelndexes)中。
[0032]S1324:如果元素tf的触发巾贞骨骼列表(tf.triggerFrameBones)中的全部触发帧骨骼均建立了索弓I,则清空该触发帧的触发帧骨骼列表,否则返回继续执行步骤S1321~S1323,直至tf.triggerFrameBones列表中的所有元素均被处理完成。
[0033]S133:判断在BoneAnimat1n.trggerFrames的列表中是否仍然存在未建立索引表的触发巾贞元素,如果存在,则返回至步骤131中选取BoneAnimat1n.trggerFrames的列表中下一个未建立索引表的触发帧,继续执行S132;
S134:如果不存在,即已处理BoneAnimat1n.trggerFrames的列表中的所有元素,贝丨J步骤S13完成。
[0034]至此完成了对骨骼动画的触发帧进行优化
如图5所示,在执行完上述两部分操作后,最终得到的是Unity3d自身进行序列化之后的动画信息,其数据量大幅减小,可采用反序列化加载过程对Unity3d骨骼动画插件SmoothMoves进行加载。
[0035]基于上述步骤执行后,反序列化加载过程具体为:通过触发帧中的索引表进行骨骼动画的加载,此时全部的触发帧骨骼都存储在触发帧骨骼集合中,通过索引的方式,大幅降低加载时触发GC Alloc的次数。而对于未执行上述步骤的骨骼动画的反序列化加载,其需要对触发帧中大量重复的触发帧骨骼进行反复触发GC Alloc以完成加载,加载速度因而变得较慢。实际测试效果表明,本发明方法可使的触发GC Alloc的数量减少90%以上。
[0036]其中,在采用反序列化加载过程对Unity3d骨骼动画插件SmoothMoves进行加载的同时调用更新后的骨骼数据索弓I。
[0037]以上所述,仅为本发明的【具体实施方式】,但本发明的保护范围并不局限于此,任何本领域的技术人员在本发明揭露的技术范围内,对本发明所做的变形或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述的权利要求的保护范围为准。
【权利要求】
1.一种Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,包括对骨骼动画的触发帧进行优化,所述对骨骼动画的触发帧进行优化具体包括以下步骤: 511:建立触发帧骨骼集合,所述触发帧骨骼集合包含属性不同的若干触发帧骨骼; 512:建立骨骼动画触发帧数组,所述骨骼动画触发帧数组包括若干触发帧,每个触发帧包括若干触发帧骨骼; 513:对每个触发帧均建立一对应的索引表,该索引表中存储其对应的触发帧中的所有触发帧骨骼在所述触发帧骨骼集合的索引; 所述步骤S13还包括,在对每个触发帧建立对应的索引表后,清除该触发帧的全部触发帧骨骼。
2.根据权利要求1所述的Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,该方法在对骨骼动画的触发帧进行优化的同时还包括: 优化轻量化动画剪辑数组的存储的步骤,其中,该动画剪辑数组的每个轻量化动画剪辑均包括一骨骼列表,所述骨骼列表对应一骨骼数据索引,所述骨骼列表包括若干数据,每个数据对应一骨骼颜色信息;该步骤具体包括: 521:去除骨骼颜色信息为空的数据; 522:更新骨骼列表并建立更新后的骨骼数据索引。
3.根据权利要求1或2所述的Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,所述步骤S13后还包括: 采用反序列化加载过程对Unity3d骨骼动画插件SmoothMoves进行加载。
4.根据权利要求3所述的Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,所述反序列化加载过程具体为:通过触发帧中的索引表进行骨骼动画的加载。
5.根据权利要求3所述的Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,在采用反序列化加载过程对Unity3d骨骼动画插件SmoothMoves进行加载的同时调用更新后的骨骼数据索引。
6.根据权利要求1所述的Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,所述步骤13具体包括: 5131:选取骨骼动画触发帧数组中的一个触发帧; 5132:为该触发帧中的各触发帧骨骼建立索引表; 5133:判断是否骨骼动画触发帧数组中尚存在未建立索引表的触发帧,如果存在,则选取下一个未建立索引表的触发帧,继续执行S132; 5134:如果不存在,则步骤S13完成。
7.根据权利要求6所述的Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,所述步骤S132具体包括: 51321:选取该触发帧中的一个触发帧骨骼; 51322:判断所述触发帧骨骼集合中是否已包括与该触发帧骨骼属性相同的触发帧骨骼,如果已包括,则建立该触发帧骨骼的索引,并将该索引添加至所述索引表中; 51323:如果不包括,则将该触发帧骨骼添加至所述触发帧骨骼集合中,并建立该触发帧骨骼对应的索引,将该索引添加至所述索引表中; 51324:返回继续执行步骤S1321~S1323,直至该触发帧中的全部触发帧骨骼均建立了索引。
8.根据权利要求2所述的Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,所述步骤S21具体包括:在所述轻量化动画剪辑的构造函数中添加骨骼颜色信息是否为空的判断,如所述骨骼颜色信息为空,则将所述轻量化动画剪辑的骨骼列表中的该骨骼颜色信息删除;如所述骨骼颜色信息不为空,则保留该骨骼颜色信息。
9.根据权利要求2所述的Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,所述步骤S22具体包括:将所有骨骼颜色信息为空的骨骼颜色信息删除后剩下的骨骼颜色信息组成更新后的骨骼列表。
10.根据权利要求9所述的Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,将所述更新后的骨骼列表转换为以骨骼数据索引为键值的映射表。
【文档编号】G06F9/50GK104461662SQ201410844048
【公开日】2015年3月25日 申请日期:2014年12月25日 优先权日:2014年12月25日
【发明者】曹青 申请人:上海恺英网络科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1