《UNITY3D骨骼动画插件SMOOTHMOVES的加载优化方法.pdf》由会员分享,可在线阅读,更多相关《UNITY3D骨骼动画插件SMOOTHMOVES的加载优化方法.pdf(12页珍藏版)》请在专利查询网上搜索。
1、(10)申请公布号 (43)申请公布日 (21)申请号 201410844048.0(22)申请日 2014.12.25G06F 9/445(2006.01)G06F 9/50(2006.01)G06F 9/44(2006.01)G06F 17/30(2006.01)G06T 13/20(2011.01)(71)申请人 上海恺英网络科技有限公司地址 200030 上海市徐汇区天钥桥路 909 号1 号楼 148 室(72)发明人 曹青(74)专利代理机构 上海汉声知识产权代理有限公司 31236代理人 胡晶(54) 发明名称Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法(。
2、57) 摘要本发明所提供的Unity3d骨骼动画插件SmoothMoves 的加载优化方法,改变了传统的Unity3d 中骨骼动画插件的加载方法,其通过将原本存储于触发帧中的各个触发帧骨骼数据存储在一建立的触发帧骨骼集合中,而触发帧中只存储其原来所存储的触发帧骨骼的索引表,通过索引的方式减少触发帧在骨骼动画反序列化过程中触发 GC Alloc 的次数。此外,通过去除骨骼颜色信息为空的数据,实现了大幅缩减骨骼列表的占用空间,也提高了骨骼列表的调用效率。本发明方法有效地减少了骨骼动画触发帧数组内各元素的数据存储量,减少了大量的垃圾内存分配,加快了骨骼动画反序列化的进程,进而有效地提高了骨骼动画的加。
3、载速度。(51)Int.Cl.(19)中华人民共和国国家知识产权局(12)发明专利申请权利要求书2页 说明书5页 附图4页(10)申请公布号 CN 104461662 A(43)申请公布日 2015.03.25CN 104461662 A1/2 页21.一种Unity3d骨骼动画插件SmoothMoves的加载优化方法,其特征在于,包括对骨骼动画的触发帧进行优化,所述对骨骼动画的触发帧进行优化具体包括以下步骤 :S11 :建立触发帧骨骼集合,所述触发帧骨骼集合包含属性不同的若干触发帧骨骼 ;S12 :建立骨骼动画触发帧数组,所述骨骼动画触发帧数组包括若干触发帧,每个触发帧包括若干触发帧骨骼 ;。
4、S13 :对每个触发帧均建立一对应的索引表,该索引表中存储其对应的触发帧中的所有触发帧骨骼在所述触发帧骨骼集合的索引 ;所述步骤 S13 还包括,在对每个触发帧建立对应的索引表后,清除该触发帧的全部触发帧骨骼。2.根据权利要求 1 所述的 Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法,其特征在于,该方法在对骨骼动画的触发帧进行优化的同时还包括 :优化轻量化动画剪辑数组的存储的步骤,其中,该动画剪辑数组的每个轻量化动画剪辑均包括一骨骼列表,所述骨骼列表对应一骨骼数据索引,所述骨骼列表包括若干数据,每个数据对应一骨骼颜色信息 ;该步骤具体包括 :S21 :去除骨骼颜色信息为。
5、空的数据 ;S22 :更新骨骼列表并建立更新后的骨骼数据索引。3.根据权利要求 1 或 2 所述的 Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法,其特征在于,所述步骤 S13 后还包括 :采用反序列化加载过程对 Unity3d 骨骼动画插件 SmoothMoves 进行加载。4.根据权利要求 3 所述的 Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法,其特征在于,所述反序列化加载过程具体为 :通过触发帧中的索引表进行骨骼动画的加载。5.根据权利要求 3 所述的 Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法,其特征在于,在采用。
6、反序列化加载过程对 Unity3d 骨骼动画插件 SmoothMoves 进行加载的同时调用更新后的骨骼数据索引。6.根据权利要求 1 所述的 Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法,其特征在于,所述步骤 13 具体包括 :S131 :选取骨骼动画触发帧数组中的一个触发帧 ;S132 :为该触发帧中的各触发帧骨骼建立索引表 ;S133 :判断是否骨骼动画触发帧数组中尚存在未建立索引表的触发帧,如果存在,则选取下一个未建立索引表的触发帧,继续执行 S132;S134 :如果不存在,则步骤 S13 完成。7.根据权利要求 6 所述的 Unity3d 骨骼动画插件 Sm。
7、oothMoves 的加载优化方法,其特征在于,所述步骤 S132 具体包括 :S1321 :选取该触发帧中的一个触发帧骨骼 ;S1322 :判断所述触发帧骨骼集合中是否已包括与该触发帧骨骼属性相同的触发帧骨骼,如果已包括,则建立该触发帧骨骼的索引,并将该索引添加至所述索引表中 ;S1323 :如果不包括,则将该触发帧骨骼添加至所述触发帧骨骼集合中,并建立该触发帧骨骼对应的索引,将该索引添加至所述索引表中 ;S1324 :返回继续执行步骤 S1321S1323,直至该触发帧中的全部触发帧骨骼均建立了权 利 要 求 书CN 104461662 A2/2 页3索引。8.根据权利要求 2 所述的 U。
8、nity3d 骨骼动画插件 SmoothMoves 的加载优化方法,其特征在于,所述步骤 S21 具体包括 :在所述轻量化动画剪辑的构造函数中添加骨骼颜色信息是否为空的判断,如所述骨骼颜色信息为空,则将所述轻量化动画剪辑的骨骼列表中的该骨骼颜色信息删除 ;如所述骨骼颜色信息不为空,则保留该骨骼颜色信息。9.根据权利要求 2 所述的 Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法,其特征在于,所述步骤 S22 具体包括 :将所有骨骼颜色信息为空的骨骼颜色信息删除后剩下的骨骼颜色信息组成更新后的骨骼列表。10.根据权利要求9所述的Unity3d骨骼动画插件SmoothMove。
9、s的加载优化方法,其特征在于,将所述更新后的骨骼列表转换为以骨骼数据索引为键值的映射表。权 利 要 求 书CN 104461662 A1/5 页4Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法技术领域0001 本发明涉及一种动画插件加载方法,特别涉及一种Unity3d骨骼动画插件SmoothMoves 的加载优化方法。背景技术0002 Unity3d 是由来自美国的 Unity Technologies 公司开发的在全球占主导地位的一款游戏开发软件。Unity 是一种开创性的开发平台,用于创建游戏和交互式 3D 和 2D 体验,能够用于三维视频游戏、建筑可视化、实时三维动。
10、画等类型互动内容的设计。Unity 编辑器运行在 Windows 和 Mac OS X 下,并可发布游戏至 Windows、Mac、Wii、iPhone、Windows phone 8 和 Android 众多平台,也可以利用 Unity web player 插件发布网页游戏,支持 Mac 和 Windows 的网页浏览。正因如此,在智能设备迅猛发展的今天,Unity 成功占据了移动游戏开发引擎的半壁江山。 在世界范围内,Unity 占据全功能游戏引擎市场 45的份额,大约三倍于其直接竞争对手。0003 Unity 的最初定位为 3d 游戏引擎,为 3d 制作整个流水线提供了全面的支持,同时。
11、Unity也支持第三方工具插件,并可以在其官方的Asset Store(资源商店)中发布和购买,这也是其迅速发展的重要原因。Unity 在游戏制作流程及跨平台方面的良好表现,使得众多的 2d 游戏开发也选择 Unity,同时辅助使用一些第三方的 2d 插件,在这些工具插件中,SmoothMoves 作为一款 2d 骨骼动画插件得到了较多关注。0004 SmoothMoves 依托于 Unity,提供了类似于 flash 操作方式的 2d 骨骼动画解决方案,大大减少 2d 游戏的资源占用。但是 SmoothMoves 动画文件加载时速度较慢,在加载一个含有 50 个 bone,10 个 clip。
12、 的动画文件时,大概需要 1 秒,如此在加载一个有 20 个类似动画文件的场景时便需要 20 秒左右,即便是将同一个动画文件实例化 20 份也要耗费同样的时长,如此长时间的加载将大大降低游戏者的使用体验。在通过 Unity 编辑器中的 Profiler( 性能分析工具 ) 分析加载过程后,可以发现在动画文件加载过程中产生的大量的 GC Alloc( 会导致垃圾回收的内存分配 ),每个类似前述的动画产生大约 1MB 的 GC Alloc。正是如此大量的 GC Alloc 使得加载速度非常之慢。0005 现有的 SmoothMoves 动画运行时需要依靠脚本 BoneAnimation(骨骼动画)。
13、来控制,其包含的所有的动画信息,如关键帧、骨骼贴图等等。在加载动画时,需要对BoneAnimation 进行反序列化,即将内存中的字节序列恢复为动画,此时将触发 GC Alloc。而 BoneAnimation 的触发帧中存在大量属性相同的触发帧骨骼,而骨骼列表中也存在大量骨骼颜色信息为空的数据。因此,对该些触发帧骨骼进行反序列化时,将反复触发GC Alloc从而会导致大量的垃圾内存分配,拖慢了动画加载速度。发明内容0006 本发明的目的在于提供一种 Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法,以解决现有的 Unity3d 中 SmoothMoves 动画加载速度较慢。
14、的问题。说 明 书CN 104461662 A2/5 页50007 本发明的第二目的在于提供一种Unity3d骨骼动画插件SmoothMoves的加载优化方法,以解决现有的 Unity3d 中动画加载和复制时产生的垃圾内存分配较多的问题。0008 为实现上述目的,本发明提供了一种 Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法,其特征在于,包括对骨骼动画的触发帧进行优化,所述对骨骼动画的触发帧进行优化具体包括以下步骤 :S11 :建立触发帧骨骼集合,所述触发帧骨骼集合包含属性不同的若干触发帧骨骼 ;S12 :建立骨骼动画触发帧数组,所述骨骼动画触发帧数组包括若干触发帧,每。
15、个触发帧包括若干触发帧骨骼 ;S13 :对每个触发帧均建立一对应的索引表,该索引表中存储其对应的触发帧中的所有触发帧骨骼在所述触发帧骨骼集合的索引 ;所述步骤 S13 还包括,在对每个触发帧建立对应的索引表后,清除该触发帧的全部触发帧骨骼。0009 较佳地,该方法在对骨骼动画的触发帧进行优化的同时还包括 :优化轻量化动画剪辑数组的存储的步骤,其中,该动画剪辑数组的每个轻量化动画剪辑均包括一骨骼列表,所述骨骼列表对应一骨骼数据索引,所述骨骼列表包括若干数据,每个数据对应一骨骼颜色信息 ;该步骤具体包括 :S21 :去除骨骼颜色信息为空的数据 ;S22 :更新骨骼列表并建立更新后的骨骼数据索引。0。
16、010 较佳地,所述步骤S14后还包括 :采用反序列化加载过程对Unity3d骨骼动画插件SmoothMoves 进行加载。0011 较佳地,所述反序列化加载过程具体为 :通过触发帧中的索引表进行骨骼动画的加载。0012 较佳地,在采用反序列化加载过程对 Unity3d 骨骼动画插件 SmoothMoves 进行加载的同时调用更新后的骨骼数据索引。0013 较佳地,所述步骤 13 具体包括 :S131 :选取骨骼动画触发帧数组中的一个触发帧 ;S132 :为该触发帧中的各触发帧骨骼建立索引表 ;S133 :判断是否骨骼动画触发帧数组中尚存在未建立索引表的触发帧,如果存在,则选取下一个未建立索引。
17、表的触发帧,继续执行 S132;S134 :如果不存在,则步骤 S13 完成。0014 较佳地,所述步骤 S132 具体包括 :S1321 :选取该触发帧中的一个触发帧骨骼 ;S1322 :判断所述触发帧骨骼集合中是否已包括与该触发帧骨骼属性相同的触发帧骨骼,如果已包括,则建立该触发帧骨骼的索引,并将该索引添加至所述索引表中 ;S1323 :如果不包括,则将该触发帧骨骼添加至所述触发帧骨骼集合中,并建立该触发帧骨骼对应的索引,将该索引添加至所述索引表中 ;S1324 :返回继续执行步骤 S1321S1323,直至该触发帧中的全部触发帧骨骼均建立了索引。0015 较佳地,所述步骤 S21 具体包。
18、括 :在所述轻量化动画剪辑的构造函数(说明书中具说 明 书CN 104461662 A3/5 页6体介绍)中添加骨骼颜色信息是否为空的判断,如所述骨骼颜色信息为空,则将所述轻量化动画剪辑的骨骼列表中的该骨骼颜色信息删除 ;如所述骨骼颜色信息不为空,则保留该骨骼颜色信息。0016 较佳地,所述步骤 S22 具体包括 :将所有骨骼颜色信息为空的骨骼颜色信息删除后剩下的骨骼颜色信息组成更新后的骨骼列表。0017 较佳地,将所述更新后的骨骼列表转换为以骨骼数据索引为键值的映射表。0018 本发明所提供的 Unity3d 骨骼动画插件 SmoothMoves 的加载优化方法,改变了传统的 Unity3d。
19、 中骨骼动画插件的加载方法,其通过将原本存储于触发帧中的各个触发帧骨骼数据存储在一建立的触发帧骨骼集合中,而触发帧中只存储其原来所存储的触发帧骨骼的索引表,通过索引的方式减少触发帧在骨骼动画反序列化过程中触发 GC Alloc 的次数。而通过去除骨骼颜色信息为空的数据,实现了大幅缩减骨骼列表的占用空间,也提高了骨骼列表的调用效率。0019 此外,由于在原有的不同触发帧中存在大量属性相同的触发帧骨骼(骨骼动画BoneAnimation 大量的动画信息以触发帧 triggerFrames 和动画剪辑 mAnimationClips 所占比例最大,占 BoneAnimation 总数据量的 90% 。
20、以上,且对于越复杂的动画,占比越高),通过建立集合再索引的方式不仅有效地减少了骨骼动画触发帧数组内各元素的数据存储量,且骨骼动画加载时索引的方式将使所产生的GC Alloc大大减少,从而减少了大量的垃圾内存分配,提高了骨骼动画反序列化的进程,进而有效地提高了骨骼动画的加载速度。附图说明0020 图 1 为本发明提供的优化轻量化动画剪辑数组的存储的主要步骤图 ;图 2 为图 1 所示步骤中更新骨骼列表的示意图 ;图 3 为本发明提供的对骨骼动画的触发帧进行优化的主要步骤图 ;图 4 为本发明提供的对骨骼动画的触发帧进行优化的整体流程图 ;图 5 为本发明提供的优化后的加载过程与优化前的加载过程对。
21、比示意图。具体实施方式0021 为更好地说明本发明,兹以一优选实施例,并配合附图对本发明作详细说明,具体如下 :本发明提供的方法包括优化轻量化动画剪辑数组的存储以及对骨骼动画的触发帧进行优化。0022 其中,骨骼动画的动画剪辑 (BoneAnimation.mAnimationClips) 是以 clip name为键值的轻量化动画剪辑(AnimationClipSM_Lite)数组,每个 AnimationClipSM_Lite 中存储了所属剪辑(clip)的所有骨骼颜色信息,即骨骼(bones)列表。0023 在进行优化轻量化动画剪辑数组的存储时,该部分实施步骤具体如图 1 所示,包括:S。
22、21 :去除骨骼颜色信息为空的数据 ;由于轻量化动画剪辑数组的骨骼列表(AnimationClipSM_Lite.bones)中存在大量的没有实际意义的元素,即骨骼颜色信息(其存储在轻量化动画骨骼数组中,该轻量化动画骨说 明 书CN 104461662 A4/5 页7骼数组表示为 AnimationClipBone_Lite)为空,也即下述 ae 项数据的数值全部为 0 时骨骼颜色为空(而这 5 项数据任意项值越大则颜色信息越多),ae 项数据表示如下 :a.colorACurveSerialized.keyframes.Count(表示透明度曲线上的关键帧数量)b.colorRCurveSe。
23、rialized.keyframes.Count(表示红色曲线上的关键帧数量)c.colorGCurveSerialized.keyframes.Count(表示绿色曲线上的关键帧数量)d.colorBCurveSerialized.keyframes.Count(表示蓝色曲线上的关键帧数量)e.colorBlendCurveSerialized.keyframes.Count(表示融合曲线上的关键帧数量)如此,在轻量化动画剪辑的构造函数(原构造函数包含上述 a e 项的各骨骼颜色信息)中添加骨骼颜色信息是否为空的判断,具体为如当某个骨骼颜色信息对应的上述 a e 项数据为 0(即骨骼颜色信息。
24、为空)时,则将轻量化动画剪辑的骨骼列表中的该骨骼颜色信息删除 ;如该骨骼颜色信息对应的上述 ae 项数据中有一项不为 0(即骨骼颜色信息不为空),则保留该骨骼颜色信息。0024 S22 :更新骨骼列表并建立更新后的骨骼数据索引。0025 如图 2 所示,优化前的骨骼(bones)列表(该列表存储上述的轻量化动画骨骼数组 AnimationClipBone_Lite) 中 的 AnimationClipBone_Lite_1、AnimationClipBone_Lite_2 及 AnimationClipBone_Lite_3 为空数据,该三个空数据删除后,剩下的骨骼颜色信息(Animation。
25、ClipBone_Lite_0 及 AnimationClipBone_Lite_4)组成更新后的骨骼列表(即优化后 bones 列表)。0026 由于在原有的加载过程中,加载的骨骼列表(优化前 bones 列表)是以骨骼数据索引(boneDataIndex)为键值的映射表,因此,在骨骼列表更新后,需要将更新后的骨骼列表(即优化后 bones 列表)转换为以骨骼数据索引(boneDataIndex)为键值的映射表。0027 进行了优化轻量化动画剪辑数组的存储的处理后,多余的无实际意义的信息被删除,以此,骨骼动画插件加载时可以大大减少骨骼动画的数据量,进而达到减少GC Alloc的目的。0028。
26、 如图 3 所示,对骨骼动画的触发帧进行优化具体包括以下步骤 :S11 :建立触发帧骨骼集合(trggerFrameBoneSet),该触发帧骨骼集合中包含属性不同的若干触发帧骨骼(TrggerFrameBone)S12:(本步骤图3中未示出,为已有的技术手段)建立骨骼动画触发帧数组 (BoneAnimation. trggerFrames),骨 骼 动 画 触 发 帧 数 组 中 包 含 若 干 个 触 发 帧(TriggerFrame),触发帧是以动画剪辑的索引(clipIndex)和帧(frame)为键值,且每个触发帧中存储了相应的动画剪辑的相应帧上的所有骨骼关键帧信息,即触发帧骨骼列表。
27、(TriggerFrame. trggerFrameBones),该列表包括若干触发帧骨骼(TriggerFrameBone)。0029 S13 :对每个触发帧均建立一对应的索引表,该索引表中存储其对应的触发帧中的所有触发帧骨骼在触发帧骨骼集合的索引,具体如下 :S131 :选取骨骼动画触发帧数组 (BoneAnimation. trggerFrames) 中的一个触发帧(即元素 tf);S132 :为 tf 建立触发帧骨骼索引表(triggerFrameBoneIndexes);S1321:选取该触发帧中的一个触发帧骨骼,即在tf的触发帧骨骼列表(tf.triggerFrameBones)选。
28、取一个元素 tfb。说 明 书CN 104461662 A5/5 页80030 S1322 :判断trggerFrameBoneSet中是否已包括与tfb属性相同的触发帧骨骼,如果已包括,则建立 tfb 在 trggerFrameBoneSet 中的索引,并将该索引添加至元素 tf 的索引表(tf. triggerFrameBoneIndexes)中。0031 S1323 :如 果 不 包 括,则 将 tfb 添 加 至 trggerFrameBoneSet 中,并 建 立tfb 在 trggerFrameBoneSet 中 的 索 引,并 将 该 索 引 添 加 至 元 素 tf 的 索 引。
29、 表(tf. triggerFrameBoneIndexes)中。0032 S1324 :如果元素 tf 的触发帧骨骼列表(tf.triggerFrameBones)中的全部触发帧骨骼均建立了索引,则清空该触发帧的触发帧骨骼列表,否则返回继续执行步骤S1321S1323,直至 tf.triggerFrameBones 列表中的所有元素均被处理完成。0033 S133 :判断在 BoneAnimation. trggerFrames 的列表中是否仍然存在未建立索引表的触发帧元素,如果存在,则返回至步骤131中选取BoneAnimation. trggerFrames的列表中下一个未建立索引表的触。
30、发帧,继续执行 S132;S134 :如果不存在,即已处理 BoneAnimation. trggerFrames 的列表中的所有元素,则步骤 S13 完成。0034 至此完成了对骨骼动画的触发帧进行优化如图 5 所示,在执行完上述两部分操作后,最终得到的是 Unity3d 自身进行序列化之后的动画信息,其数据量大幅减小,可采用反序列化加载过程对 Unity3d 骨骼动画插件SmoothMoves 进行加载。0035 基于上述步骤执行后,反序列化加载过程具体为 :通过触发帧中的索引表进行骨骼动画的加载,此时全部的触发帧骨骼都存储在触发帧骨骼集合中,通过索引的方式,大幅降低加载时触发 GC Al。
31、loc 的次数。而对于未执行上述步骤的骨骼动画的反序列化加载,其需要对触发帧中大量重复的触发帧骨骼进行反复触发GC Alloc以完成加载,加载速度因而变得较慢。实际测试效果表明,本发明方法可使的触发 GC Alloc 的数量减少 90% 以上。0036 其中,在采用反序列化加载过程对 Unity3d 骨骼动画插件 SmoothMoves 进行加载的同时调用更新后的骨骼数据索引。0037 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何本领域的技术人员在本发明揭露的技术范围内,对本发明所做的变形或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述的权利要求的保护范围为准。说 明 书CN 104461662 A1/4 页9图1图2说 明 书 附 图CN 104461662 A2/4 页10图3说 明 书 附 图CN 104461662 A。