Cocos2d-x基础知识相关

1.Cocos2dx内存管理机制
智能指针:C++中三种存储方式:自动、静态、动态存储。自动能正确释放,动态需手动释放,智能指针将动态分配的内存单元与自动变量关联(unique_ptr:不能与其他智能指针共享所指对象内存;shared_ptr:可共享,采用引用计数,计数为0则释放关联对象堆内存;week_ptr:检测shared_ptr指针有效性)。
但cocos中不采用智能指针:1)性能损失大:shared_ptr采用互斥锁保证多线程访问时引用计数的准确;2) 使用不够自然。其采用的方式是:在new 或者 addChild操作时通过retain增加引用计数,同时在构造函数内部调用autoRelease,将该对象加入AutoReleasePool,每帧结束都会释放池内对象,这一做法使得只关心对象的创建和使用,无需考虑其释放过程。
有些对象一帧的生命周期未免过长,此时可通过PoolManager创建新的AutoReleasePool并加入栈,比如在函数开头定义一个自动变量AutoReleasePool,后面的所有节点都将放至这一个pool,函数执行结束Pool被析构,其中所有的节点也将执行release操作。
2.节点坐标系统
世界坐标系:与OpenGl坐标系统保持一致,右手坐标系,左下角为原点;本地坐标系:节点相对于父级节点的相对坐标。
绘制时不直接计算世界坐标,而是将相对坐标以及其模式视图变换矩阵传输至渲染管线,然后在管线中执行坐标转换。
3.Cocos应用程序架构
生命周期:创建初始化Directory->创建GLView->创建Scene并交给Directory绘制出来。
游戏帧循环:首先检查用户输入,如有输入则处理并分发输入事件;执行动画更新;处理物理模拟碰撞;执行程序自定义的逻辑更新(程序大部分逻辑算法在这里执行);UI树遍历(计算每个节点坐标变换矩阵并基于逻辑深度进行排序以生成正确的绘制顺序,每个节点遍历后均将绘制命令发送至绘制栈);基于绘制栈存储的绘制命令开始执行绘制;交换缓冲区(将当前帧内容显示出来);PoolManager将所有autoRelease的节点对象release掉。

纹理异步加载:纹理加载是个耗时的过程,加载完成后需将纹理传至GL内存中,这一过程必须在主线程中执行。如果在一帧中有多幅图片同时需加载,必会造成游戏卡顿。Cocos利用异步加载回调解决这个问题:向TextureCache发起addImageAsync请求,该请求完成三件事:1) 将待加载资源及其加载完成需要执行的回调函数包装成特性的结构体存在请求队列中;2) 开启一个新线程用于独立解析请求队列中的结构体,解析结果将存至结果队列中;3)TextureCache开启一个schedule执行addImageAsyncCallBack(如果当前没开启的话),该函数取出新线程的结果队列中每一个加载结果并执行回调操作。

4.OpenGL ES 渲染管线
客户端通过ES接口将顶点、着色器程序、纹理及其他GL参数传入GL服务器,然后在客户端调用绘制命令,GL便会对输入的图元逐一进行执行渲染管线的每个阶段,然后将像素颜色值写至帧缓冲,并最终显示出来。其中顶点着色器与片段着色器为可编程部分。

顶点数组:每个图元由一个或多个顶点组成(如一个三角图元包含三个顶点),顶点包含了顶点坐标、颜色、法向量及纹理坐标等。
顶点着色器:顶点着色器可使用顶点数据计算该定点的坐标、颜色、光照、纹理坐标等,其最重要任务是进行顶点坐标变换(对本地坐标执行模型试图变换以将本地坐标转换至裁剪坐标系)。
图元装配:经顶点着色器处理后,各顶点按照绘制命令中的图元类型参数及顶点索引数组(定义了顶点序列)被组装成一个个图元,过程如下。

光栅化:类似于栅格化,将图元转换为一系列的片段。
片段着色器:可编程的片段着色器是实现一些高级特效(纹理贴图、光照、阴影等)的基础,其主要作用是计算片段颜色值。
5.Cocos绘制系统
分离UI元素的遍历与绘制逻辑:执行Node的draw函数时不执行任何GL绘制命令而仅向render中发送一个renderCommand,render会将renderCommand放入一个栈中,等场景所有UI遍历完成render才开始执行栈中的renderCommand。
绘制命令排序:在执行绘制命令前会先对命令进行排序,其顺序首先由globalZorder决定,然后才是按照遍历顺序
自动批绘制:对于一般renderCommand按照顺序执行,对于sprite使用的QuadCommand,若两个command相邻且使用相同纹理、着色器等,render将会将两者组合成一个command,这一自动批绘制减少了绘制次数,提升了绘制性能。

猜你喜欢

转载自blog.csdn.net/XIANG__jiangsu/article/details/80929562
今日推荐