转载

Egret 2.0 RC2 版本发布详解

Egret 2.0 RC2 版本发布详解

RC2同样是一次重要的升级。本文首先对这三个亮点进行介绍。再扼要介绍部分改动。

增量编译

增量编译是用于开发调试迭代过程中实现零等待编译。即只编译修改或者新增的ts类源代码。

用法

增量编译的用法是:

egret quickbuild

增量编译使用与原先的标准编译( egret build )不同的两种编译方法,无法完全取代标准编译。

而且标准编译所支持的引擎编译、指定运行时等选项增量编译均不支持。

最佳实践

实际开发中最佳的开发流程是:

  • 新导入项目或进行第三方模块配置后,用标准编译方法进行引擎编译( egret build -e )
  • 开发调试迭代过程,进行增量编译( egret quickbuild )
  • 发布项目( egret publish )前,再进行一次标准编译( egret build )
  • 需要指定参数的编译方式也同样使用标准编译(如 egret bulid -runtime native )

注意

需要注意的一点,就是增量编译的分析过程与标准编译不同,标准编译会分析每个ts类源代码中对其他ts类的引用,从文档类开始分析,因此项目中没有用到的类标准编译会忽略。而增量编译完全忽略源代码ts类之间的引用关系,直接进行扁平式编译。

自动脏矩形

脏矩形只重绘屏幕发生改变的区域,这在Egret 1.5时代已经实现,但旧版脏矩形需要手(ren)工(rou)设置,对于复杂的游戏来说,用脏矩形优化过程无异于一场噩梦。

白鹭官方已经对这部分进行了大刀阔斧的改进,实现了自动脏矩形。

熟悉Flash的朋友都知道,这项技术已经在提升Flash Player性能上取得了巨大成功。今天白鹭的产品再次将其应用到旗舰产品Egret和Lark上。脏矩形的工作方式如下图所示:

Egret 2.0 RC2 版本发布详解 Egret 2.0 RC2 版本发布详解

红框封闭的区域是脏矩形,也就是说引擎运行时只需要渲染这部分。自动脏矩形,不但可以极大的提高渲染性能,还能尽可能的节省设备电量。另外,当检测到屏幕刷新面积已经到临界点(大约占舞台面积95%)时,直接进入全屏刷新模式,因为这种情况脏矩形已经无法改善渲染性能了。

注意,由于加入该项功能对Egret内核有大规模的改动,稳定性有待进一步验证。因此并没有在RC2以一键安装方式提供,以防止产品级开发出现意外的问题。白鹭官方考虑到让广大喜欢尝鲜的开发者来体验,在github上提供了专门的 渲染架构体验分支 。

动态帧频

由于官方推荐保持60fps,2.0 RC2之前漫长的时期,设定帧频还需要用一种类似hack的方法(具体 官方FAQ 有说明)。

在2.0 RC2版本, frameRate 再度回归!通过在程序中可以访问stage的位置使用 stage.frameRate 即可以直接设置帧频,并且可以随时改变。

目前的版本帧频设置有个限制,只能设置被60整除的帧频,其他数值将会被拟合为符合这个标准的值。

创建JS项目

广大JS资深开发者期盼的JS创建项目的方式,其实在RC1已经提供,但有些小bug,在本次发布的RC2已经在不同的操作系统可正常使用。创建项目使用:

egret create_js HelloJS

启动项目使用:

egret startserver HelloJS

在项目创建时,我们提供了 egret.jsegret.min.js ,开发者只需在发布时将 egret.js 切换为 egret.min.js 即可。

坚持使用JS而不刁TS的开发者必然是资深玩家(官方仍然建议,开发Egret首选标准的TS语言),因此暂无太多说明,后期白鹭官方会根据开发者反映,推出相应的详细教程。

其他较小改动

其余功能都是较小的改动,在这里简要说明。

几何运算模块增强

Matrix 增加了 createBoxcreateGradientBox 等一系列API。

其中使用 createBox 方法可以直接定义生成的矩阵的缩放、旋转和平移效果。

Point 增加了 interpolatenormalize 等高级方法。

Rectangle 也增加了 unionintersection 等更丰富的操作。

DragonBones事件派发机制

之前的DragonBones采用自身独立的一套事件机制,从这个版本起,已经跟Egret内核统一,使用Egret内核提供的事件机制。

比如侦听Armature的事件,在升级到2.0 RC2之后需要添加第三个作用域参数(通常是 this )。

var factory = new dragonBones.EgretFactory(); var armature = factory.buildArmature("warrior"); armature.addEventListener( dragonBones.ArmatureEvent.Z_ORDER_UPDATED  , this.zUpdateHandler  , this  );
正文到此结束
Loading...