楼主: zhangchangkun
133 0

DragonBones 核心功能分析 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

80%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
30 点
帖子
2
精华
0
在线时间
0 小时
注册时间
2018-12-1
最后登录
2018-12-1

楼主
zhangchangkun 发表于 2025-11-17 18:05:02 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

文章目录

  1. 概述
  2. 骨骼动画工厂 (CCFactory)
  3. 骨骼动画数据管理
  4. 纹理图集管理
  5. 骨架创建
  6. 插槽管理
  7. 骨骼动画显示
  8. 资源清理
  9. 总结
  10. Spine、DragonBones与Spriter 对比
  11. 选择建议

1. 概述

DragonBones 是 Cocos Creator 引擎中用于处理骨骼动画的关键模块。它提供了一套全面的骨骼动画系统,支持复杂的 2D 骨骼动画效果。以下是对 DragonBones 主要功能的详细分析:

2. 骨骼动画工厂 (CCFactory)

CCFactory 是 DragonBones 的核心类,负责创建和管理与骨骼动画相关的所有对象。

class CCFactory : public BaseFactory, public cc::middleware::IMiddleware {
DRAGONBONES_DISALLOW_COPY_AND_ASSIGN(CCFactory)
private:
static DragonBones *_dragonBonesInstance;
static CCFactory *_factory;
public:
static CCFactory *getFactory() {
if (CCFactory::_factory == nullptr) {
CCFactory::_factory = new CCFactory();
}
return CCFactory::_factory;
}
virtual ~CCFactory() {
clear(false);
}
protected:
virtual TextureAtlasData *_buildTextureAtlasData(TextureAtlasData *textureAtlasData, void *textureAtlas) const override;
virtual Armature *_buildArmature(const BuildArmaturePackage &dataPackage) const override;
virtual Slot *_buildSlot(const BuildArmaturePackage &dataPackage, const SlotData *slotData, Armature *armature) const override;
public:
virtual DragonBonesData *loadDragonBonesData(const std::string &filePath, const std::string &name = "", float scale = 1.0f);
virtual TextureAtlasData *loadTextureAtlasData(const std::string &filePath, const std::string &name = "", float scale = 1.0f);
virtual CCArmatureDisplay *buildArmatureDisplay(const std::string &armatureName, const std::string &dragonBonesName = "", const std::string &skinName = "", const std::string &textureAtlasName = "") const;
};

这个类实现了以下主要功能:

  • 提供全局工厂实例,确保单例模式
  • 负责创建和管理骨骼动画所需的所有资源
  • 提供加载和解析骨骼动画数据的方法
  • 创建骨架显示对象
  • 管理纹理图集数据

CCFactory.h:31:90 CCFactory.cpp:31:60 CCFactory.cpp:61:90

3. 骨骼动画数据管理

DragonBones 使用高效的资源管理机制来加载和管理骨骼动画数据。

DragonBonesData *CCFactory::loadDragonBonesData(const std::string &filePath, const std::string &name, float scale) {
if (!name.empty()) {
const auto existedData = getDragonBonesData(name);
if (existedData) {
return existedData;
}
}
const auto fullpath = cc::FileUtils::getInstance()->fullPathForFilename(filePath);
if (cc::FileUtils::getInstance()->isFileExist(filePath)) {
    const auto pos = fullpath.find(".json");
    if (pos != std::string::npos) {
        const auto data = cc::FileUtils::getInstance()->getStringFromFile(filePath);
        return parseDragonBonesData(data.c_str(), name, scale);
    } else {
        cc::Data cocos2dData;
        cc::FileUtils::getInstance()->getContents(fullpath, &cocos2dData);
        uint8_t *binary = cocos2dData.takeBuffer();
        return parseDragonBonesData(reinterpret_cast(binary), name, scale);
    }
}
return nullptr;
}
此函数实现了:
验证是否已加载同名的骨骼数据
支持从 JSON 或二进制文件中读取骨骼数据
自动处理文件路径及其扩展名
返回解析完成的骨骼数据对象
CCFactory.cpp:91:120
4. 纹理图集管理
纹理图集是骨骼动画的关键部分,CCFactory 提供了特定的方法来处理纹理图集数据。
TextureAtlasData *CCFactory::_buildTextureAtlasData(TextureAtlasData *textureAtlasData, void *textureAtlas) const {
    if (textureAtlasData != nullptr) {
        const auto pos = _prevPath.find_last_of("/");
        if (pos != std::string::npos) {
            const auto basePath = _prevPath.substr(0, pos + 1);
            textureAtlasData->imagePath = basePath + textureAtlasData->imagePath;
        }
        if (textureAtlas != nullptr) {
            static_cast(textureAtlasData)->setRenderTexture(static_cast(textureAtlas));
        }
    } else {
        textureAtlasData = BaseObject::borrowObject();
    }
    return textureAtlasData;
}
此函数实现了:
解决纹理图集的路径问题
将纹理图集与实际的渲染纹理相连接
生成新的纹理图集对象
CCFactory.cpp:31:60
5. 骨架创建
骨架是骨骼动画的核心部分,CCFactory 提供了创建骨架的方法。
Armature *CCFactory::_buildArmature(const BuildArmaturePackage &dataPackage) const {
    const auto armature = BaseObject::borrowObject();
    const auto armatureDisplay = CCArmatureDisplay::create();
    armatureDisplay->addRef();
    armature->init(
        dataPackage.armature,
        armatureDisplay, armatureDisplay, _dragonBones);
    return armature;
}
此函数实现了:
生成骨架对象
创建骨架显示对象
初始化骨架对象
CCFactory.cpp:61:90
6. 插槽管理
插槽是连接骨骼与显示对象的中介,CCFactory 提供了创建插槽的方法。
    
