Spine动画缓存优化_weixin_30721899的博客-程序员秘密

技术标签: json  游戏  

背景

Spine是一种骨骼动画工具,我们游戏中的人物、光效等动画资源,基本上都是用它做的。

Spine官方主页:http://zh.esotericsoftware.com/

Spine做出来的动画最终会导出三个文件,分别为:.atlas,.json,.png。

atlas文件和png文件记录合图前的所有被切割的图片信息,而json文件记录的是骨骼配置和动画信息,也就是Spine动画最关键的数据。

为了能让导出的文件在不同的引擎中运行,需要针对不同的引擎写对应的播放代码。这些代码在https://github.com/EsotericSoftware/spine-runtimes中可以找到。

我们的游戏引擎是cocos2dx,里面已经集成了一个Spine动画的播放代码。不一定是最新的,有必要时可以到上面的gitbug中去下载最新的。

问题

背景已经讲完,看看在游戏中使用Spine时遇到什么问题。

问题1、加载多个Spine动画时会比较卡。

原因:加载Spine动画时,需要加载上面提到的三个文件,并且读取json文件里面的动画信息,转换成内存对象,整个过程是阻塞的。当加载多个Spine文件后,造成阻塞的时间比较长,所以就会有卡顿出现了。

问题2、同样的Spine动画加载多个,内存上升明显。

原因:Spine动画数据没有重用,同一个动画加载多个到场景中时,会加载多次,数据也成倍增加。既浪费内存又增加加载卡顿的时间。

针对第一个问题,有一种解决方案,就是避免同一个时间加载过多的Spine动画,可以采用每一段时间加载一个,这样可以分摊加载压力,不至于瞬间卡死程序。这种方法可以缓解,但没有根除。

但不能解决第二个问题。所以得想一种能解决这两种问题的方案。

解决方案

针对问题1,可以采用异步加载的方式,也就是加载过程不要阻塞主线程(渲染线程),开一个线程来加载,加载完成后把数据给主线程,让其渲染。这样可以避免卡顿。

针对问题2,需要一个池子保存加载过的动画数据,当遇到重复的Spine动画时,直接把上次加载的数据返回即可,这样既避免了内存暴涨,又避免了多余的加载过程。

实现

新建SpineCache类,专门用来开线程加载数据和缓存数据。具体实现可以直接到VS里面去看了。纯代码的东西还真不知道怎么描述。。。

注意事项

1、记得手动清除SpineCache里面缓存的数据,我们目前是在切换场景时调用clearAllCache接口。当然特殊时候也可以手动移除指定的缓存。

2、Spine运行时代码的更新,这个比较蛋疼,如果更新了Spine 的运行时代码,需要把修改的SpineCache代码功能加进去。

转载于:https://www.cnblogs.com/junxiong/p/4754993.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30721899/article/details/96001252

智能推荐

unity打开项目的时候出现Enter Safe Mode的原因以及解决方法_wodownload2的博客-程序员秘密

此时选择Enter Safe Mode会相对省时,打开项目之后,排查脚本的出错情况,修正之后,重新打开项目即可。所以一般情况下,选择Enter Safe Mode,然后修正,重新打开项目即可。如果选择Ignore的话,会整个项目都重新导入,非常耗时。出现问题的原因是,项目中有脚本编译错误导致。

react 对象渲染_React动态渲染组件(对象分配与函数返回)_以太创服的博客-程序员秘密

我在这里碰到了一堵砖墙,这意味着我无法完全弄清楚为什么接下来的两个版本的代码行为如此不同。React动态渲染组件(对象分配与函数返回)在第一个版本,当我初始化一个this.childComponent = (),其道具似乎并不当我改变了Parent的状态(通过setState())来更新。即使实际调用了setState(),并且Parent的状态已更新,也会发生这种情况。在第二个版本中,当我实际初...

数据库总结-04关系数据理论_给定关系模式r(u,f)其属性分为4类_相似的人适合打闹的博客-程序员秘密

