骨骼动画于空间萌宠H5上的实践与调优

什么是骨骼动画,本篇先简单做下科普,其他大家自行百度哦

比帧动画:它比帧动画大幅节省了资源空间,也比帧动画对手机性能有更高的要求,webgl下能达到最佳的展示效果

编辑器选择:业界比较主流的骨骼动画编辑器有SPINE和DragonBones(龙骨,egret白鹭公司在维护)。我们联系到cp使用的SPINE编辑器比较多,而又需要同样一个资源文件,三端公用(ios,安卓,H5)SPINE的运行库选择更多,所以我们选用了SPINE编辑器,虽然都是骨骼动画,但是他们的动画原理是略有差别的。

先让我们解开骨骼动画神秘的面纱吧~纯手画给大家奉上我对于骨骼动画的理解,这里仅仅是SPINE编辑器下的原理,不同的编辑器有略微的不同,这里不多余说明。如果当时有人给我这张图,能节省我1天工作量,呜呜~

图解:

(a)骨骼是一个树状结构,有个明显的好处就是,如果动画时要设置位移,只要设置根节点的位移,整个任务都能一起位移。

(b)附件其实人物外表的展示,主要有三种类型:图片,蒙皮,权重蒙皮。图片好理解,就好像是一张贴花贴着,很僵硬,就像下面左边的那个长枪,右边就是蒙皮,可以定义形变,让整个长枪动得更加自然流畅

左图右图

为什么蒙皮能自由形变呢?因为它有顶点,边缘,三角区域这三个概念,能对图片某个区域变形,这中特性在webgl是原生支持的,但canvas2d下是引擎自己写的,这个就是说骨骼动画对性能要求更高就是因为这个。为什么这三个概念能自由变形呢?看下面的图解

只要移动了那个顶点就能拉长鼻子

(1)引入SPINE编辑器导出的json文件

(2)引擎自动引入同名的atlas和png文件

(3)解析json和atlas文件,生成spine对象

(4)加入到容器里面

(5)定时器渲染,播放动作

最简单的方式,hack引擎从atlas读取出来的附件信息,修改它的texture指向换装之后texture(webgl渲染用的纹理)。再new一遍Spine对象,这样虽然能实现需求,但是画面会有闪动,体验不好

所以在熟读了一遍PIXI代码之后,找到了更优雅的方式,pixi有一个Texture.fromCanvas的接口,可以把一个canvas作为一个纹理绘制,所以:把canvas代替png绘制,如果有换装,就用canvas的clearRect擦除和drawImage覆盖以前位置的图片(需要注意的是旋转这个参数)。bingo,换装功能完成,换装时就不再闪动了,而且图片类型的附件还是使用引擎自带换装方式,更快!流程大致如下:

经验教训:实现代码之前务必熟读引擎源码,理解原理流程,打通任督二脉,找到最佳实现方法。

实现原理:

animation.state['setAnimationByName'|'addAnimationByName'](track,act_name,loop,delay);可以基于轨道track(int)来做动作的叠加

亮点:

(a)实现播放动作有限次

(b)维持一个播放队列

问题1:webgl截图空白

答:

(a)WebGL获取上下文时,有一个关键参数:preserveDrawingBuffer,默认为false,表示在绘图完成后不保留绘图缓冲区。如果设置成true,会影响性能(b)在定时器里面,同步截图,DONE!

问题2:毛玻璃效果怎么实现?需要重新引入库来解决吗?

答:否,pixi引擎自带支持哦,Container对象底下有个filters参数可实现毛玻璃效果

方案1:单次播放法,满帧截取的情况下,ios能达到要求,但是安卓上不同机型,不同机器现状都可能截出不同效果的gif,差的时候只能2,3张,效果差而且不稳定

返回:由Math.floor(t*fps)生成的index截图组成的数组;最终的截图数组长度>=fps*动画总时长就停止截图最终的效果也是很赞的

动画的平均长度为1.8s,两端的截图耗时IOS:2025msAndroid:4535ms

第一次用PIXI,第一次用PIXI-SPINE。作为一个要上线承载上亿用户的产品,开发过程,遇到了一些引擎水土不服的地方,主要有:

定位:是因为同一个插槽下面有多种类型的附件

if(type===spine.AttachmentType.region){if(slot.currentMesh){slot.currentMesh.visible=false;slot.currentMesh=undefined;slot.currentMeshName=undefined;}....}

