初探Egret3D——白鹭引擎架构师王泽演讲实录
10月19日,白鹭开发者沙龙武汉站在武汉未来梦境空间举办。白鹭引擎首席架构师王泽在现场以《初探Egret3D》为题为到场的开发者介绍了Egret3D引擎,我们整理了现场速记分享给大家,详见下文:
王泽:各位开发者下午好,今天我为大家分享的题目是《初探Egret 3D》。这是我们白鹭引擎第一次在开发者沙龙中用一个完整的演讲主题中介绍 Egret3D。首先我们通过这张整体架构图来看,Egret3D 包含了四大部分,分别是运行时,编辑器,Unity3D导出插件以及文档中心。接下来的演讲中我会针对这四项内容给各位开发者做一个完整的介绍。
第一部分是运行时。他指的是游戏在运行时所依赖的JavaScript 逻辑代码,也就是开发者开发的游戏最终运行依赖于底层白鹭引擎的 Library。这部分内容是完全开源的,每一位开发者都可以通过 GitHub 或者白鹭引擎的工具来下载,我们会以每月更新一次的节奏对运行时逻辑进行更新。目前版本号是1.2。
第二部分是编辑器。白鹭引擎的3D编辑器目前正在处于内测阶段,我们免费提供给二十个使用Egret3D的研发团队进行试用,目标是在 2018年12月份向所有开发者开放。目前加入我们的内测计划也非常的简单,只需要将您的项目信息和公司信息发送给 [email protected],我们就会在和您确认后尽快将编辑器提供给您,并在我们力所能及的范围内为您提供尽可能完备的技术支持。
第三部分是Unity导出插件。目前白鹭引擎的3D编辑器主要用于编辑基于实体组件系统模式的组件数据以及场景信息,在3D资源编辑方面,比如3D粒子编辑、3D动画编辑目前尚未实现,所以我们采用了 Unity3D资源导出的方式来为游戏制作这部分内容。如果开发者已经开发了一款基于Unity3D引擎的游戏,可以直接把它的资源置换白鹭引擎的格式。这部分我们目前计划在11月份将其开源。
第四部分是文档中心。我们认为文档是引擎中非常重要的一部分。自从Egret3D 发布后,我们一直在不断提升我们的文档数量和质量。在九月份,我们文档中心有29篇Egret3D文档,平均每篇文章590字,在10月初,文章数量提升到了36篇,平均字数提升到了900字。我们的目标在每一个版本都把文档数量以及每篇文档的平均字数字都尽可能的提高,一遍尽可能的解决开发者在日常开发时所遇到的问题。
对这四方面进行了简单介绍后,接下来我将对运行时和编辑器这两部分进行更详细的介绍。
白鹭引擎的运行时包含了三大部分组成,第一部分是白鹭引擎的实体组件系统,他是Egret3D的整体框架;第二部分是3D渲染部分,第三个是白鹭引擎的3D和2D的适配器。
运行时库的第一部分是实习组件系统架构。Egret3D中包含了两个命名空间,分别是 paper和egret3d。为什么有这样区别呢?开发者可以这样简单理解,所有与实体组件系统架构相关的API,我们放在paper命名空间内,因为这些内容是与3D渲染无关的,这样在未来,我们会把与Egret2D相关的内容也集成到这个实体组件系统的架构中。白鹭引擎2D、3D作为整体来支持。
实体组件系统架构中的实体指的是游戏对象GameObject,每一个实体其实只是一个空壳,数据在GameObject挂载的Component中,原则上组件只包含数据,不包含行为。真正的行为由System来决定,也就是说在游戏引擎底层运行的时候,由各个不同的System驱动整个引擎的运行。每一个System,比如渲染、物理、动画,都去寻找不同的组件,并通过组件分别完成属于自己的逻辑。
在开发者比较熟悉的Unity3D中,和这套架构有些区别的是,Unity3D的Behaviour相当于Component,但是是可以包含逻辑的Component,为了Unity3D开发者开发方便,我们也支持这种模式,允许在Component中添加行为,您可以继续按照Unity那样的方式做你的一款3D游戏。
运行时库的第二部分是3D渲染。Egret3D目前采用 WebGL1.0的接口,并以 Extension的方式添加部分 WebGL2.0特性。之所以这样是因为WebGL2.0目前的设备覆盖率还是比较低的,而WebGL1.0的设备覆盖率已经超过了90%。目前只有iOS8.0、Android5.0之前的设备是不支持WebGL1.0的,而这些设备的整体市场份额已经几乎可以忽略。
在一款3D游戏中,需要大量的模型资源与配置资源,Egret3D使用 GLTF 这一标准格式。这种格式有个非常好的优点是,它是为OpenGL/WebGL接口而设计的格式,因此底层的解析效率会非常高。我举一个实际的例子,Egret3D在去年发布了内测版本,他的具体模型解析流程是这样的:第一步需要加载一个模型文件,然后将模型文件进行解析,然后生成WebGL所需要的数据格式,最后提交到GPU中,这样才是一个完整的过程。接下来我们看看今年发布的 Egret3D正式版的架构。我们现在添加的模型文件是一个 GLTF格式文件,这种格式在加载后无需进行解析和生成,只需要对其进行一个非常简单的切割,就可以将它的数据直接上传到GPU 中。大家会发现,解析模型和生成WebGL数据这两个非常耗时的操作被直接绕过去了。实现了从浏览器加载到提交数据之间的无缝对接,通过这种设计,Egret3D与去年的内测版相比,模型解析速度提升了170%,内存降低了一倍,用户可以感知到的加载速度也提升了30%。
在3D渲染中下一个值得一提的话题是如何将 3D部分与2D进行集成。白鹭引擎目前支持在3D的架构中随意添加2D内容,如果想在2D内容中添加3D内容则会稍微复杂一些,您需要先创建3D内容,再把现有的2D内容添加进去。这个问题涉及到游戏引擎的开发思路。白鹭引擎在5年前刚发布的时候是一款2D引擎。如果想在2D引擎中添加3D特性,第一种做法是做一款与2D没有关联的3D引擎,然后将2D部分放在3D之中,这也是白鹭引擎现在的做法。
除此之外还有第二种做法,就是在一款2D引擎的基础上进行不断扩展,不断在其中堆叠新的3D功能,最终实现一款3D引擎。这种做法的优势在于2D游戏可以相对简单的添加一些简单的3D内容,但是想通过这样的方式最终实现一款3D引擎则是比较复杂的。因此我们没有采用这样的方法,而是用第一种做法开发了全新的Egret3D。客观来讲,这样做的缺点,这是对开发者而言最开始学习的入门门槛稍微高一点,但是从长远来看这个是值得的。
刚才的演讲中,我已经介绍了Egret3D运行的实体组件系统架构,GLTF文件格式,3D渲染流程,以及与 Egret2D的集成方式。现在我们进入Egret3D 编辑器的环节,我相信这也是开发者们非常关心的。
我们认为3D编辑器是3D游戏开发中不可或缺的一个环节。也许2D游戏可以不需要编辑器,但是3D游戏没有编辑器几乎是寸步难行。假设我们现在需要渲染一张图片,但是目前屏幕是黑屏的没有渲染出来,在2D中,导致出现这个问题的原因很简单,对象未加载到舞台、对象的透明度设置为0,对象的坐标在屏幕外,对象的纹理没有加载,基本只有这几种可能。但是在3D中,除了上述这些之外,还有很多情况。首先,坐标系不只是x,y两方向,还引入了z方向。还有可能是摄像机的的位置不对,摄像机的朝向不对,图片的材质不对,灯光设置不对等诸多情况。在这么复杂的情况下如果没有编辑器进行编辑是非常困难的。为了解决这个问题,白鹭引擎的解决方案是为开发者提供一款3D编辑器。在游戏开发过程中,编辑器的时候直接可以看到你游戏中所有的对象,比如说人物,摄像机,灯光,这些东西他们在哪里,,这样就会非常直观的看到游戏对象没有正确渲染的本质原因是什么。
除了编辑器之外,我们还提供了一款开源的名为 Egret3D Inspector的工具用于提升开发者的开发效率。这个工具是Egret3D编辑器的核心构成,可以在游戏运行时直接显示游戏每一个对象的属性,并在预览模式下对其数值进行调整。通过这种方式,哪怕您没有Egret3D编辑器,也可以通过这款工具提升游戏的开发效率。
那接下来看的,如果有编辑器你是如何开发一款3D游戏的?有两种方式,第一种是没有编辑器的情况,您可以在Unity3D里面编辑,把所有场景,资源,Prefab等内容全部处理好,通过白鹭引擎的Unity3D导出插件,把这些内容发布到 Egret3D中,然后在浏览器直接看到效果,最后直接发布到微信小游戏,或者未来的更多平台上。
除此之外,如果您现在已经有了Egret3D编辑器,可以在Unity3D中的资源导出后,在 Egret3D编辑器中进行二次编辑。我们开发团队的工作流是,在Unity3D中负责制作素材,然后在 Egret3D 编辑器中负责编辑场景、添加组件和调整组件数值预览。
然后具体实际案例可以看看白鹭Egret3D的案例,《泡泡学园OL》,这款游戏的开发手段就是我刚才说的那样,使用 Unity3D 制作模型,然后在Egret3D 编辑器中进行二次编辑,主要是挂载组件,以及调整数值和场景。这个游戏我们已经发布了小游戏版本,其中一些性能指标基本是目前Egret3D能发布到微信小游戏的极限,其中 Vertex数据可以更高一些,由于这款游戏包含了比较复杂的使用CPU计算的碰撞引擎和行为树AI,所以我们牺牲了部分Vertex来换取更高的性能。开发者如果做的游戏不需要这些高级功能,Vertex可以提升到200,000以上。
刚才跟大家介绍是Egret3D的整个发展情况,我们回顾一下我们今年的整体版本发布计划。我们在今年5月份的时候第一次发布了白鹭引擎3D的正式版本,然后接下来发布了0.9版本,支持微信小游戏版本,1.0版本是系统优化,在1.1版本的时候,3D引擎编辑器提供了内测,在10月8号的时候,过了十一之后发了1.2版本,目前最高的版本,我们发布了Egret Inspector 3D提升开发效率,并扩大了3D的编辑器的内测方位。会在2018年11月份发布1.3版本,我们会进一步扩大编辑器的内测范围,并对底层性能和效果,特别是灯光方面进行进一步的完善。
除了 Egret3D之外,今天我也首次向开发者介绍一下Egret 2D 部分在2018年第四季度的路线图。2018年第四季度我们的目标是发布白鹭引擎 5.4 正式版本,在这个版本里面我们重点优化这几个方面。
第一是将大幅度提升编译速度,预期是把开发者在编译上的时间变成原来的1/5,假设开发者每天工作10小时,其中1个小时的时间是用在编译上,希望把这个时间未来能从1小时变成12分钟,这样理论上大家早下班一个小时。
第二个就是引擎瘦身。白鹭引擎的核心库里面去掉一些老旧API的支持,白鹭引擎目前可以运行在 IE9等老式浏览器内核上,这部分的支持我们未来不会作为引擎核心,而是作为一个第三方库提供给开发者,这样如果开发者无需对这种设备提供支持的话,就可以降低引擎体积,我们的目标是降低50K左右。
第三就是2D的工作流工具更新,我们会在 2018年底将白鹭引擎的 2D工作流进行一个较大的升级,在用户体验基本不变的情况下,进行架构升级,解决一些长久以来的遗留问题。这一部分我们已经进行了接近一年时间,2018年Q4是会中释放给开发者。
最后一条,我认为非常重要,支持白鹭引擎发布到更多的平台,今天白鹭引擎可以发布到H5,IOS,安卓,还有微信小游戏、QQ玩一玩等等很多的平台,2018的Q4版本我们将支持发布到更多的平台上,敬请期待。