如何提高cocos2d-x-spine骨骼动画加载速度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何提高cocos2d-x-spine骨骼动画加载速度相关的知识,希望对你有一定的参考价值。

参考技术A 下面分2点来说:
1、时间消耗点:io和现场解析
解决方案:加载过的骨骼动画就不要每次重新加载,不要每次都去加载json文件和atlas,我推荐使用
static CCSkeletonAnimation* createWithData (SkeletonData* skeletonData)

这就需要你把解析SkeletonData数据保存起来。
static CCSkeletonAnimation* createWithFile (const char* skeletonDataFile, Atlas* atlas, float scale = 1);

这个方法又要加载文件又要现场解析atlas和json,所以会慢很多。
2、时间消耗点:Json解析。
解决方案:尽量共用骨骼(json是骨骼描和动画描述文件,altas是图集文件)文件,也就是尽量让多个atlas对应同一个json,但是这个度要自己掌握,json文件大小不要超过2mb。然后把这个json预解析,这就需要我们创建一个新的方法,把这个
SkeletonData* SkeletonJson_readSkeletonData (SkeletonJson* self, const char* json)

改成
SkeletonJson_readSkeletonDataWithJson(SkeletonJson* self, Json* json)
你解析好的Json从哪里来,那就要用
Json_create()

CSharpGL(50)使用Assimp加载骨骼动画

CSharpGL(50)使用Assimp加载骨骼动画

在(http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html)介绍了C++用Asismp库加载骨骼动画的原理和流程。

在(http://wiki.jikexueyuan.com/project/modern-opengl-tutorial/tutorial45.html)是其中文版译文。

本文用CSharpGL借助Assimp库实现加载和渲染骨骼动画的功能。

技术分享图片

下载

CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入(https://github.com/bitzhuwei/CSharpGL

在.NET下使用Assimp

三维模型解析库Assimp本身是用C++编写的,所幸有一个C#的封装(https://github.com/assimp/assimp-net)。使用此封装即可直接在CSharpGL中调用Assimp了。

将Assimp32.dll、Assimp64.dll和AssimpNet.dll都放到项目所在目录下,在Reference中添加对AssimpNet.dll的引用即可。

 技术分享图片

技术分享图片 

渲染骨骼动画

Assimp加载模型后得到的数据结构如下:

1 public sealed class Scene
2 {
3     public Animation[] Animations { get; }
4     public Material[] Materials { get; }
5     public Mesh[] Meshes { get; }
6     public Node RootNode { get; }
7 }

按我的理解,其中的RootNode就是骨骼的根结点。整个骨骼构成一个树结构。每个结点都包含一个mat4 Transform矩阵,用于描述自己相对于父结点的方位变化。子结点代表的骨骼,其绝对方位由根结点的Transform逐步地乘到自己的Transform来得到。“绝对方位”指的就是在Model Space中的方位。

 技术分享图片

如图所示,红色的小方块描述了骨骼所在的绝对位置(这里的骨骼对应人体的关节)。从红到白渐变的线条描述了骨骼之间的父子关系,红色一端为父结点,白色一端为子结点。两脚之间的那个红色小方块,就是根结点RootNode。用半透明方式渲染的两臂水平摆放的,就是模型的默认位置。

上图这个模型,只有一个“拿起灯左右查看”的动作(Animation)。其他模型可能有多个动作,它们构成一个数组(Assimp.Animation[])。每个Animation都指定了这个模型的所有骨骼在所有关键帧上的Transform值。这样,通过按时间顺序依次经历各个关键帧(更准确地说,是在2个相邻的关键帧之间插值),就可以得到骨骼在各个时刻的Transform。再让模型的顶点依附于骨骼而动,就实现了骨骼动画。

模型上的一个顶点,要记录自己都依附于哪几个骨骼,自己对这几个骨骼依附的权重分别是多少(权重之和为1)。然后,就可以从默认的初始位置(用半透明方式渲染的两臂水平摆放的那个位置)变换到骨骼要求的位置。

顶点的这一变换过程我还没弄明白。这里需要的Offset Matrix到底是什么。据我查资料,外加计算,Offset Matrix就是那个让骨骼结点变换到绝对方位的矩阵的逆矩阵。但是总觉得有点想不通的地方,确不知道是哪里。

 (暂留空白,来日补充。) 

总结

骨骼动画的原理网上有很多介绍了。我还没有透彻理解,所以不对本文的原理部分负责。

 

以上是关于如何提高cocos2d-x-spine骨骼动画加载速度的主要内容,如果未能解决你的问题,请参考以下文章

CSharpGL(50)使用Assimp加载骨骼动画

使用 ASSIMP 的骨骼动画

使用着色器为网格设置动画

NVisionXR_iOS教程九 —— 渲染一个骨骼动画

如何使用 assimp 在 C++ 中旋转蒙皮模型的骨骼?

在 android 上渲染骨骼动画 FBX 3d 模型