Egret的若干局限
Egret是个好东西,整套workflow用下来,特别顺手,对于移动端游戏的开发来说,选择Egret无疑是个不二的选择。
当然,小学语文课上老师就教过一种写作手法,欲扬先抑,笔者今天倒过来,来说说Egret的若干局限性。
笔者从接触Egret到现在用Egret作为主职开发工具,已经整整一年时间了,有些嘈已经吐过了,但有些嘈还在咽着。当然,哪个工具框架没有局限性呢,但是这些局限性还是要让Egret初学者明了一下。
•1.3D旋转
3D旋转虽然已经脱离了Egret这个2D引擎的范畴了,但是,让我们这些怀念flash的rotationX,rotationY,rotationZ这三个属性的人来说,在实现某些酷炫效果上,无疑是大打折扣的啊。其实早在去年7月份时,笔者就已经跟Egret官方沟通过,沟通结果是不会支持3D旋转。
此时,有些有经验的开发者就会说:可以用scaleX和scaleY来实现3D的上下左右的旋转。其实笔者一直都是用这种方法来实现假的3D旋转的,但是,这并不是真正意义上的3D旋转,3D旋转是会产生透视效果的,即近大远小。
笔者就纳闷,为何要不支持3D旋转呢,对于OpenGL和WebGL来说,应该是原生就支持的;对于Canvas2D来说,可以通过矩阵来实现,然后想问,为何Egret实现了skew(斜切),却不实现perspective(透视)。其实是有原因的,因为Canvas2D的transform是能操作一个3*3的矩阵,然而3*3的矩阵并不能实现透视的转换,少了Z轴,所以这是由Html5的Canvas2D间接导致Egret的局限的局限。
•2.渲染
因为Egret不仅仅是一款Html5游戏引擎,实则是一款js游戏引擎,现能支持3个平台(Html5/Android/iOS),如果不理解可以去笔者的另一篇博文里看看(Egret随笔-Egret浅入浅出),里面阐述了一下Egret的机制。真因为这是一款多平台的引擎,所以它牺牲了很多性能方面的东西,这个牺牲就表现在js代码和native代码的比率上,这个比率越大,那么游戏的性能就会越差(提现在卡或者不卡上,通俗讲法)。看过Egret浅入浅出的话,你就会知道Egret的机制其实就是为底层抽象出了很多context来供js调用,这种抽象带来了好处也带来了坏处。
一个好处是能直接适配目前所持有Canvas2D环境,因为Canvas2D所提供的渲染很基础,并没有很强的封装;还有一个好处是方便了Egret对其js代码方面的维护,直接把引擎源码一发布就能得到最快捷的更新。
然而坏处就是前面所说的比率上升了很多,Egret为了是3平台上能发布相似度达到最大程度的效果,这样,js代码率就会很高,导致一些很核心且运行率十分高的代码段都需要用js来实现,且不说V8引擎有多牛掰,总是要翻译一次的吧。
正因为如此,使得native连跑个物理引擎都会费劲,因为js版本的物理引擎在移动端运行的效率都很低下。
个人建议是部分能学习一下cocos2d-x的做法,把某些核心的东西,开发者基本不会去动的代码,在native上封装到native代码上,这样的话native上能达到更高的渲染体验,(反正native模板不也是随着Egret主版本更新的嘛!)。
•3.跨平台背后的不平等
笔者目前所在的公司,要求把游戏做3平台导出并同步上线。本来笔者觉得这个应该挺简单的呢,用Egret官方的support模板一套就好了,可是项目做深了,你就会发现其实并没有那么简单,为此笔者学习了Android和iOS的开发(比较基础的现学现用的那种程度),就是为了满足上头给的需求,比如接入facebook社交、ga分析、flurry分析、admob广告之类的很多功能,这些功能的实现当然不是为了说Egret的局限性,其实上述这些对于每一种跨平台游戏引擎来说都是一样的,都要借助本地代码来实现。
笔者在开发过程中,也和Egret官方的开发者聊了很多,才知道Egret对于3平台的重视程度是有优先级的:Html5>Android>iOS。因为Html5是直接参与代码编写和调试的项目,且是目前市场占有率最高的发布形式,所以首先要保证它的正确性,而后因为Android的设备比率比iOS高很多,所以iOS被落在很后面,在某些实现上也是比较滞后和不重视。果然,笔者在开发过程中,发现问题从多到少正好是iOS>Android>Html5。
举个例子吧,其实对于iOS方面的问题,Egret官方的某开发者已经被笔者问烦了,bug有点多,都是某开发者直接给hotfix版本给笔者的。但是对于iOS上的Graphics代码,一个基础的图形模块,在2.0.x开始就坏了,笔者测试了很多次,发现x、y参数会失效,导致所有由Graphics绘制的可视对象都叠在屏幕的左上角,最后某开发者直接说这事他们内部另一某开发者在重构Graphics模块给弄坏了,那笔者也只能认了。他也给了暂时的解决方案,就是改用像素图来代替,然而由于平台差异,在iOS和浏览器里,直接把一张很小的图拉伸到很大,它会做一次线性插值像素填充,说得通俗点就是图失真了,比如你给了一张1*1的红色(0xFF0000)的图片,要拉伸到3*1大小,那么,它会这样“帮你”填充像素:0x000000, 0x800000,0xFF0000,而不是三个都是0xFF0000,所以没办法,只能用九宫格来填充。
再举个例子,是热更新的不统一,虽然现在都给出“差不多”一致的热更新方案,但是明显在iOS和Android上的实现程度是不一样的,所以为了达到一致性,笔者一直采用自己实现的热更方式,就是为了让他们调用同一个接口。
对iOS的不公平待遇,是令笔者最恼火一个局限,Egret做的完整的产品,既然已经推出了iOS平台的支持,就应该好好地做好这方面的服务,不能因为用户群少而对它不平等待遇。在我们开发者来说,我们做的产品,是信得过Egret才选择了它,所以希望Egret官方能重视这一点。
•4.位图操作
Egret没有为开发者提供位图方面的操作api,这个问题是很多开发提及的,但Egret就真的没提供。这些开发者应该很多都是从Flash转过来的,钟情于BitmapData类,但是Egret的BitmapData类仅仅是一堆数据,它在web和native以不同形式存在着,然而这堆数据提供的接口差异比较大,难以整合。还有就是如果用js来操纵这对数据,那效率想必是很低下的,一般这种封装都是在底层通过c/c++来直接操纵的,所以不提供js位图操作接口。
如果你是在是钟情于Flash的BitmapData类,那建议你看一下Egret的源码,自己实现一下,当然这种方法仅在web发布有效。
•5.多语言开发
对于一个游戏引擎来说,怎么能少了多语言开发呢,难道不打算推向国际了么?在笔者目前的开发中,就是要多语言开发的,只是Egret目前还在国内市场打拼,并没有对多语言提供什么便捷操作,所以目前为止,开发者需要手动进行多语言操作。
多语言开发其实并不难,至少比多平台开发简单。语言差异主要体现在了文字和部分文化上,对于文化差异,我只能忽略了,但是文字部分还是需要翻译的。
多语言在程序中体现无非就是文本和图片了,笔者模仿Android的多语言控制,降所有的语言相关文本全部收集到语言包(lang.json)中,并放在resource目录,然后翻译一份国语版,命名为resource_zh,或者日语版resource_jp,然后修改egret tools的源码,在publish命令中添加-lang命令,命令参数为语言字符串,然后将resource自动拷贝到发布目录。然而,这只能用在Html5版里,对于Android和iOS是行不通的,因为涉及到version control的东西,牵扯太多东西了,所以最然并没有什么卵用。
希望Egret早日把多语言开发并入主分支吧。
•6......
想到再说。
•结尾
对于Egret的局限性,也只是笔者站在自己立场所提出的,随着你的Egret的深入了解,你肯定会发现更多。当然,Egret团队会虚心接纳你的意见或者建议,我们都能更好得为Egret的发展而提供一点点帮助。
Egret的若干局限的更多相关文章
- egret随笔-publish命令的改进
缘由 导了几天的ipa,每次publish后都要改zip包名的代码,终于鼓起勇气翻看了一下egret publish的代码,唉,这代码...应该不会是北京的那几个大牛写的吧??? 正题 看了源码才知道 ...
- Linux下查看二进制文件命令
一.在Linux下查看二进制文件的软件: xxd hexdump 二.编辑: 1.biew 2.hexedit 3.vim Vim 来编辑二进制文件.Vim 本非为此而设计的,因而有若干局限.但你能读 ...
- 用VIM查看编辑二进制文件
用VIM查看编辑二进制文件 vim可以很方便地编辑二进制文件,个人认为它比emacs的二进制编辑方式更好用.vim中二进制文件的编辑是先通过外部程序xxd来把文件dump成其二进制的文本形式,然后就可 ...
- vim 以16进制进行文件编辑
用 vim中二进制文件的编辑是先通过外部程序xxd来把文件dump成其二进制的文本形式,然后就可以按通常的编辑方式对文件进行编辑,编辑完成后再用xxd 转化为原来的形式即可. 可分如下几步进行: (1 ...
- 写好Hive 程序的若干优化技巧和实际案例
使用Hive可以高效而又快速地编写复杂的MapReduce查询逻辑.但是一个”好”的Hive程序需要对Hive运行机制有深入的了解,像理解mapreduce作业一样理解Hive QL才能写出正确.高效 ...
- Egret引擎随学随机
1.纹理集实际上就是将一些零碎的小图放到一张大图当中.游戏中也经常使用到纹理集.使用纹理集的好处很多,我们通过将大量的图片拼合为一张图片从而减少网络请求,原先加载数次的图片资源现在加载一次即可.同时, ...
- Egret 入门
居然使用 TyptScript... 先贴手册地址:http://www.typescriptlang.org/docs/tutorial.html. 先要接受一个诡异的写法: private loa ...
- 再度分(tu)析(cao)Egret这个年轻人
写在最前 笔者用Egret来开发游戏已经有2年多之久了,从它出现到如今的3.2.x版本,经历了很多很多,也做了很多类型的游戏了,关键是踩了很多很多坑. 很多网友问我Egret有哪些优劣,我也只是说了一 ...
- Egret入门(三)--创建HelloWorld项目(4.0-使用Egret Wing)
准备 编辑器: Egret Wing3(4.0.3) 需要下载安装 语言: TepyScript(JS的超集,参考手册http://bbs.egret.com/thread-1441-1-1.html ...
随机推荐
- Ajax XMLHttpRequest对象的三个属性以及open和send方法
(1)onreadystatechange 属性onreadystatechange 属性存有处理服务器响应的函数.下面的代码定义一个空的函数,可同时对 onreadystatechange 属性进行 ...
- SQL Server 日志文件增长原因定位
方法 1.sys.databases; -------------------------------------------------------------------------------- ...
- rails跑通第一个demo
rails -h 查看帮助 Usage: rails new APP_PATH [options] Options: -r, [--ruby=PATH] # Path to the Ruby bina ...
- oracle优化思考-双刃剑
oracle优化是一个双刃剑,特别注意这把剑用的场合:系统规划OLTP or OLAP 优化1:索引 在DML操作时.必须维护索引.假设大量的DML操作,想想看,IO是不是老高了? 索引长处:在非常多 ...
- twitter 监控登陆活动
http://vicenteaguileradiaz.com/download/tinfoleak/tinfoleak-1.2.tar.gz
- 实用的JavaScript技巧、窍门和最佳实践
JavaScript是世界上第一的编程语言,它是Web的语言,是移动混合应用(mobile hybrid apps)的语言(比如 PhoneGap或者 Appcelerator),是服务器端的语言(比 ...
- jmx使用应该注意的基本规范
1.标准MBean 名称必需是在要监控的类名后面加上“MBean ”. 2.监控的类和MBean 接口必需在同一包下,也可以理解为注册的接口名字必须以MBean结尾,接口实现类比接口名字少了MBean ...
- Devexpress之barManager控件属性
隐藏菜单栏左边的竖线和右边的箭头? 1.隐藏菜单栏上右边的箭头属性设置:OptionsBar=>>AllowQuickCustomization=False 2.隐藏菜单栏左边的竖线属性设 ...
- C# AES,AesManaged使用学习
加密 static byte[] EncryptBytes_Aes(byte[] plainText, byte[] Key, byte[] IV) { // Check arguments. ) t ...
- Knime 使用 初探
使用数据挖掘工具 Knime,分析某公司用户使用情况. 首先,打开csv文件数据,看到有以下门类: 时间.track id 歌曲名.用户行为.用户id.日期.snap_id 即歌曲门类 然后,打开Kn ...