外观
Lesson 001|为什么 Cocos Creator 开发者必须理解 C++
Tags: #Creator2.x #Engine #C++ #JSBDifficulty: ⭐☆☆☆☆
🎯 本课目标
- 建立 Creator 2.x 整体架构认知
- 理解为什么后续课程需要学习 C++
- 明确未来两年的学习主线
💡 为什么需要学习 C++
很多 Creator 开发者都会认为:
我写的是 TypeScript,所以不需要懂 C++。
这是一个很常见的误区。
Creator 2.x 不是“TypeScript 外面包着一层 C++”这么简单。业务脚本、Creator JavaScript Engine、资源和渲染准备、JSB、Cocos2d-x 与平台 API 各自承担一部分职责,而且 Web 与 Native 的调用路径并不相同。
学习 C++ 的目的不是为了背语法,也不是为了把每个 Creator API 都翻译成 C++,而是为了理解以下边界:
- 哪些逻辑只发生在 JavaScript/TypeScript 层。
- 哪些能力会跨过 JSB 进入 Native。
- C++ 对象由谁拥有、在哪个线程使用、何时释放。
- Web 正常而 Native 异常时,应该从哪一层继续排查。
🧠 Creator 2.x 的两条运行路径
text
业务 TypeScript / JavaScript
↓
Creator Engine / Runtime
├── Web:Browser API / WebGL
└── Native:JS Engine → JSB/Binding → C++/Platform API
↓
Graphics / OS / Device稳定结论是:业务 API 会先改变运行时状态,渲染、资源、音频、文件和平台能力再沿各自路径工作。不能看到一个 Creator API,就预设它必然跨 JSB。
🔍 核心概念
什么是 JSB?
JSB(JavaScript Binding)是 JS 与 C++ 之间的桥梁。
JSB 负责函数注册、参数和返回值转换、JS/C++ 对象映射、回调以及生命周期协调。它只存在于需要连接 JavaScript 与 Native C++ 的路径中。
例如一个原生文件 API 可能经过:
ts
jsb.fileUtils.getWritablePath();而 this.node.x = 100 是否进入 C++、何时进入、进入几次,必须看 Creator 小版本、平台和当前实现。第一课只建立分层,不提前给所有 API 下同一个结论。
💼 工作中的真实案例:Web 正常,Native 保存失败
ts
const path = jsb.fileUtils.getWritablePath();
cc.log('writable path:', path);Web 预览没有 jsb.fileUtils,Native 又受到沙盒路径、权限和线程限制。正确的判断不是“TypeScript 没问题,所以引擎有 Bug”,而是先画出:
text
业务需求:保存文件
→ 运行环境:Web 还是 Native
→ 能力入口:Browser API 还是 jsb.fileUtils
→ 平台路径和权限
→ 回调线程与页面生命周期再例如大量节点属性写入可能慢,但不能直接归因为“JSB 次数多”。需要先确认当前平台调用链,再区分脚本循环、脏标记、Transform、RenderData 和提交成本。
🧭 如何使用这张架构图排查问题
遇到问题时依次问:
text
1. 问题能否在 Web 和 Native 都复现?
2. 当前 API 属于业务状态、引擎系统还是平台能力?
3. 是否跨 JSB?参数是否复制或转换?
4. Native 对象和 JS 对象谁拥有谁?
5. 回调在哪个线程,返回时页面是否仍有效?⚠️ 常见误区
- Creator 就只有 JS。
- 学 C++ 就是为了转服务器。
- API 用得熟就是理解引擎。
🎤 面试会怎么问
- Creator2.x 底层为什么还是 C++?
- JSB 是什么?
- 为什么减少 JSB 调用可以优化性能?
📝 今日练习
题目一
为什么不能说“所有 Creator API 最终都会通过 JSB 调用 C++”?
题目二
一个功能 Web 正常、Native 失败,第一轮应该收集哪些信息?
参考答案
- Web 路径没有 JSB,不同 Creator 模块也可能分别由 JS、Binding、C++ 或平台 API 实现;必须结合版本和平台确认调用链。
- 至少收集 Creator 完整版本、平台、构建模式、公开 API、错误日志、Native 堆栈或错误码、文件/权限条件以及对象和回调生命周期。
✅ 本课总结
真正的高级开发,不是 API 记得多,也不是凡事都归因于 C++,而是知道每一层负责什么、边界在哪里、证据应该从哪一层取得。
下一课: this.node.x = 100 到底发生了什么?
