COCOS2DX引擎深入三———渲染结构(3.0)
来源:互联网 发布:淘宝 各地博物馆 编辑:程序博客网 时间:2024/05/18 17:57
3.0之前cocos2dx渲染机制上存在着一些弊端:不易扩展,不易针对绘制进行优化。
不易扩展:3.0之前每个元素的绘制逻辑全在元素元素内部的draw()方法里。绘制顺序紧密的依赖于UI树。导致无法在多层级之间调整绘制顺序。
不易针对绘制进行优化:各个绘制都分布在每个元素内部,不利于针对绘制进行优化。
3.0新的绘制系统将绘制部分从UI树的遍历中分离出来了。使得绘制系统更灵活,更易于扩展。
新的绘制系统是怎么将绘制部分分离出来的?
3.0版本中多了一个RanderCommand类。另外draw接口也变了
virtual void draw(Renderer *renderer, const Mat4& transform, uint32_t flags);
Node类的draw是空实现,再看看sprite类里的draw方法。
void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags){ // 检查是否在边界内
_insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds; if(_insideBounds) { _quadCommand.init(_globalZOrder, _texture->getName(), getGLProgramState(), _blendFunc, &_quad, 1, transform); renderer->addCommand(&_quadCommand);#if CC_SPRITE_DEBUG_DRAW _customDebugDrawCommand.init(_globalZOrder); _customDebugDrawCommand.func = CC_CALLBACK_0(Sprite::drawDebugData, this); renderer->addCommand(&_customDebugDrawCommand);#endif //CC_SPRITE_DEBUG_DRAW }}
draw里初始化了一条QuadCommand,他继承于RanderCommand。之后再将这条命令加入到Render中。并没有执行绘制相关操作。
在看到Director类的drawScene()方法
// draw the scene if (_runningScene) { _runningScene->visit(_renderer, Mat4::IDENTITY, false); _eventDispatcher->dispatchEvent(_eventAfterVisit); } // draw the notifications node if (_notificationNode) { _notificationNode->visit(_renderer, Mat4::IDENTITY, false); } if (_displayStats) { showStats(); } _renderer->render(); _eventDispatcher->dispatchEvent(_eventAfterDraw);
当调用完节点的visit (visit里面会调用节点的draw方法)后,就调用了Render的render方法。到这里就可以看出,其实draw里的绘制操作,统一的都以命令的形式统一的加入到render里面,有render来统一处理。于是绘制部分的处理,就从UI树的遍历里分离了出来,这样如果想针对绘制进行优化,那么直接操作几个绘制类就行了。例如cocos2dx会对QuadCommand执行自动批绘制。
在看到Render的render方法里具体做了什么。
void Renderer::render(){ //Uncomment this once everything is rendered by new renderer //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //TODO setup camera or MVP _isRendering = true; if (_glViewAssigned) { // cleanup _drawnBatches = _drawnVertices = 0; //Process render commands //1. Sort render commands based on ID for (auto &renderqueue : _renderGroups) { renderqueue.sort(); } visitRenderQueue(_renderGroups[0]); flush(); } clean(); _isRendering = false;}
首先对命令进行了排序,之后才是对节点进行绘制工作。
- COCOS2DX引擎深入三———渲染结构(3.0)
- Cocos2dx引擎笔记——渲染和动画
- 自己动手写cocos2dx游戏引擎(五)——渲染对象
- COCOS2DX引擎深入一————调度原理
- COCOS2DX引擎深入二————内存管理
- 自己动手写cocos2dx游戏引擎(三)——Director对象
- COCOS2DX引擎深入四————图片的异步加载
- cocos2dx(1)引擎基本结构
- cocos2dx引擎基本结构
- VUE —— 结构渲染
- 存储引擎揭秘:基本结构之三——区
- Cocos2dx技术(三)——cocos2dx基本概念(一)
- Cocos2dx技术(三)——cocos2dx基本概念(二)
- 浏览器原理(二)——渲染引擎
- Python爬虫——实战三:爬取苏宁易购的商品价格(渲染引擎方法)
- 虚幻引擎3 —— 渲染特性
- 了解浏览器如何工作—渲染引擎
- 了解浏览器如何工作—渲染引擎
- 人品计算器
- ubuntu openssh-server老版本安装
- JS简单浮动碰撞效果
- qt设置窗口在桌面居中显示
- 伸展树(插入区间,修改区间,区间置数,区间反转,区间求和,连续最大和)BZOJ1500
- COCOS2DX引擎深入三———渲染结构(3.0)
- response细节
- [蓝桥杯][Java] 有趣儿的平方数
- 设计模式之结构型模式
- 使用log4j把日志记录到不同文件
- 【python学习.第五周任务】
- 【toj1312】The Game
- 第十四周OJ
- 字符串-05. 字符串循环左移(20)(部分对)