cocos2dx版本为3.10

1.在使用spine的过程中,发现了一个比较严重的问题:每次创建SkeletonAnimation的时候都会很卡,即使是使用同一个骨骼数据skeletonData。
跟踪代码发现,在每次调用函数spine::SkeletonAnimation::createWithFile (const std::string& skeletonDataFile, const std::string& atlasFile, float scale = 1);的时候都需要重新解析一次skeletonDataFile产生骨骼数据skeletonData。

2.问题找到了,那要想个最简单的解决办法,就是将骨骼数据skeletonData缓存起来,需要的时候再取出来使用。

3.直接修改SkeletonAnimation的源码
①在头文件SkeletonAnimation.h中增加对应函数以及成员变量

 public:
//从缓存中创建Animation
static SkeletonAnimation* createFromCache(const std::string& skeletonDataKeyName); //将文件读入到cache中(skeletonDataKeyName参数为自定义的骨骼数据名称)
static spSkeletonData* readSkeletonDataToCache(const std::string& skeletonDataKeyName, const std::string& skeletonDataFile, const std::string& atlasFile, float scale = ); //从cache中得到skeletonData(skeletonDataKeyName参数为自定义的骨骼数据名称)
static spSkeletonData* getSkeletonDataFromCache(const std::string& skeletonDataKeyName); //从cache中删除skeletonData(skeletonDataKeyName参数为自定义的骨骼数据名称)
static bool removeSkeletonData(const std::string& skeletonDataKeyName); //清理所有skeletonData
static void removeAllSkeletonData(); //是否在cache中存在对应的骨骼数据skeletonData
static bool isExistSkeletonDataInCache(const std::string& skeletonDataKeyName);
private:
struct SkeletonDataInCache{
spSkeletonData* _skeleton_data; //记录骨骼数据
spAtlas* _atlas; //记录对应图片块信息
};
typedef std::map<std::string, SkeletonDataInCache>::iterator ItSkeletonData;
static std::map<std::string, SkeletonDataInCache> _all_skeleton_data_cache; //记录所有的skeletonData缓冲区

②在源文件SkeletonAnimation.cpp中增加对应函数实现以及初始化静态成员变量

 SkeletonAnimation* SkeletonAnimation::createFromCache(const std::string& skeletonDataKeyName)
{
if (spSkeletonData* skeleton_data = getSkeletonDataFromCache(skeletonDataKeyName)){
SkeletonAnimation* node = new SkeletonAnimation(skeleton_data, false);
node->autorelease();
return node;
} return nullptr;
} spSkeletonData* SkeletonAnimation::readSkeletonDataToCache(const std::string& skeletonDataKeyName, const std::string& skeletonDataFile, const std::string& atlasFile, float scale /*= 1*/)
{
ItSkeletonData it = _all_skeleton_data_cache.find(skeletonDataKeyName); if (it == _all_skeleton_data_cache.end()){
SkeletonDataInCache skeleton_data_in_cache;
skeleton_data_in_cache._atlas = nullptr;
skeleton_data_in_cache._skeleton_data = nullptr; skeleton_data_in_cache._atlas = spAtlas_createFromFile(atlasFile.c_str(), );
CCASSERT(skeleton_data_in_cache._atlas, "readSkeletonDataToCachereading Error atlas file."); spSkeletonJson* json = spSkeletonJson_create(skeleton_data_in_cache._atlas);
json->scale = scale;
skeleton_data_in_cache._skeleton_data = spSkeletonJson_readSkeletonDataFile(json, skeletonDataFile.c_str());
CCASSERT(skeleton_data_in_cache._skeleton_data, json->error ? json->error : "readSkeletonDataToCache Error reading skeleton data file.");
spSkeletonJson_dispose(json); if (skeleton_data_in_cache._atlas && skeleton_data_in_cache._skeleton_data){
_all_skeleton_data_cache[skeletonDataKeyName] = skeleton_data_in_cache; return skeleton_data_in_cache._skeleton_data;
}
else{ //错误处理,释放创建的资源
if (skeleton_data_in_cache._skeleton_data){
spSkeletonData_dispose(skeleton_data_in_cache._skeleton_data);
} if (skeleton_data_in_cache._atlas){
spAtlas_dispose(skeleton_data_in_cache._atlas);
}
}
} return nullptr;
} spSkeletonData* SkeletonAnimation::getSkeletonDataFromCache(const std::string& skeletonDataKeyName)
{
ItSkeletonData it = _all_skeleton_data_cache.find(skeletonDataKeyName);
if (it != _all_skeleton_data_cache.end()){
return it->second._skeleton_data;
} return nullptr;
} bool SkeletonAnimation::removeSkeletonData(const std::string& skeletonDataKeyName)
{
ItSkeletonData it = _all_skeleton_data_cache.find(skeletonDataKeyName);
if (it != _all_skeleton_data_cache.end()){
if (it->second._skeleton_data) spSkeletonData_dispose(it->second._skeleton_data);
if (it->second._atlas) spAtlas_dispose(it->second._atlas); _all_skeleton_data_cache.erase(it);
return true;
} return false;
} void SkeletonAnimation::removeAllSkeletonData()
{
for (ItSkeletonData it = _all_skeleton_data_cache.begin(); it != _all_skeleton_data_cache.end(); ++it){
if (it->second._skeleton_data) spSkeletonData_dispose(it->second._skeleton_data);
if (it->second._atlas) spAtlas_dispose(it->second._atlas);
} _all_skeleton_data_cache.clear();
} bool SkeletonAnimation::isExistSkeletonDataInCache(const std::string& skeletonDataKeyName)
{
ItSkeletonData it = _all_skeleton_data_cache.find(skeletonDataKeyName);
if (it != _all_skeleton_data_cache.end()){
return true;
} return false;
} std::map<std::string, SkeletonAnimation::SkeletonDataInCache> SkeletonAnimation::_all_skeleton_data_cache; //初始化静态成员

