概述
本文主要介绍在 Android 原生平台的渲染流程。
渲染初始化
1 | ├── _initRenderer // engine CCGame.js |
1 | _initRenderer () { |
渲染环境的初始化:
1 | // engine core/renderer/index.js |
1 | // jsb-adapter engine/scene/render-flow.js |
绑定 Stage 操作的相关方法:
1 | bool ForwardRenderer::init(DeviceGraphics* device, std::vector<ProgramLib::Template>& programTemplates, Texture2D* defaultTexture, int width, int height) |
绘制流程
关于绘制,大体可以分为两类,图标绘制和字体绘制。
关于字体的绘制流程参考下一节。
绘制过程一个关键的方法就是 CCTexture2D.handleLoadedTexture
,这个是贴图加载事件处理器。用于加载图片或者已经绘制好的字体的纹理数据。
当我们在代码中为 CCTexture2D 设置好 _nativeAsset 后,就开始进行绘制纹理流程:
1 | ├── _nativeAsset.set |
1 | void Texture2D::update(const Options& options) |
1 | void DeviceGraphics::restoreTexture(uint32_t index) |
渲染流程
前面章节我们介绍过,启动流程结束后,引擎会按帧率刷新,调用 CCDirector.mainLoop 来执行渲染流程。
1 | ├── CCDirector.mainLoop // engine core/CCDirector.js |
1 | RenderFlow.render = function (scene) { |
1 | RenderFlow.validateRenderers = function () { |
RenderFlow.registerValidate
的调用流程如下,在各个子组件自行调用:
1 | ├── RenderComponent.markForRender |
1 | void RenderFlow::render(NodeProxy* scene, float deltaTime) |
1 | void BaseRenderer::render(const View& view, const Scene* scene) |
ForwardRenderer::drawItems
用来绘制当前 Stage 的所有显示元素。
1 | void ForwardRenderer::drawItems(const std::vector<StageItem>& items) |
Label 字体绘制渲染流程
下面以 Lable 字体的渲染来了解一下 2d 渲染流程。
1 | ├── CCLabel._applyFontTexture() // engine CCLabel.js |
获取Canvas:
1 | _getAssemblerData () { |
创建buffer
创建一个 Bitmap 绑定 Canvas:
1 | private void recreateBuffer(float w, float h) { |
绘制字体
1 | // CanvasRenderingContext2DImpl.java |
获取纹理数据
绘制完字体后获取数据:
1 | // CCCanvasRenderingContext2D-android.cpp |
getDataRef
方法的实现也在 CanvasRenderingContext2DImpl.java,把 mBitmap 的数据进行复制。
1 |
|
_canvasBufferUpdatedCB 就是前面在 HTMLCanvasElement.getContext()
方法中创建的回调函数,Android端通过C++端把数据回传回来。
更新数据
绘制完成后,就开始通过 handleLoadedTexture 把绘制完成的纹理更新到场景中,等待下个tick周期进行渲染到屏幕上。
推荐文章
基于WebGL的Canvas元素2D绘制加速
Cocos Creator 2.2 的渲染流程(原生渲染):这部分在2.3版本后已经变更,native 渲染部分在 c++ 里面实现。
cocos creator2.1渲染流程分析
https://blog.csdn.net/6346289/article/details/99626005?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2
https://blog.csdn.net/wjf1616/article/details/105250690/