基本信息
编辑推荐
本书面向中、高级开发者,可作为初级开发者进阶的教程,也可作为高校游戏引擎架构及图形学相关专业的参考教材。
内容简介
计算机书籍
《我所理解的Cocos2d-x》针对最新的 Cocos2d-x 3.x版本,介绍了Coco2d-x游戏引擎的基本架构、渲染机制,以及各个子模块的功能和原理,并结合OpenGL ES图形渲染管线,深入探讨了游戏开发中涉及的相关图形学的知识,内容包括:Cocos2d-x的基本架构及渲染机制、纹理相关的知识、OpenGL ES 2.0渲染管线、计算机字体的绘制、多分辨率支持、事件分发、碰撞与物理引擎、游戏对象模型架构、Genius-x开源框架、脚本在游戏引擎中的架构等。《我所理解的Cocos2d-x》偏重讲解每个知识模块的概念及原理,使读者能够透过现象看到其背后的工作机制,所以本书在内容组织上并不是围绕Cocos2d-x的接口使用来展开,而是按照通用游戏引擎架构及图形学的内容进行组织。
《我所理解的Cocos2d-x》面向中、高级开发者,可作为初级开发者进阶的教程,也可作为高校游戏引擎架构及图形学相关专业的参考教材。
作译者
目录
第1章 全新的Cocos2d-x 3.0 1
1.1 Cocos2d-x 3.0的历史意义 1
1.1.1 回归C++风格 2
1.1.2 更灵活的渲染架构 2
1.1.3 更自由的发展 2
1.2 Cocos2d-x 3.0的新特性 3
1.2.1 使用C++风格 3
1.2.2 跨平台的Label 6
1.2.3 新的渲染系统 6
1.2.4 统一的消息分发 8
1.2.5 物理引擎集成 9
1.2.6 新的数据结构 10
1.2.7 其他 14
1.3 Cocos2d-x引擎展望 15
1.3.1 3D 16
1.3.2 Cocos Code IDE 16
1.4 本章小结 17
第2章 Cocos2d-x架构一瞥 19
2.1 Cocos2d-x引擎系统总览 19
前言
开源是我认为软件最富魅力的部分,它给予我们阅读和修改源代码的自由。开源对人类和科技进步的贡献是巨大的,如今,大多数软件系统都有着各种各样开源软件的影子。开源代码对技术人员的成长有着难以估量的价值,例如,没有开源的Cocos2d-x,我就难以写出本书中的很多内容。
本书定位为一本进阶的书籍,它着重于讲述Cocos2d-x引擎各个功能及组件背后的实现原理。因此,本书并没有严格按照Cocos2d-x引擎本身的功能展开描述,而是从这些功能中抽象出一些设计或者架构层面的内容进行讨论。例如本书没有分别讲述精灵、地图、粒子特效等的接口使用,而是从纹理、渲染方式等多个方面来讲述这些元素背后的工作机制;而OpenGL ES、物理引擎和脚本等内容也几乎是可以脱离于Cocos2d-x进行学习和理解的。
这就是本书标题的来源,也是本书与同类书籍在内容编排上的最大不同。我希望写一本书,它可以让读者站在一个系统性的高度对游戏引擎的一些架构设计及实现进行理解,从而不但提升和扩充自己的知识结构,更能够在实际开发中去灵活解决各个层面的技术问题。本书同时追求系统性和实践性的平衡,例如对于纹理部分,除了总结纹理相关的所有知识,也通过一些示例来演示它在各个层面的具体使用。
本书共分18章。
第1~4章介绍了Cocos2d-x引擎的基本架构及新的绘制系统。这部分内容包括:Cocos2d-x的内存管理机制,UI树的遍历及结构,应用程序的生命周期,游戏循环的各个阶段,以及在Cocos2d-x中驱动各个子系统进行逻辑更新的机制和工作原理。这部分也介绍了Cocos2d-x 3.x新的数据结构,并详细描述了新的渲染系统。总之,在这一部分,读者可以对Cocos2d-x的基本架构有比较系统的了解。
第5~10章围绕OpenGL ES图形渲染管线进行介绍。这部分从纹理讲起,详细讲述了纹理的存储格式、传输、缩放、压缩及多重纹理等相关知识;第8章详细讲述了顶点数组的结构、顶点属性的绑定及传输、着色器程序的编译及链接,以及Cocos2d-x新的着色器子系统,并举例在Cocos2d-x中使用着色器的流程和怎样使用多重纹理。这部分也对顶点着色器和片段着色器两个阶段在图形渲染管线中的作用进行了详细描述。
第9、10章讲述了OpenGL ES图形渲染管线的最后两个阶段:帧缓冲和片段操作,并以Cocos2d-x中对这两个阶段的应用RenderTexture和ClippingNode为例进行讲解。这样,读者将对整个渲染管线的每一个阶段都能有所了解,并且能够结合Cocos2d-x中的使用去思考每一个阶段的意义和作用,从而对图形渲染管线有更深刻的了解。这也是本书最具特色的部分。
第10~15章讲述了Cocos2d-x的一些子系统,包括事件分发、多分辨率支持、动画系统及物理引擎整合。其中物理引擎部分也是我比较喜欢的章节,这部分讲述了一些通用的物理引擎的架构及其使用,以及怎样和游戏引擎进行整合。
第16~18章探讨应该怎样去设计和管理游戏世界中的对象。第16章讲述了常见的对象模型、组件模型、属性模型之间的概念、区别及优缺点;第17章则以属性模型为例,讲述了一个游戏对象模型应该怎样设计;第18章探讨了时下最流行的脚本相关的内容,但是与仅仅讨论脚本使用不同的是,我们站在一个游戏引擎的高度去讨论脚本的架构,这样读者甚至能设计自己的脚本模型。这一部分内容具有对前端架构设计的高度总结性与实践性,不管是对经验丰富的读者还是初学者,相信都具有一定的启发性。
另外,本书在写作之初并没有构建出整本书的内容结构,在写前面的章节时我甚至不知道最后几章的内容和结构会是怎样的。在开始写每一章的时候,我不会首先去给自己描绘一个目录结构,而是首先把所有相关的内容列出来,如果之中有我不熟悉的内容,或者有Cocos2d-x以外的一些知识,我则会首先停下写作去把这些内容整理出来。例如关于ECS部分的内容就是基于Cocos2d-x社区的一些讨论,我花了很多时间去学习和理解。当最后所有相关的内容整理为一个列表时,我就知道该怎么去写作这部分的内容。因此,在这本书的目录结构中,读者找不到任何同类书籍类似的内容结构,因为这完全是基于个人的理解及知识结构体系去写作的一本书。
所以,对我而言这本书还有一个有意义的目标,我希望透过这样的方式去探讨一种系统性的学习方法。当你开始学习某个知识点时,不要把自己限定在该知识点处,而是首先从该知识点进行适当的扩展,列出该知识点相关的所有内容,再逐个深入学习和研究细节,最后反过来整理该知识点的结构体系。这样不仅能够更深入地学习该知识点,还能够延伸知识的广度,所以本书有大量超出Cocos2d-x以外的内容,这些内容又是与Cocos2d-x紧密相关的。希望读者在阅读过程中能够感受到这样一种写作风格和方法。
本书是一本进阶类书籍,阅读本书,你需要对Cocos2d-x和C++有基本的了解。如果你是一名新手,可以首先阅读同类书籍中相对比较入门的书籍,否则本书的一些章节可能会给你造成一定的困惑。
学习知识最好的方法永远是多读几遍,书中关于OpenGL ES和游戏对象模型部分的内容可能需要多读几次才能更加深入地理解相关的概念。当然,如果你在阅读过程中遇到什么障碍,随时可以通过电子邮件或者我的博客等多种方式和我进行探讨。
本书可以作为Cocos2d-x开发学习的书籍,也可以作为单独的OpenGL ES相关的教材,游戏对象模型部分的内容也可以作为设计游戏引擎架构的参考资料。本书也可以作为高校游戏及图形学相关专业的参考教程。
最后,由于个人经验有限、思维有限,书中难免会出现一些错误和疏漏。真诚地希望读者可以将这些错误的地方反馈给出版社,我们会及时地列出勘误,以帮助更多的读者更好地学习。
秦春林
2014年7月25日
媒体评论
Cocos2d-x 3.0版本的这一次飞跃主要实现了三大优化:一是新的渲染器,可创建渲染队列,可简单地实现批量渲染,跨平台也非常容易;二是新修改过的API,将语言用法改为C++程序员更习惯的使用方式,稳定性与可读性得到提升;三是性能再次提升优化,利用自动裁剪、自动批处理技术,性能得到很大提升,兼容性方面在中国安卓平台上也做到非常好用。
在版本跟进方面,秦春林的速度是最快的。现在你看到的这本《我所理解的Cocos2d-x》是国内第一本直接从Cocos2d-x 3.0版本入手的书籍,直接从更高的起点起步,可以说是国内最新。
本书由浅入深,共分18个章节,从Cocos2d-x 3.0及架构开始,逐块剖析引擎的各个特性,同时搭配OpenGL ES的相关使用。在最后一章,秦春林还介绍了他自己基于组件架构模型写的开源框架,可以说是一本很好的Cocos2d-x高阶书籍,值得一读。
另外,秦春林的团队“魂世界”采用Cocos2d-x开发的作品《天降》在今年也取得了非常好的成绩,已被乐逗游戏以2000万元的高价代理,是一款很酷的电竞手游。我本人非常期待,希望这款Cocos2d-x游戏能够取得更好的成绩。
最后,祝秦春林的书本大卖、游戏火爆,也祝更多的团队能够从Cocos引擎中受益。
——Cocos2d-x游戏引擎作者 王哲
书摘
到目前为止,我们讨论的所有内容都可以称之为低阶引擎系统,例如Renderer如何将网格绘制到屏幕上,纹理如何被使用,字体如何被绘制,如何从人体学接口设备获取玩家输入信息,如何处理物体的碰撞,以及如何对物体执行动画等。这些几乎都是和游戏性无关的一些基础功能。
当开始设计游戏的时候,开发者面对的往往是一个更上层的,可以称之为游戏性(Gameplay)基础系统的高阶引擎系统,例如怎样表示游戏中的对象,怎样组织它们的行为和状态,设计师怎样通过数据驱动来快速修改关卡及游戏配置,怎样高效有序地组织游戏对象之间的逻辑更新等。这些笔者称之为游戏性架构(Gameplay Architecture),或者很多开发者称之为游戏架构。理论上,游戏性架构的一些理论和实践甚至可以和游戏引擎无关。
当然,游戏性架构其实涉及很多内容,例如它可以包括运行时游戏对象模型、关卡及串流、实时更新游戏对象模型、事件分发及脚本系统等。本章将会聚焦于运行时游戏对象模型,讲述常见的几种游戏对象设计的概念、方式及优缺点。
16.1 概述
在所有游戏性架构相关的内容中,运行时游戏对象模型可能是最复杂的系统,并且不同的游戏引擎呈现出的差异极大。例如Unity3D提供的组件模型,虚幻引擎提供的面向对象继承的模型,其他一些游戏例如《末日危城(Dungeon Siege)》则使用一种不同于两者的基于数据驱动的游戏对象模型。
这些不同的游戏对象模型之间呈现出很大的设计思维及使用上的差异,但是它们往往都提供或者必须具备一些通用的功能,这些包括但不限于:
(1)管理游戏对象的创建及销毁。游戏中经常会动态创建各种游戏对象,例如一个塔防游戏会定时出现一些小怪物,子弹在撞击到目标时立即被销毁等。许多游戏引擎都提供一种统一的动态创建、销毁游戏对象的方式,并管理游戏对象的内存及资源,例如第17章即将讲述的Genius-x框架中使用createEntity()、removeEntity(entity)来动态创建和销毁一个游戏对象。但是在Cocos2d-x中却不是通过统一的方式创建和销毁游戏对象,它使用每个Node子类自己的构造函数来创建,并使用一种特殊的方式管理内存(参见第2章)。
(2)联系底层游戏引擎。每个游戏对象要能够通过某种方式访问底层的游戏引擎系统,例如能够渲染三角形网格、执行碰撞检测,对角色执行动画等。在Unity3D引擎中,每个游戏对象(GameObject)可以通过添加一个与底层引擎功能相关的组件(Componment)来访问底层引擎系统。Cocos2d-x的Node类则直接集成了物理模拟、动画、实时逻辑更新等接口。
(3)实时模拟对象行为。游戏是一个高度实时的系统,游戏对象的状态、行为在每一帧都可能会随着时间发生变化,这需要一套高效的游戏对象更新机制。对象可能需要以特定的逻辑次序进行更新。此外,除了逻辑次序,游戏对象之间还可能存在依赖关系,需要按照一定的次序更新(关于游戏对象更新的次序会在本章后面讲述)。
(4)定义新游戏对象类型。在开发过程中,随着游戏需求的改变和演进,游戏对象模型必须有足够的弹性,可以容易地加入新的对象类型。理想情况下,新的游戏类型应可以完全用数据驱动的方式定义,但是在实际情况中,大部分新增游戏类型都需要程序员的参与。在Genius-x框架中,新的不同行为的组合类型可以通过修改数据文件来实现,而新的行为则可以通过脚本来实现,然后修改数据文件来添加新的行为。
(5)唯一的对象标识符。游戏世界可能会包含成百上千的游戏对象,在运行时必须能够识别和找到想要的对象,这意味着每种对象需要有某种唯一标识符。例如在Cocos2d-x 中可以通过给一个Node指定一个字符串名称,然后通过字符串标识符查找一个游戏对象。
(6)游戏对象查询。除了上面按游戏唯一标识符查询游戏对象,游戏性系统还需要一些更高级的查询方式,例如找到某种类型的游戏对象,或者某个范围的敌人等。在面向组件或者属性的架构中,游戏对象是以组件/属性为单位存储的,很容易查找具有某个属性类型的游戏对象组合,并且这种查找游戏对象的方式对数据驱动更友好,笔者称之为面向类型编程。
除了上述提到的这些,运行时游戏对象模型还包括有限状态机,用于同一个网络内的对象复制、对象序列化和持久性存档等。