4.好了,重新编译libcocos2d后,下面为c++的使用方式。
①在需要使用的地方调用对应的接口进行创建

 //判断是否存在自定义名称为GirlSkeletonDataKey的骨骼数据
spSkeletonData* skeleton_data = spine::SkeletonAnimation::getSkeletonDataFromCache("GirlSkeletonDataKey"); //如果不存在对应的骨骼数据,则读入解析一遍
if (!skeleton_data){
skeleton_data = spine::SkeletonAnimation::readSkeletonDataToCache("GirlSkeletonDataKey", "girl.json", "girl.atlas");
} if (skeleton_data){
//直接使用骨骼数据创建动画
spine::SkeletonAnimation* skeleton_animation = SkeletonAnimation::createWithData(skeleton_data); //也可以使用这个接口,效果和createWithData一样
//spine::SkeletonAnimation* skeleton_animation = SkeletonAnimation::createFromCache("GirlSkeletonDataKey");
}

②在需要释放数据的地方调用这个接口释放所有的骨骼数据缓存数据

 spine::SkeletonAnimation::removeAllSkeletonData();

5.lua使用方式
①直接进入cocos2d-x-3.10\tools\tolua,运行genbindings.py来重新生成c++和lua之间的绑定文件
②重新编译libluacocos2d
③下面为lua的使用方式

 --由于lua中没有绑定spSkeletonData,所以readSkeletonDataToCache的函数返回值无效(getSkeletonDataFromCache函数也一样),不能对返回值进行判断!
if not sp.SkeletonAnimation:isExistSkeletonDataInCache("GirlSkeletonDataKey") then
sp.SkeletonAnimation:readSkeletonDataToCache("GirlSkeletonDataKey", "girl.json", "girl.atlas");
end
--由于cocos2dx_spine.ini中没对SkeletonAnimation::createWithData函数进行绑定,所以这个函数在lua中不能使用
local skeleton_animation = sp.SkeletonAnimation:createFromCache("GirlSkeletonDataKey");

以上,完。