范式:按关系模式所具有的数据依赖性质对关系模式的分类。也就是关系的规范化程度。规范化:把一个低一级范式的关系模式通过模式分解转化为若干个高一级的关系模式的过程。第一范式定义:关系的每个分量必须是不可再分的数据项。记作R∈1NF。(每个属性必须是原子的)注意:属性不可再分(不允许出现嵌套的属性定义)属性下的值不可再分(不允许出现多个值)这是对关系的最起码的要求,但远远不够。(满足1NF...

一次性清空某个数据库中所有表数据的SQL_DevEnvZ的博客-程序员秘密

在我们项目开发过程中,经常遇到需要在开发数据库基础上清理一个空库,但由于对数据库结构缺乏整体了解,在删除一个表的记录时,删除不了,因为可能有外键约束,一个常见的数据库结构是一个主表,一个子表,这种情况下一般都得先删除子表记录,再删除主表记录。说到删除数据记录,往往马上会想到的是delete和truncate语句,但在遇到在两个或多个表之间存在约束的话,这两个语句可能都会失效,

Java文件下载(excel)_java xls文件下载_chengxianjie的博客-程序员秘密

最简单的方法就是把文件链接写到a标签的href里,但是有人说了,这样会暴露服务器的文件路径,有风险- -下面整理介绍几种通过代码实现的方法: 1,    @RequestMapping("download")     public ResponseEntity<byte[]> download(HttpServletRequest request) throws Excep...

当用PDA拍照传参和普通扫码API区别_pda前端_爱睡D小猪的博客-程序员秘密

当用PDA手机拍照传参和普通扫码API区别有的硬件设备经常在一个事件结束多了一个回车事件,在前端控制台打印参数不一样正确的比如东大集成的pda扫码打印多了 ’ \n ’ 的换行符号,调用摄像头的扫码API是没的,请求接口一样,控制台打印的参数一样,但是其实参数不一样,需要在 < 返回的请求数据里面看请求头,请求体去确认参数,请求头是否一样 >接口,参数字段名一样,表面看到的打印的参数也一样,在请求体不一样。......

随便推点

TDD(一)_唐僧也有金箍棒的博客-程序员秘密

还是利用TDD(测试驱动的方式)来编码实现多线程下载需求:使用多线程实现下载,所要实现的接口     (1)ConnectionManager,可以打开一个连接,通过Connection可以读取其中的一段(用startPos,endPos来指定)      (2)DownloadListener,由于是多线程下载,调用这个类的客户端不知道什么时候结束,故需要当所有的线程都执行完以后,调

使用 Python 进行游戏脚本编程 [翻译]_love_hot_girl的博客-程序员秘密

http://www.oschina.net/question/234345_54796使用 Python 进行游戏脚本编程作者Bruce DawsonHumongous 娱乐公司http://www.cygnus-software.com/papers/介绍使用脚本语言可以更加快速地开发游戏逻辑,而不必担心由于 C++ 程序员的粗心大意

线性表之循环链表编程系列复习题+834考点复习_wuyaxin97的博客-程序员秘密

834考纲要求: 循环链表的概念,双向循环链表的概念,插入和删除结点 多项式的链表表示,算法思想 1、概念级知识点:首尾相接的链表为循环链表。任一节点出发均就可以 找到表中其他节点,分 单向循环和双向循环链表特殊性---当遍历时,判空的终止条件不同,单链表判空-----p!=NULL或p->next !=NULL,循环单链表判空-----p!=L 或 p->ne...

【ArcGIS Pro微课1000例】0010:ArcGIS Pro导入ArcMap样式符号库——以国土三调样式为例_arcgis pro 3.1_刘一哥GIS的博客-程序员秘密

样式是用于存储符号、颜色、配色方案、标注放置和布局项目的容器。 它们可以提升地图、场景和布局的一致性和标准化程度。 您创作地图、场景和布局时所使用的符号库和颜色选取器由存储在样式中的项目填充。ArcMap、ArcGlobe 或 ArcScene 的桌面样式不能直接在 ArcGIS Pro 中使用,因为它们的基础数据库结构不同。 但是可以导入桌面样式,从而生成它的 ArcGIS Pro 版本,并将该版本添加到工程中。导入后,样式的 ArcGIS Pro 版本放置在工程主文件夹(例如,[install .

nginx代理后获取请求的真实ip_Willis_m的博客-程序员秘密

nginx.conf:server {listen 80;server_name _;location / {…proxy_pass http://127.0.0.1:8000/;# $host 变量,Host 为变量名proxy_set_header Host $host;proxy_set_header X-Real-IP ...

SIM868_sim868固件升级_ShiLianXin的博客-程序员秘密

SIM868模块是一款四频GSM / GPRS模块,A并集成GNSS(GPS / GLONASS / BDS)技术用于卫星导航 , 模块尺寸17.615.72.3mm,具有LCC和LGA焊盘的紧凑设计能适用于各种紧凑型产品设计需求。可以为客户节省成本和快速开发带来更多便利。技术支持←_←产品详情主要特性•四频850/900/1800/1900MHz•GPRS multi-slot class 12/10•GPRS mobile station class B•满足GSM 2/2+ 标准–C