if(type===spine.AttachmentType.skinnedmesh||type===spine.AttachmentType.mesh||type===spine.AttachmentType.linkedmesh){if(slot.currentSprite){slot.currentSprite.visible=false;slot.currentSprite=undefined;slot.currentSpriteName=undefined;}....}最近看了下PIXI-SPINE的最新版本这个bug已经fix了。

定位:有mesh且在某些机器上才能重现,比如nexus5。这些机器并没有明显的共性。把webgl渲染强行切成canvas2d的,显示就正常了,说明还是webgl下mesh某种特性兼容性的问题

解决:通过google搜索,和自己debug。发现是因为一个参数引起的,如果设置成true,出问题的机器上就正常了

PIXI.glCore.VertexArrayObject.FORCE_NATIVE=true;这句话的意思,如果是false的话,就用每种浏览器对于创建VAO(顶点数组对象)的扩展(之前有提到过,mesh是有顶点,三角形区域这样的组成)

if(!VertexArrayObject.FORCE_NATIVE){this.nativeVaoExtension=gl.getExtension('OES_vertex_array_object')||gl.getExtension('MOZ_OES_vertex_array_object')||gl.getExtension('WEBKIT_OES_vertex_array_object');}

功能开发好不容易完了,兼容性也OK了,但是性能却挺糟糕,crash,发热,进入游戏慢,性能bug单狂轰滥炸,静下心来各个击破,最终项目各个性能指标达标,在外网稳定运行。

工欲善其事必先利其器,定位性能问题,要通过工具去分析哪里是性能瓶颈,才能有的放矢,虽然通过chrome的性能分析工具已经能发现大部分问题,但是ios和安卓上因为实现的差异是不是存在其他的问题,也需要测试一下才放心。这里搜罗了一下常用的性能分析工具,供大家参考

原因:页面内存占用过高是主要因素,什么资源最占用内存呢,通过chromeprofiles面板分析便知

54%的内存都消耗在动作的timeline数据上了。用排除法分析了一下一个动作的json占用的内存数

每个动作原始数据+解析成数组总共占用390KB。每个用户每次用的动作有限,并不需要把完整的动作数据加载出来,所以解决crash可以通过一下方法

(a)首次只加载模型json以及必须的2个动作数据,其余的按需加载,解析完塞到宠物的动作数据里面(这里需要改写源码暴露读取动作数据的接口)

效果:内存减少:49M减小到18M,减少了80%(chrome上测试)

解决:降级策略看起来这里唯一行得通的解决方案了,没有渲染就没有发热。所以就要把渲染用在刀口上。损失非关键体验,安卓停掉默认动作停止渲染,需要时再打开渲染,改成隔3秒播放一次动作让用户感觉也是在一直动

效果:有效解决手机发热的问题

PIXI是支持自动识别浏览器是否支持webgl来选择是canvas2d还是webgl来渲染动画,先科普下webgl的市场占用率吧

ios:ios7.1以上都是支持WebGL的

android:安装了tbs的机器支持WebGL

因为tbs是热更新的,新安装的APP没有tbs,就不支持WebGL,而又是我们推广的关键时期。所以canvas2d下的渲染也需要做好它的优化。

解决:canvas2d下的帧耗时的优化可以通过将canvas2d中不变的背景独立到dom上,不放在canvas里面渲染

效果:优化了40%左右。举证材料都会在附件里面

解决:

(a)不采用一般游戏进入先loading资源,采用背景和宠物初步加载的方式

(b)动作JSON按需加载

表现:安卓上黑屏,ios上因为用了wkwebview会重新loading

定位:在排行榜频繁切换好友的时候会必现,排行榜的设计模式是每个好友都是独立的,每次都销毁上一个宠物,再添加下一个宠物,这是面向对象编程基本的思路。

可是这样切换几次后就会异常,直觉告诉我是跟WebGL或者内存有关。这里先科普下浏览器的内存占用分几块:

jsheap和Dom内存的占用通过chrome的profiles和timelines面板可以看出来,但是其他的内存占用可以在哪里看呢?通过chrome的更多工具->资源管理器即可!

有了这个强大的工具,问题定位将不是问题,其实主要是两个问题

(a)js内存上涨,切换12个好友js内存上涨了18M,定位下来增长的内存是附件mesh等等信息

(b)GPU内存只升不降,GPU内存就是WebGL占用的内存,如果有独立显卡的话他的内存占用是和浏览器内存独立的,但是手机端没有独显,可能会跟浏览器有共享内存,这个按机型而异。但是GPU内存增长太多绝不是好事,它可能会影响浏览器申请更多的GPU,造成页面黑屏,也会导致浏览器占用内存过多,被原生app杀掉或者重启。所以这里就是频繁申请释放GPU内存造成的内存泄漏