cocos2dx spine之一 :spine缓存 (c++ & lua)的更多相关文章

  1. 【转载】cocos2d-x教程 Mac系统下搭建Lua的编码环境

    原文链接:http://blog.csdn.net/u012945598/article/details/17168831   在使用Lua写脚本的时候大家都会因为没有代码提示导致敲代码的效率有所下降 ...

  2. cocos2d-x 2.2.0 如何在lua中注册回调函数给C++

    cocos2d-x内部使用tolua进行lua绑定,但是引擎并没有提供一个通用的接口让我们可以把一个lua函数注册给C++层面的回调事件.翻看引擎的lua绑定代码,我们可以仿照引擎中的方法来做.值得吐 ...

  3. cocos2d-x 2.2.0 怎样在lua中注冊回调函数给C++

    cocos2d-x内部使用tolua进行lua绑定.可是引擎并没有提供一个通用的接口让我们能够把一个lua函数注冊给C++层面的回调事件. 翻看引擎的lua绑定代码,我们能够仿照引擎中的方法来做. 值 ...

  4. cocos2dx 3.3 C++工程添加lua支持

    准备工作: 1. 拷贝cocos2d-x-3.3rc0\external\lua整个文件夹到项目中(如myProject\cocos2d\external\lua) 2. 拷贝cocos2d-x-3. ...

  5. cocos2d-x注意事项(十)Lua发展飞机战争-4-创建主角

    二战中被称为二战飞机飞机,当然,以飞机作业.这是一个游戏,我们必须加入一个飞机--这是我们的英雄. 首先创建一个层(PlaneLayer)要显示飞机.然后,create飞机初始化方法 module(& ...

  6. cocos2d-x C++ 获取网络图片缓存并展示

    #ifndef __HttpGetImg__ #define __HttpGetImg__ #include "cocos2d.h" #include "HttpRequ ...

  7. [Cocos2d-x]Lua 资源热更新

    什么是热更新 所谓的热更新,指的是客户端的更新. 大致的流程是,客户端在启动后访问更新的URL接口,根据更新接口的反馈,下载更新资源,然后使用新的资源启动客户端,或者直接使用新资源不重启客户端. 热更 ...

  8. 关于cocos2dx for lua资源加载优化方案

    之前我写游戏加载都是从一个json文件写入要加载的文件名来实现加载,但是如果资源 比较多的情况下,会导致非常难管理,需要逐个写入.所以换了另外一种方式来加载文件. 首先,我是通过场景之前的切换时候,加 ...

  9. Spine批量导出Command line Export

    1.准备工作及介绍 时间有点紧张,写的不是很详细,请见谅. 当前版本是2.2以上,购买版的.试用版的无法试用Command line Both Spine and the Spine launcher ...

随机推荐

  1. P2801 教主的魔法(分块)

    P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...

  2. sql xml 入门 (二)

    DECLARE @myDoc xml --http://www.paymob.cn --话费充值api,充值api,话费充值接口,手机话费充值,车贝手机,贝萌手机,移动话费充值,联通话费充值,电信话费 ...

  3. C语言实现随机生成0~100的数

    #include <iostream> #include <time.h> int main() { srand((unsigned)time(NULL));//srand() ...

  4. c++中ifstream一次读取整个文件

    转载:http://www.cnblogs.com/kex1n/p/4028428.html 第一种方法: 读取至std::string的情况: #include <string> #in ...

  5. topcoder srm 535 div1

    problem1 link 对于每个质因子$p$,枚举其出现的最少次数以及最多次数分别在哪个数字中. problem2 link 分数规划.题目是求$\frac{3600K+\sum_{i=0}^{K ...

  6. Python3 tkinter基础 Label imag显示图片

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. 【安装】Matlab7.0简介及安装

    一.简介 Matlab下载官方版是美国MathWorks公司出品的商业数学软件,Matlab7.0下载官方版用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MAT ...

  8. 题解——ATCoder AtCoder Grand Contest 017 B - Moderate Differences(数学,构造)

    题面 B - Moderate Differences Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Stat ...

  9. springboot配置redis

    https://www.cnblogs.com/xiaoping1993/p/7761123.html https://www.cnblogs.com/gdpuzxs/p/7222309.html s ...

  10. (zhuan) 自然语言处理中的Attention Model:是什么及为什么

    自然语言处理中的Attention Model:是什么及为什么 2017-07-13 张俊林 待字闺中 要是关注深度学习在自然语言处理方面的研究进展,我相信你一定听说过Attention Model( ...