Slot *CCFactory::_buildSlot(const BuildArmaturePackage &dataPackage, const SlotData *slotData, Armature *armature) const {
    const auto slot = BaseObject::borrowObject<CCSlot>();
    slot->init(
        slotData, armature,
        slot, slot);
    return slot;
}
这个方法实现了:
- 创建插槽对象
- 初始化插槽对象
CCFactory.cpp:61:90

7. 骨骼动画展示
CCArmatureDisplay 是骨骼动画的展示容器,负责渲染骨骼动画。
CCArmatureDisplay *CCFactory::buildArmatureDisplay(const std::string &armatureName, const std::string &dragonBonesName, const std::string &skinName, const std::string &textureAtlasName) const {
    const auto armature = buildArmature(armatureName, dragonBonesName, skinName, textureAtlasName);
    if (armature != nullptr) {
        return static_cast<CCArmatureDisplay *>(armature->getDisplay());
    }
    return nullptr;
}
这个方法实现了:
- 创建骨架
- 获取骨架的展示对象
CCFactory.cpp:151:180

8. 资源清理
为了防止内存泄露,CCFactory 提供了资源清理方法。
void CCFactory::removeDragonBonesDataByUUID(const std::string &uuid, bool disposeData) {
    for (auto it = _dragonBonesDataMap.begin(); it != _dragonBonesDataMap.end();) {
        if (it->first.find(uuid) != std::string::npos) {
            if (disposeData) {
                it->second->returnToPool();
            }
            it = _dragonBonesDataMap.erase(it);
        } else {
            it++;
        }
    }
}
这个方法实现了:
- 根据 UUID 移除骨骼数据
- 可选地释放骨骼数据占用的资源
CCFactory.cpp:151:180

9. 总结
DragonBones 是 Cocos Creator 引擎中功能强大的骨骼动画系统,其核心功能可以总结为以下几个方面:
- 工厂模式
  - 通过 CCFactory 类实现单例模式,统一管理所有骨骼动画资源的创建和生命周期。
- 资源管理
  - 支持从 JSON 或二进制文件加载骨骼动画数据,提供高效的资源缓存和清理机制。
- 骨骼系统
  - 实现完整的骨骼结构,支持复杂的骨骼动画效果,包括父子骨骼关系、旋转、缩放等变换。
- 插槽系统
  - 通过插槽机制连接骨骼和展示对象,实现灵活的动画控制。
- 纹理图集
  - 支持纹理图集管理,优化渲染性能,减少 GPU 调用次数。
- 动画播放
  - 提供完整的动画播放功能,包括播放、暂停、停止等控制,支持多种动画混合模式。
- 展示容器
  - 提供 CCArmatureDisplay 作为骨骼动画的展示容器,集成到 Cocos Creator 的场景系统中。
- 跨平台支持
  - 作为 Cocos Creator 的一部分,DragonBones 支持所有 Cocos Creator 支持的平台,包括 iOS、Android、Windows、Mac、Web 等。
这些核心功能共同构成了一个强大而灵活的骨骼动画系统,使开发者能够创建高质量的 2D 动画效果,同时保持良好的性能和跨平台兼容性。

10. Spine、DragonBones与Spriter 对比
在 Cocos Creator 中集成骨骼动画时,
Spine
和
DragonBones
都有很好的官方支持,而
Spriter
的集成度相对较弱。下面这个表格清晰地展示了它们的核心差异,可以帮助你快速了解和选择。
特性维度
Spine ????
DragonBones ????
Spriter
官方支持
官方全面支持,持续更新
官方全面支持
无官方原生支持
,需第三方或自研方案
引擎集成
组件完善,功能同步及时
组件完善
社区实现的运行库,可能不稳定且功能不全
性能表现
性能优异,支持
    

动画缓存

合批
优化
表现优异,同样支持
动画缓存

合批
依赖于社区提供的运行库,性能优化和可维护性有待验证

开发便捷
脚本API多样,支持挂点、顶点效果、换装等功能
脚本API全面,支持换装等操作
需自行处理资源加载和动画管理,开发投入较大

学习与生态
信息丰富,社区活跃,有官方技术支持
文档和社区资源充沛
相关资料和解决办法较少

???? 选择建议
依据你的项目需求和背景,可参考以下建议作出决策:
追求卓越的动画效果、性能和产品化水平,且预算充足 ????
对于有较高性能需求或计划发布
中型到大型商业游戏
的项目,
Spine
是首选。它能够提供更加平滑的动画体验,并在Cocos Creator中不断获得功能升级,比如对Spine 4.2版本和物理效果的支持。Spine在Cocos Creator中的兼容性较好。

追求高效比、快速原型设计或团队熟悉Flash工作流程 ????

DragonBones
的免费和开源特点对于
独立开发者、小型团队或预算紧张
的项目非常吸引人。如果有Flash制作经验,学习难度也会相对较小。它特别适合用于创建
UI动画、特效和NPC
等。

已有Spriter动画资源或进行特定技术探究 ????
除非你已拥有大量的Spriter资源需要重复利用,或者是为了技术研究的目的,在新的项目中选择Spriter需要谨慎考虑其技术风险和额外的开发成本。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Dragon bones 功能分析 ones Bone

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-21 11:36