解决:既然已经发了问题,解决方法就应运而出啦

(a)同一种宠物模型对象复用,切换下一个好友的宠物就是换装,解决js内存过度增长!

效果:切换12个好友内存增长了5M而已

(b)换装纹理复用,不销毁。因为换装纹理是一个canvas,完全可以擦除之后再回收再利用。解决了GPU的内存泄漏

效果:

以前的方案,5次切换好友之后,GPU内存直接飙升了90M166M到255M

复用纹理后,5次切换好友,GPU只上涨了30M,第二次切换后并没有上涨166M到199M

(c)从排行榜切换回来之后,销毁好友的宠物模型。这个是PIXI官方提供的销毁接口。

pet.stage.destroy(true)销毁后,GPU内存恢复到最初状态170M左右

经过上述三次改造后,内存就维护在一个比较稳定的状态,黑屏和reload的问题就修复好了

1.做游戏,需要熟悉引擎源码以及WebGL。越熟悉越好

2.项目需要的内存越多,能够运行它的终端就越少,所以一定要想方设法的定位内存占用大头,逐个击破

3.可以使用降级策略,降级策略要能因机制宜,切忌大刀阔斧。根据机器的剩余内存和GPU核数或者当前的FPS值来做降级策略

THE END
1.栩栩如生的宠物画教程:捕捉你的毛茸茸伙伴的本质宠物教程无论是传达你对心爱宠物的喜爱,还是为你的家增添一些个性,绘画都能成为一种充满意义和艺术性的方式。通过这个全面的教程,我们将指导你一步一步地创作一幅栩栩如生的宠物画,捕捉你的毛茸茸伙伴的独特精神和魅力。 第1 步:准备工作 在开始绘画之前,你需要准备以下材料:* 铅笔(用于素描) ...https://www.qinpa.cn/36085.html
2.小动物骨骼动日常表情包4R/P提供...来自速爱─② 小动物 骨骼动日常表情包?━ 4R/P 提供署名+id出图 ? ?收藏 转发 评论 ?赞 评论 o p 同时转发到我的微博 按热度 按时间 正在加载,请稍候... ü 简介: 约表情包 ?V:CSMHT66(吃什么海苔66) 更多a 微关系 她的关注(146) 让我卷一单...https://weibo.com/7845910543/5104267694444540
3.金毛骨骼图金毛犬的身形相对比较庞大,这里为大家介绍一些金毛骨骼的图片,希望这些图片能让大家对金毛狗狗的身体更清楚。 金毛图片-金毛骨骼图1 金毛图片-金毛骨骼图2 金毛图片-金毛骨骼图3 强力推荐:如果您想了解更详细的金毛犬知识,欢迎查阅《金毛犬一本足够》:淘宝网金毛犬电子书第一名!好评率为100%的金毛电子书!金毛喂养...http://www.weipet.cn/jinmaopics/guge.htm
4.三种骨骼矫形术治疗犬前十字韧带断裂的临床疗效分析三种骨骼矫形术治疗犬前十字韧带断裂的临床疗效分析 1、病例信息 8例患有前十字韧带断裂患犬均来源于2014年10月至2017年6月期间深圳瑞鹏宠物医院门诊病例。 2、方法 2.1.1 理学检查 前十字韧带断裂引起胫骨前移,膝关节不稳定,抽屉试验及胫骨压迫测试均呈现阳性。https://www.cnsav.com/newsdetails/535
1.适合年轻人创业项目适合晚上做的小生意位置可选择公园、市民广场和宠物医院附近,以利借光。个人条件,除了过硬的技术,还必须了解与宠物相关的知识,知道它们身体上每个最有价值的部位,甚至要知晓大多数宠物的骨骼图。单张照片的价位可在30到60元之间,一本相册价格可定在200到1000元。同时还可考虑将照片印在杯子上,或放进钥匙扣里。促销方式,开始可给意向...http://chuangye.yjbys.com/xiangmu/xiaobenchuangyexiangmu/550691.html
2.办公室存在哪些安全隐患(精选18篇)2.3 骨骼肌溶解症 20 09年,媒体报道南京发生近20例进食小龙虾发生横纹肌溶解症患者。除南京外,北京、福州均出现了进食小龙虾导致横纹肌溶解症的病例。目前...篇11:居家宠物要注意哪些卫生安全隐患 养宠物如何保持卫生? 宠物卫生注意事项准备好宠物灭虫剂、宠物沐浴液等宠物用品,注意宠物的身体卫生。 https://www.360wenmi.com/f/filenevyl66y.html
3.宠物狗的品种图片大全动物狗图片宠物狗的品种图片大全【动物狗图片】 从我小时候家里开始养狗到我长大自己养狗,有近30年与狗狗打交道历史了,全球狗狗品种有至少400种,而根据我的梳理,较常见的狗狗品种有150种左右,还有很多不常见的,以及后期培育出来的新品种。 以下是我整理的152个狗狗品种及简单介绍金毛...https://www.wandongli.com/news_detail.html?id=20727
4.宠物蝎灵20年:情怀能成事只是非偶然手机手机新闻宠物小精灵Game Boy游戏 红黄蓝各版本 技术所限,当年的游戏画风也是骨骼清奇,虽然经历了从最初刚发布时的Game Boy上的黑白画面到后来出现在GBA上的彩色画面,但早期依然是满屏马赛克飘过的时代;于是主人公小智看上去跟超级玛丽大叔没什么区别。 1998年Pokémon 第一世代红蓝版本Game Boy游戏画面 ...https://mobile.zol.com.cn/594/5941135.html
5.NULL(cat可爱的猫咪CG模型带骨骼和动作)max3dmax动物怪物宠物坐骑3d模型资源合集3 _NULL_(cat 可爱的猫咪CG模型 带骨骼和动作) 资源编号 :48517341 格式:max 文件体积 :15m 下载量 :4 云检查 3dsMax截图 云检查详情 3dsMax工具内截图透视图 默认明暗处理 云检查收起 方式:3dsMax工具内截图 环境:3dsMax 2022, windows10 ...https://www.aigei.com/item/cat_ke_ai_de_m.html
6.有的萨摩耶金毛骨架特别大高清油画大图下载绘画名家代表作4、毛皮分布,直毛的好于毛块混乱的。在梳毛的时候,你留心毛的色泽,金毛的毛色是渐变的,好的金毛宝宝,身上可以看出长大了以后毛色分布图--多看几次,就知道我说的是什么了。 5、头颅,金毛的头颅有两个特点,首先,在脑袋顶稍后有一个很明显的骨骼突起,没有这个突起的金毛,种不纯。其次,在鼻子郑重,呈下凹状态...https://hd.zhongyiminghua.com/0302990356.html
7.小狗哈士奇3d模型小狗哈士奇模型图片素材免费下载哈士奇 小狗 宠物 动物3D模型282 99+下载 狗 狗玩具 哈士奇 小奶狗 玩具狗 卡通狗 狗雕像 宠物狗 小狗 宠物3D模型261 现代 狗 小狗 哈士奇3D模型169 现代 狗 阿拉斯加犬 爱斯基摩犬 雪橇犬3D模型104 狗 狗玩具 玩具狗 卡通狗 狗雕像 宠物狗 小狗 宠物 哺乳动物3D模型261 ...https://www.3d66.com/relation/relation_1988370_4.html
8.如何制作狗狗标本——从毛发到骨骼(宠物爱好者的终极指南)制备骨骼是一个非常复杂的过程。需要仔细地清洗和磨光骨骼,并用硼酸溶液浸泡。 制备肌肉和器官 肌肉和器官制备需要对身体结构有一定的了解。要小心地分离和保存关键部位。 填充标本 在完成前几个步骤后,需要将标本填充以保持其形状和结构。填充材料可以使用聚脂、聚氨酯泡沫等。 https://www.pettb.cn/article-35655-1.html
9.从“小白”到宠物美容师,这项技能培训助力残疾人就业创业“从认识工具,到怎么画设计图,拿剪刀操作,学员们将接受系统的培训。”蔡玲玲说,希望通过这次培训,让学员能熟练地掌握宠物美容的技巧,参加宠物美容师的职业资格考试,为他们今后的创业就业提供帮助。 重庆市残疾人劳动就业服务指导中心相关负责人介绍,根据前期基层调研发现,宠物美容经济正在不断发展,市场对宠物美容师的需...https://www.cqcb.com/county/jiulongpo/jiulongpoxinwen/2022-06-06/4910315_pc.html
10.大侠立志传所有女角色结缘攻略(含DLC纪茯苓结缘攻略)●有一人身躯骨骼十余处扭曲(队伍任意成员臂力达到8); ●有一人体内真气杂乱不堪(队伍任意成员内力达到800); ●有一人身中奇毒(队伍任意成员毒术达到50); ●最后一人身中玄寒之毒(雷击木1根); 完成后获得绝招【杨枝甘露】(这个任务不影响结缘); https://www.pc0359.cn/article/160314.html