cocos2dx csb解析细节分析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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是最终的归宿



目录
相关文章
|
4月前
|
机器学习/深度学习 数据采集 存储
时间序列预测新突破:深入解析循环神经网络(RNN)在金融数据分析中的应用
【10月更文挑战第7天】时间序列预测是数据科学领域的一个重要课题,特别是在金融行业中。准确的时间序列预测能够帮助投资者做出更明智的决策,比如股票价格预测、汇率变动预测等。近年来,随着深度学习技术的发展,尤其是循环神经网络(Recurrent Neural Networks, RNNs)及其变体如长短期记忆网络(LSTM)和门控循环单元(GRU),在处理时间序列数据方面展现出了巨大的潜力。本文将探讨RNN的基本概念,并通过具体的代码示例展示如何使用这些模型来进行金融数据分析。
584 2
|
3月前
|
数据采集 自然语言处理 搜索推荐
基于qwen2.5的长文本解析、数据预测与趋势分析、代码生成能力赋能esg报告分析
Qwen2.5是一款强大的生成式预训练语言模型,擅长自然语言理解和生成,支持长文本解析、数据预测、代码生成等复杂任务。Qwen-Long作为其变体,专为长上下文场景优化,适用于大型文档处理、知识图谱构建等。Qwen2.5在ESG报告解析、多Agent协作、数学模型生成等方面表现出色,提供灵活且高效的解决方案。
372 49
|
1月前
|
人工智能 供应链 搜索推荐
中国CRM市场深度分析:主流供应商排名与特点解析
随着中国企业数字化转型的深入,CRM(客户关系管理)软件市场迅速发展,形成了多个优秀解决方案提供商。销售易、纷享销客、明源云客、金蝶云之家、简道云、红圈营销和爱客CRM等供应商各具特色。销售易在大型企业市场表现突出,提供全链路营销销售一体化及强大的AI能力;纷享销客以易用性和高性价比著称,适合中小企业;明源云客专注房地产行业,提供全流程解决方案;金蝶云之家与ERP系统深度整合,适合传统制造业;简道云是低代码平台,灵活性高;红圈营销专注零售业,支持全渠道营销;爱客CRM则主打智能营销功能。企业在选择CRM时需综合考虑实施难度、价格定位、技术支持等因素,并结合自身需求进行试用和调研,确保选择最适合
|
3月前
|
测试技术 开发者 Python
使用Python解析和分析源代码
本文介绍了如何使用Python的`ast`模块解析和分析Python源代码,包括安装准备、解析源代码、分析抽象语法树(AST)等步骤,展示了通过自定义`NodeVisitor`类遍历AST并提取信息的方法,为代码质量提升和自动化工具开发提供基础。
150 8
|
2月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
82 4
|
3月前
|
数据采集 存储 自然语言处理
基于Qwen2.5的大规模ESG数据解析与趋势分析多Agent系统设计
2022年中国上市企业ESG报告数据集,涵盖制造、能源、金融、科技等行业,通过Qwen2.5大模型实现报告自动收集、解析、清洗及可视化生成,支持单/多Agent场景,大幅提升ESG数据分析效率与自动化水平。
218 0
|
4月前
|
存储 SQL 分布式计算
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
【10月更文挑战第7天】湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
330 1
|
5月前
|
存储 缓存 自然语言处理
深度解析ElasticSearch:构建高效搜索与分析的基石
【9月更文挑战第8天】在数据爆炸的时代,如何快速、准确地从海量数据中检索出有价值的信息成为了企业面临的重要挑战。ElasticSearch,作为一款基于Lucene的开源分布式搜索和分析引擎,凭借其强大的实时搜索、分析和扩展能力,成为了众多企业的首选。本文将深入解析ElasticSearch的核心原理、架构设计及优化实践,帮助读者全面理解这一强大的工具。
397 7
|
7月前
|
Java Spring 容器
Spring Boot 启动源码解析结合Spring Bean生命周期分析
Spring Boot 启动源码解析结合Spring Bean生命周期分析
134 11
|
7月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
407 1

热门文章

最新文章

推荐镜像

更多