《我所理解的Cocos2d-x》书评及笔记

       花了两个月陆陆续续地把这本书读完,觉得总体上是一本很不错的书。作者以前参与过cocos引擎的开发,因此是以自己的角度讲解cocos引擎,不同于市面上很多单纯罗列cocos api和代码的书,而是结合OpenGL ES和图形学,对于cocos的讲解深入到引擎实现层面。看完之后,对于cocos引擎的各方面:渲染、纹理、事件分发、物理引擎等都有比较深入的了解。

       另外也有一些不足之处:部分章节编排显得散乱,正如作者所写,他的写作方法是先把相关资料都搜罗在一起,然后再整理目录结构。在讲解渲染的时候,作者本意是想融合OpenGL ES和图形学的知识,但是有的地方讲解不甚清楚,跳跃性较强,需要较好的图形学功底才容易理解。另外,最后几章的结束显得略微草率。



                                        第一章 全新的Cocos2d-x 3.0
  1. cocos2d-x 3.x的几项重大改动:新的渲染系统、统一的事件系统、深度集成的物理系统、C++的命名风格
  2. 基于RenderCommand 的新渲染系统
    1. 可组合(自动批处理),减少绘制次数,提升性能
    2. 可排序:globalZOder > localZOrder > orderOfArrival
    3. Sprite的自动剔除
  3. 统一的事件分发器EventDispatcher,将事件关联到UI元素
  4. cocos 3.x新的数据结构:Vector和Map,push时retain, popBack时release
  5. cocos的内存管理机制:
    1. 继承Ref类的对象都可以被管理,每一帧都会把引用计数为0的对象释放
    2. retain会让计数加1,release会减1
    3. addChild会自动调用retain
    4. create会自动调用autoRelease
  6. C++风格:随着与cocos-iPhone的分离,从OC风格转成C++,CCSprite -> Sprite

                                         第2章 Cocos2d-x架构一瞥
  1. cocos引擎的主要组成:渲染系统、物理系统、事件系统、动画及纹理系统、内存管理及调度器
  2. 内存管理详解:
    1. new会让引用计数加1
    2. create = new + autorelease(添加到AutoreleasePool)
    3. 每一帧对Pool中每个对象,做release(引用计数减1,若减到0则释放)
    4. 对于想提前释放的Ref对象,可以使用自定义AutoreleasePool来即时清理
  3. anchorPoint和position共同决定了元素的位置
  4. UI树和绘制顺序
    1. localZOrder:将UI树结构和绘制顺序绑定
    2. globalZOrder:更灵活
  5. 具体绘制流程
    1. 对globalZOrder不为0的元素按值排序
    2. 对其余元素,按localZOrder。对每个元素做中序遍历:
      1. 遍历左边子节点(所有localZOrder小于0的直接子节点,且按升序排列)
      2. 遍历当前元素
      3. 遍历右边子节点(所有localZOrder大于0的直接子节点,且按升序排列)
  6. autorelease本质是延迟释放,将Pool中所有不在UI树中的元素释放;addChild/removeFromParent  -> Vector的push/popBack -> retain/release
  7. Application的子类AppDelegate定义了游戏生命周期各个阶段的处理:启动后,切后台,切前台
  8. 设计分辨率和实际分辨率
  9. pushScene和replaceScene
  10. 游戏循环详细过程:用户输入 -> 动画 -> 物理模拟 -> 逻辑更新(与物理模拟顺序不一定) -> UI树遍历 -> 渲染 -> 交换缓冲区 -> 自动释放
  11. Scheduler的两种方式:
    1. scheduleUpdate: 可指定priority,性能更好
    2. schedule:可指定interval,repeat,delay
  12. Scheduler的priority根据逻辑而不是对象:
    1. ActionManager:永远最低
    2. PhysicsWorld:0
    3. CustomLogic:自定义
  13. 避免在每帧做复杂的查找或者迭代运算,以免影响性能
  14. Cocos2d-x是一个单线程的引擎,许多异步处理的结果须在主线程完成;如异步纹理加载,回调addImageAsyncCallBack每一帧处理一个纹理,上传到GL内存中(GL命令耗时且必须在主线程中执行)

                                        第3章 OpenGL ES 2.0概览
  1. GPU vs CPU: 并行 vs 串行;衡量GPU性能参数:pps
  2. OpenGL ES渲染管线:
    1. 顶点数组:所有图元primitive的顶点信息
    2. 顶点着色器:计算顶点的坐标、颜色、光照等;顶点坐标变换;提供易变变量
    3. 图元组装:视锥体相关的一些坐标变换
    4. 光栅化:图元转成片段fragment(像素),计算插值
    5. 片段着色器:计算每个片段(像素)的颜色值,实现特殊效果(阴影、描边、闪光
    6. 片段测试:深度测试、模板测试、混合
    7. 帧缓冲:每个像素点的最终信息(颜色、深度、模板值),双buffer切换

                                        第4章 全新的绘制系统
  1. 新的绘制系统的特点:
    1. UI树遍历和绘制分离
    2. 自动批处理和自动裁剪
    3. 自定义绘制命令
  2. 绘制流程
    1. 遍历UI树并生成RenderCommand(根据localZOrder:遍历顺序)
    2. 排序(根据globalZOrder:绘制顺序)
    3. 执行绘制(自动批处理)
  3. RenderCommand分类:
    1. QuadCommand:Sprite和ParticleSystem;自动批处理:相邻的QuadCommand使用同样的纹理
    2. BatchCommand:TextureAtlas,性能更好,但不能参与自动批绘制
    3. GroupCommand:ClippingNode和RenderTexture,包装多个RenderCommand且不参与全局排序
    4. CustomCommand:自定义
  4. 自定义RenderCommand例子:新手教程实现其余区域半透明
  5. 多重采样:抗锯齿

                                        第5章 纹理
  1. 纹理:通过TextImage2D命令定义的像素矩形;纹素
  2. 纹理 + 光栅化采样 -> 片段着色器 
  3. 纹理坐标:uv型(纹理宽高)和st型(最大是1)
  4. 解包:客户端(format和type定义格式的像素数据) -> GL服务端(浮点型RGBA像素值);打包:GL服务端 -> 客户端
  5. PNG、JPG等格式在使用时需先转成cocos支持的指定格式(如RGBA8888)
  6. 纹理缩放
    1. 缩小:多个纹素 -> 一个像素
    2. 放大:一个纹素 -> 多个像素
  7. 多级纹理:通过图像金字塔适配不同分辨率
  8. 纹理压缩:
    1. ios:PVRTC
    2. android:ETC
  9. 纹理对象的管理:
    1. TextureCache
    2. 自己封装ResourceManager
  10. 纹理所占内存的计算 result = width * height * bpp / 8
  11. 纹理使用优化:
    1. 引擎商和硬件商合作定制优化
    2. 提前加载资源
    3. 即使清除不用的资源
    4. 合图
    5. 多级纹理:
      1. 减少内存:只上传所需级别的纹理
      2. 减少计算量:无需加载时再计算
    6. 选择适当的资源格式(RGBA8888,RGBA4444)
    7. 使用压缩纹理

                                        第6章 精灵
  1. 精灵:游戏中的元素,纹理的一部分(关联到Texture2D对象)
  2. 使用精灵的好处:
    1. 自动批绘制
    2. 在一组元素中使用精灵,单个的属性(位置、颜色、缩放等)控制比较灵活
  3. RGBA
    1. R、G、B:三基色通道,0-255,值越大越亮,0表示黑色,255表示最亮,都为255时为白色。
    2. A:Alpha通道,不透明度,0-1,值越大越不透明
  4. 颜色混合:多个图层之间的混合
    1. 混合规则:定义RGBA各向量的加成规则
    2. 深度测试会将较远的位于非透明图元之后的部分丢弃
  5. 颜色叠加:将一个颜色作用在当前图层,如角色受攻击后闪动红色
    1. 颜色叠加可以沿UI树递归传递
    2. 每个Node拥有displayColor = realColor * parentColor / 255
  6. Alpha预乘:
    1. 对于颜色混合的计算:(Rs, Gs, Bs) * As + (Rd, Gd, Bd) * (1 - As),提前乘好Alpha通道的值
    2. 优点:减少计算量,提高性能;缺点:预乘减小了颜色精度
  7. 精灵表:合图,将多个精灵合并在一张图上,通过配置文件(plist)表示每个精灵的位置
    1. frameCache:addSpriteFrames(.plist) 通过plist将spriteFrame加入spriteFrameCache
    2.  同时会将对应的纹理加入textureCache
  8. 精灵动画:都通过配置文件来定义
    1. 帧动画:每帧间隔、关键帧的spriteFrame、来自精灵表
    2. 骨骼动画:
  9. 使用SpriteBatchNode的批绘制
    1. 多个Sprite需放在同一个SpriteBatchNode下
    2. 使用不便,不如自动批绘制
    3. 部分拉伸:Scale9Sprite,底层使用SpriteBatchNode
  10. 自动批绘制的条件(同一次绘制)
    1. 同一张纹理
    2. 相同的BlendFunc设置
    3. 相同的Shader程序
    4. 顺序上相邻

                                        第7、8章 OpenGL ES着色语言和程序
  1. OpenGL ES着色语言可以用来编写着色器程序
  2. 存储限定符
    1. attribute:应用程序传给顶点着色器
    2. uniform:应用程序传给顶点着色器和片段着色器
    3. varying:顶点着色器传给片段着色器,经过插值的易变量
  3. 顶点缓冲对象,顶点数组对象(VAO)
  4. cocos着色器子系统:Node 多<->一 GLProgramState 多<->一 GLProgram
  5. 着色器编辑工具
               
                                         第9、10章 帧缓冲、片段操作
  1. GroupCommand <-> RenderTexture <-> 帧缓冲
  2. 帧缓冲的逻辑缓冲区:
    1. 颜色
    2. 深度
    3. 模板
  3. 片段操作和测试:从片段着色器到帧缓冲
    1. 像素所有权测试
    2. 裁剪测试
    3. 模板测试:裁剪、光照阴影
    4. 深度测试:遮挡

                                   第11章 多分辨率支持
  1. 资源分辨率,设计分辨率,应用分辨率
  2. 5种缩放策略:
    1. EXACT_FIT(非等比)
    2. NO_BORDER
    3. SHOW_ALL
    4. FIXED_HEIGHT
    5. FIXED_WIDTH
  3. 不要写死绝对坐标,而是根据visibleSize自适应
  4. 设置资源缩放因子,程序中提供一套不同分辨率的资源,使用不同的搜索路径

第12章 事件分发
  1. 事件分发模型:订阅者模式,事件分发者,订阅者,好处:解耦合
  2. 订阅时可指定关联Node或优先级,对于多个订阅者,分发的顺序:
    1. 优先级小于0的订阅者
    2. Node绘制的顺序
    3. 优先级大于0的订阅者
  3. 多点触摸 EventListenerTouchAllAtOnce 单点触摸 EventListenerTouchOneByOne
    1. 飞机移动例子:指定关联到fighter,再实现began和move事件的处理函数
  4. setSwallowTouches可以阻止一个触摸点向后面的订阅者继续分发

                                    第13章 字体的故事
  1. 轮廓字的发展:PostScript(Adobe) -> Type 1(Adobe) -> TrueType(Apple, MS) -> FreeType(iOS, Android,cocos支持)
  2. Label的创建
    1. createWithTTF:轮廓字,效率稍低
    2. createWithBMFont:点阵字,通过纹理生成,效率高,但不支持所有中文
  3. Label的特效:阴影,描边,发光

                                    第14章 动画系统
  1. 动画系统基于线性插值
  2. Action,MoveTo, Sequence, Spwan, Repeat
  3. 加速是通过dt * speed(基于时间片而不是帧率)
  4. 收到伤害时闪白的实现:在动画开始时使用自定义的着色器

                                    第15章 碰撞及物理引擎
  1. Box2D和Chipmunk2D(cocos使用)
  2. 碰撞检测基于刚体,刚体有自己的范围

                                    第16、17章 运行时对象数据模型、Genius-x开源框架
  1. Entity Component System:以属性为中心的架构风格
  2. 代表:genius-x,cocos creator

                                   第18章 脚本
  1. lua使用虚拟栈和C传递值
  2. cocos 3.0使用bindings-generator来生成绑定代码,基于tolua++,比原来的tolua更方便

你可能感兴趣的:(读书笔记,cocos2d-x)