cocos2dx csb解析细节分析

简介: cocos2dx csb解析细节分析

csb的数据加密

FlatBuffers 是一个开源的、跨平台的、高效的、提供了多种语言接口的序列化工具库。

cocos2d-x\cocos\editor-support\cocostudio\CSParseBinary_generated.h

有时间再深入研究

运行逻辑分析

加载csb的代码

#include "cocostudio/CocoStudio.h"
Node* node = CSLoader::createNode("test.csb");
this->addChild(node);
复制代码

内部逻辑分析:

  • 判断文件名后缀,是csb,进行解析
  • 将csb关联的plist加入到cache中
auto textures = csparsebinary->textures();
    int textureSize = textures->size();
    for (int i = 0; i < textureSize; ++i)
    {
        // 参数是xxx.plist
        SpriteFrameCache::getInstance()->addSpriteFramesWithFile(textures->Get(i)->c_str());
    }
复制代码
  • 序列化节点树
// 根据csb里面的名字,创建对应的NodeReader
Ref* ref = ObjectFactory::getInstance()->createObject(readername); 
NodeReaderProtocol* reader = dynamic_cast<NodeReaderProtocol*>(ref);
// 创建对应的node
reader->createNodeWithFlatBuffers();
// 具体的序列化node逻辑
Ref* ObjectFactory::createObject(const std::string &name)
{
    Ref *o = nullptr;
    do 
    {
        // _typeMap里面存储了序列化映射,通过name找到类的工厂单例
        const TInfo t = _typeMap[name];
        if (t._fun != nullptr)
        {
            o = t._fun();
        }else if (t._func != nullptr)
        {
            o = t._func();
        }
    } while (0);
    return o;
}
typedef cocos2d::Ref* (*Instance)(void);
typedef std::function<cocos2d::Ref* (void)> InstanceFunc;
struct CC_DLL TInfo
{
    TInfo(const std::string& type, Instance ins = nullptr);
    TInfo(const std::string& type, InstanceFunc ins = nullptr);
    TInfo(const TInfo &t);
    TInfo& operator= (const TInfo &t);
    std::string _class;
    Instance _fun;
    InstanceFunc _func;
};
复制代码

ObjectFactory是个单例,在CCSGUIReader的构造函数中进行了类型的注册

#define CREATE_CLASS_WIDGET_READER_INFO(className) \
    cocos2d::ObjectFactory::TInfo(#className, &className::createInstance) 
#define IMPLEMENT_CLASS_NODE_READER_INFO(className) \
cocos2d::Ref* className::createInstance(void) \
{ \
return className::getInstance(); \
} \
cocos2d::ObjectFactory::TInfo className::__Type(#className, &className::createInstance); 
GUIReader::GUIReader():
m_strFilePath("")
{
    ObjectFactory* factoryCreate = ObjectFactory::getInstance();
    factoryCreate->registerType(CREATE_CLASS_WIDGET_READER_INFO(ButtonReader));
}
复制代码

每种类型Reader都继承自NodeReaderProtocol

class NodeReaderProtocol{
    // 纯虚函数,生成最终的node
    virtual Node*  createNodeWithFlatBuffers(opts)=0;
    // 组装属性
    virtual void setPropsWithFlatBuffers()=0;
}
class SpriteReader : public cocos2d::Ref, public NodeReaderProtocol{
    Node* createNodeWithFlatBuffers(){
        Sprite* sprite = Sprite::create();
        setPropsWithFlatBuffers(sprite);
        return sprite;
    }
    void setPropsWithFlatBuffers(Sprite* sprite){
        string path;
        int resourceType;
        switch(resourceType):{
            // 普通的纹理
            case 0:{
                sprite->setTexture(path);
                break;
            }
            // plist合图
            case 1:{
                SpriteFrame* spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName(path);
                sprite->setSpriteFrame(spriteFrame);
                break;
            }
        }
    }
}
复制代码

Sprite接口调用堆栈

create(const std::string& filename)
    initWithFile(const std::string& filename)
        initWithTexture(Texture2D *texture, const Rect& rect, bool rotated)
            setTexture(Texture2D *texture)    
setTexture(const std::string &filename)
    setTexture(Texture2D *texture)     
setSpriteFrame(SpriteFrame *spriteFrame)
    setTexture(Texture2D *texture)    
复制代码

setTexture是最终的归宿



目录
相关文章
|
1月前
|
存储 Java 编译器
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
70 0
|
3月前
|
关系型数据库 MySQL 索引
【MySQL 解析】Hash索引和B+树索引对比分析
【1月更文挑战第11天】【MySQL 解析】Hash索引和B+树索引对比分析
|
3月前
|
移动开发 JSON 监控
网络协议解析:在员工上网监控软件中实现HTTP流量分析
随着企业对员工网络活动的监控需求不断增加,开发一套能够实现HTTP流量分析的网络协议解析系统变得愈发重要。本文将深入探讨如何在员工上网监控软件中实现HTTP流量分析,通过代码示例演示关键步骤。
221 0
|
7月前
|
Java Maven
在Java中,我们可以使用Jsoup库来解析和分析网页
在Java中,我们可以使用Jsoup库来解析和分析网页。以下是一个简单的示例,演示如何使用Jsoup库获取网页的标题
46 1
|
2月前
|
网络协议 物联网 5G
K3S 系列文章 -5G IoT 网关设备 POD 访问报错 DNS 'i/o timeout' 分析与解决
K3S 系列文章 -5G IoT 网关设备 POD 访问报错 DNS 'i/o timeout' 分析与解决
|
1月前
|
网络协议 安全 Linux
DNS 分析神器:dnsenum 保姆级教程(附链接)
DNS 分析神器:dnsenum 保姆级教程(附链接)
56 0
|
1月前
|
分布式计算 NoSQL 大数据
探索数据宇宙:深入解析大数据分析与管理技术
探索数据宇宙:深入解析大数据分析与管理技术
55 1
|
6月前
|
Web App开发 缓存 网络协议
DNS_PROBE_FINISHED_BAD_CONFIG 错误分析
DNS_PROBE_FINISHED_BAD_CONFIG 错误分析
349 0
|
3月前
|
域名解析 存储 缓存
UDP编程-DNS解析器的分析与实现(C语言)
域名系统(英文:Domain Name System,缩写:DNS)的作用是将人类可读的域名 (如,www.example.com) 转换为机器可读的 IP 地址 (如,192.0.2.44)。DNS是一个将域名和IP地址相互映射的一个分布式数据库,DNS使用的端口是53。对于每一级域名长度的限制是 63 个字符,域名总长度 则不能超过 253 个字符。
58 0
|
3月前
|
JSON fastjson 数据库
字符编码导致Rapidjson(腾讯开源的json解析库)到Fastjson(阿里开发的Java json解析库)转换失败的原因分析
最近在客户端的开发的过程中,使用到了RapidJson,公司的开发是客户端和数据库端都由不同的人进行开发,我负责的客户端的逻辑开发(使用c++),开发工具同时使用了VS2017和QT的编译环境,使用QT主要是为了客户端界面开发方便,而使用了VS环境主要是维护公司开发的数据库接口库,这个库的唯一作用就是作为一个中间桥梁,使用Rapidjson将数据库接口的json数据格式解析为结构体数据,从而在客户端界面进行展示,或者接收客户端的数据,使用Rapidjson将其转换为json数据,发送给数据库接口以保存数据使用 。不太明白的可以参考我上一篇文章说明Rapidjson的使用过程-Parse解析数组
48 0

推荐镜像

更多