Here you can find answers to some frequently asked questions about Laya engine.
If you have a question not answered on this page, you can ask it on the Laya Developer Communication
使用C编写的跨平台Html5运行加速器。通过4年优化,4次重构,采用逻辑渲染双核运行、全部GPU加速渲染、内存智能管理、显存智能管理、渲染流程 极致优化、支持超大型H5游戏在安卓、IOS等移动平台加速,大幅度提升性能;还可嵌入APP应用中,用于支持APP在应用内部流畅运行重度H5产品;同 时,用于Html5画布型引擎加速、webGL型引擎加速、DOM型引擎加速;
基于Laya-player的H5产品性能,经测试,提高渲染性能5~10倍,流畅度、发热量、耗电量等,媲美APP。还支持声音、渲染、设备访问等游戏常用功能。
LayaFlash1.0引擎库压缩之后体积会减小会到400k以下。
安卓3M;苹果2M,以后可能会优化到1M多。
使用LayaFlash引擎技术不会收费(终身免费)。
目前LayaFlash支持的开发环境:
a. FlashBuilder
b. FlashDevelop
支持的语言:ActionScript3.0。
Java环境同步电脑系统,32位和64位系统都可以。目前对Java环境的版本要求必须在1.8或1.8以上的版本。
不需要,LayaFlash发布的H5项目是标准的HTML5项目,跟Flash已经没有关联了。
可以的。详细请参考LayaFlash开发者中心的文档教程《LayaFlash宏编译》
支持canvas。之后也会支持dom。基于标准的canvas html开发的项目可以直接对接我们的LayaPlayer。
LayaFlash编译的项目已经没有swf的概念了,编译后的代码全是JS代码,嵌入参数没有实际意义,我们提供了__JS__()方法,直接调用JS的方法,通过调用代码:Laya.window.location.href获取地址栏即可。
LayaFlash生成的代码最好不要和JS混合调用,不过理论上是可以的。因为LayaFlash也支持JS开发,支持haxe开发,支持LUA开发,支持TypeScript开发。
H5里没有ane的概念,用LayaFlash移植完的H5游戏,接口对接就是与JS做对接。我们提供了__JS__()方法,可以在as3下直接调用js的代码。
LayaFlash不支持编译haxe。
LayaFlash支持AIR SDK,还有FLEX SDK(FlashBuilder或FlashDevelop)开发H5项目。两种SDK的AS3开发IDE都支持。
不是所有的。LayaFlash目前仅对开发游戏产品相关的API做重点支持。
支持。将来如果有新的AS3没有的接口,LayaFlash也会直接提供接口。
不支持。
LayaFlash只支持转换使用AS3编写的Flash项目和部分3D框架(例如starling渲染框架)项目,不支持使用深度反射机制框架编写的项目;暂时不支持矢量图形动画(工具会自动将资源文件转换为png图片)。
与原生一样,在AS3里开发,直接通过宏命令(Laya_Publish_H5)发布成h5项目就可以。
推荐使用MornUI,经过对LayaFlash的紧密支持,使用方法已经和使用原生的MornUI一致。
游戏的完全自适应是需要开发者自己实现的,通常的解决办法是获取设备的屏幕尺寸,再计算缩放比例,通过缩放场景让游戏实现自适应,跟Flash开发手机游戏时一 样。 laya之后也会提供相应的接口供开发者直接调用。 目前我们有提供IFlash.setSize方法让开发者发布固定机型尺寸,比如960*640类似。 如果setSize方法不设置,就会实现全屏显示,但是这样有可能会导致显示拉伸。
AS3下获取舞台的宽高:
stage.scaleMode=StageScaleMode.NO_SCALE; stage.addEventListener(Event.RESIZE,stageResize); private function stageResize(event:Event):void { trace(stage.stageWidth) trace(stage.stageHeight) }
转换成h5后获取浏览器的宽高:
//[IF-JS]var fullScreenWidth = Laya.window.innerWidth; //[IF-JS]var fullScreenHeight = Laya.window.innerHeight;
可以实现,方法就是获取到设配的屏幕尺寸后,再传参数给游戏让其自适应,跟flash原生方法一样。我们之后也会提供相应属性,供开发者直接调用。
HTML5是跑在浏览器上的,没有机型适配的问题,不过LayaFlash也可以发布本地的APP版本,我们提供了IFlash.setSize()方法让开发者发布固定机型尺寸。
LayaFlash本身使用的是位图,无需缓存成位图。但在JS中为了性能考虑,暂时无法对位图进行像素操作。
没有什么限制,如果layabox官网有你需要的第三方类库,建议直接使用 (官方提供的类库,是已兼容layaflash引擎规则的第三方库)。官网没有的as第三方类库,开发者也可以自行对第三方库进行兼容处理。
处理方法:使用LayaFlash去转换成h5类库进行使用。
对于编译成H5的项目,如果想调用第三方的sdk,可以直接嵌入对方的js文件。
调用方法:是用laya提供的__JS__( )方法。//括号里写什么就是什么,可以直接调用JS的方法
嵌入方法:是在html文件添加script标签。
例如:(第三方的js文件名为:zlib.min.js)
<!--嵌入第三方的js文件-->
<script src='zlib.min.js' loader='laya'></script>
<!--自动生成的主js文件的script标签-->
<script src='test100.max.js' loader='laya'></script>
简单的修改应该是可以的。添加新的功能,跑原生浏览器的话应该没有问题,但是加速器不支持,新加功能的性能就无法得到提升了。
保存本地数据目前不支持写文件(File)的操作,只支持用ShareObject存取数据。
支持,但是不建议用,它需要配合单独工具使用,它会增加项目的文件体积。
Starling的滤镜已经全部支持,Flash的滤镜还在推进,目前简单的文字描边已经支持,灰度和其他简单的滤镜会优先做出支持。
在添加新功能的时候,我们需要考虑该功能在h5那边是否实用,由于手机端是没有右键操作的,所以该功能目前并不支持。
LayaFlash对声音有特殊的要求,在同一时间只能有一个MP3播放,WAV则没有限制,可以同时播放多个,但是WAV对格式有要求,具体格式:PCM格式/单声道/16位/22050采样率。通常是用MP3做背景音乐,WAV做游戏音效。
在侦听事件中添加了bind,如下:
this.parent["timer1"].addEventListener(TimerEvent.TIMER,bind(this,this.timerEv))
移除该事件同样需要添加bind, bind的侦听和移除需要配套使用。
this.parent["timer1"].removeEventListener (TimerEvent.TIMER,bind(this,this.timerEv));
不需要强转的时候as可以直接去掉,在Flash项目里如果有使用as运算符强转会返回null的情况下需要用typeAs()替代as运算符。
as 运算符(例如:mc as MovieClip)改成typeAs语句LayaFlash在编译时是可以自动添加的,但是有很多地方是不需要添加typeAs的,这些是没法自动识别的。如果遇到as就加个typeAs,这样会因为项目代码里执行了过多的逻辑判断而导致性能问题。
Flashbuilder4.6已经包含全局JSON类了,不需要手动导包,直接使用JSON.parse()和JSON.stringify()方法对json数据进行解析处理即可。
LayaFlash的XML一些常用用法和flash原生一样,但要注意一下xml的length()方法,编译成h5后,需要将xml的length()方法改成xmlLength(),xmlLength() 用来获取XML或XMLList的长度。
iflash.method.xmlLength public function xmlLength(xml:*):int
参数:
xml:* ; XML或XMLList对象
原生例子:
var dataXML:XML=new XML(data); var len:int = dataXML.content.length();
兼容H5写法:
var dataXML:XML=new XML(data); var len:int=xmlLength(dataXML.content);
暂不支持在XML属性判断中使用“!=”和“==”以外的判断条件,例如:
xml.nodeA.nodeB.(@a <= 2)
不确保100%都支持。JS没有提供XML的操作接口,目前对XML的操作都是LayaFlash提供的技术,遇到LayaFlash不支持的XML书写格式,可以通过layabox官方群(330223972)、论坛http://ask.layabox.com/等方式告诉我们,能支持的我们都会支持。
支持,但是readObject()、writeObject()等方法不支持用在自定义类、系统类、封装ByteArray类等上。具体请参考 Layabox开发者中心LayaFlash教程文档的《LayaFlash新增方法》篇中第7条的读写指定位上数据:byteAt()和byteSet()。
为了彻底解决编译成JS后的性能问题,LayaFlash提供了一个新的类iflash.utils.LayaDictionary来替代Flash原生下的Dictionary,通过set(),get(),clear(),remove()、contains()方法的辅助,实现了Dictionary在编译后保持原有的功能效果。
详细使用方法请大家参考Layabox官网教程,开发者中心的LayaFlash文档教程的《LayaFlash新增方法》中第5条Dictionary的使用规则,以及《Flash差异规则》2.2 hasOwnProperty() 方法差异。
post传输字符串可以,传输二进制的话目前不支持。二进制可以通过base64处理一下(只需要对传输的数据进行base64转码即可)。
支持。编译成H5后,前端把TCP Socket翻译成了标准Websocket,H5里的长连接目前只能走Websocket。Websocket和TCP Socket的数据是有差别的,差别在数据协议头上。所以前端的通讯都不需要改动,只需要把后端支持的Web Socket的数据解析处理下即可。
不需要。
不需要自己在Flash里封装WebSocket了。LayaFlash已经把arraybuffer封装到byteArray里了。
Flash模式下调试WebSocket是没必要的,很多功能可以在Flash里完成,直接翻译成h5再去调试。
转成H5后,不需要再去调用843端口了,直接跟服务器握手就可以。
详细参见教程《转换常见问题汇总》。
报这个错一般是因为找不到zlib文件,zlib是一个外挂模式的JS文件(zlip.min.js),需要通过添加第三方js类库的方法进行添加,修改方法就是修改转换后的html文件,添加script标签:
例如:(test100.max.js为主js文件,添加一个第三方的zlib.min.js文件)
<script src='zlib.min.js' loader='laya'></script> <script src='test100.max.js' loader='laya'></script>
注意:新添加的第三方js类库的script标签写在主js文件的script标签之上,确保可以加载到。
warning一般情况下是不会影响程序运行的,但为了不影响编译后的JS逻辑,推荐全部修改。查找警告的方法是:在LayaFlash转换生成的主JS文件的末尾处,有详细的输出,可以根据提示进行修改。
/*no*/表示代码中存在未定义的变量。
“??”表示不识别的字符 。
此报错通常会有2种情况:
a.编译当前.as类的时候没有找到这个类的import引用包的语句。
b.此类是个未被使用的类。
如果是第一种情况,根据js代码提示,往上找注释,会有对应的.as类提示,在你的原项目中找到该类并对报错代码对应的Class重新进行导包。
如果是第二种情况,将此类全部注释或删除即可 。
该报错是由于资源转换遇到了问题。请检查原生项目bin(bin-debug)下的h5文件夹中资源是否完整无误,如果资源存在问题请到官方网站下载最新的LayaFlash工具(或使用已经下载好的LayaFlash工具),打开LayaFlash工具->资源转换,直接将你的swf文件拖拽至工具的资源转换页面上,点击转换,完成,重新编译。
往上查找JS代码的注释,JS代码注释中有报错代码块所在的.as类文件名以及文件路径提示,根据提示可以定位报错代码所在的.as文件。
由于浏览器本身默认的是不允许文件跨文件读取的,会涉及到跨域的问题,解决跨域问题可以参考以下方法:
1.使用宏命令(Laya_Publish_H5)转换
LayaFlash已经自动添加了启动参数,所以在使用宏命令(Laya_Publish_H5)转换后,工具自动打开的chrome显示页面不会报域的错。
如果报类似XMLHttpRequest cannot load http...No'Access-Control-Allow-Origin'header is present on the requested resource .Origin 'file://'is therefore not allowed access.
将你的chrome相关页面全部关闭,重新使用宏命令(LayaPublish_H5)进行转换即可。
2.添加启动参数
2.1.使用宏命令(Laya_Publish_H5)转换后如果依然报域的错:类似XMLHttpRequest cannot load http...No'Access-Control-Allow-Origin'header is present on the requested resource .Origin 'file://'is therefore not allowed access.
将你的chrome相关页面全部关闭,在chrome快捷方式上 | 右键“属性”| 快捷方式栏 | 目标末尾添加参数“ --disable-web-security。然后重新进行转换。
2.2.直接将你的html文件拖拽到chrome的快捷方式上(直接双击打开html文件不可操作)如果报类似XMLHttpRequest cannot load file:///...xxx.swf Cross origin requests are supported for protocol schemes:http,data,chrome,chrome-extension,https,chrome-extension-resource.
将你的chrome相关页面全部关闭,在chrome快捷方式上 | 右键“属性”| 快捷方式栏 | 目标末尾添加参数“ --allow-file-access-from-files"(建议)或 “ --disable-web-security”。然后重新执行你的操作即可。
这个是因为浏览器读取了本地文件,浏览器默认是不允许读取本地文件的。上传Web就不会有这个问题了。
“AS3开发IDE”(FlashBuilder或FlashDevelop)中要编译成HTML5的项目没有被选中。通常开发IDE里的代码编辑器窗口失去焦点的时候会出现这个问题。
该信息是为了方便开发者查看游戏运行时的帧频,可以取消掉,laya提供了showInfo()方法,直接在构造函数里调用即可,完全可以满足开发者的需求,调用实例如下:
IFlash.showInfo(false);//true为显示,false为不显示。
先在代码中增加stage的舞台缩放模式(stage.scaleMode)和舞台对齐方式属性(stage.align)的设置,如果还不能解决问题,建议把这些关于屏幕的设置直接放到构造函数里,直接外部写死,否则有可能出现当改变浏览器大小时,信息没有及时通知到,导致显示异常。
加载SWF文件,laya跟原生flash是有差异的。laya采用的是异步加载,当游戏运行的时候对涉及到的资源文件进行实时加载。
如果遇到了图片加载不及时的情况,不用担心,laya提供了preSwfAssets()预加载方法,在主程序入口处指定哪些资源预加载。
示例如下:
IFlash.preSwfAssets(assets:Array); @param assets 需要预加载的swf数组集合
报该错一般是因为链接类使用不正确导致的,检查原项目的链接类是否完整,放置位置是否正确。
如果你的项目中涉及到了swf文件的转换,需要把SWF的代码提取成as代码文件(建议使用反编译工具:JPEXS Free Flash Decompiler),并且把swf的图片资源/声音等全都取出来,这个过程除了取出代码之外,全都是自动化的(使用LayaFlash工具进行资源转化)。将提取出来的as代码文件放置到原生项目的src目录下,然后进行转换(Laya_Publish_H5)。
在项目下创建一个txt文本,内容为“laya.js.exe的路径”空格“fb或fd的项目路径”(flashbuilder:定位到.actionScriptProperties)回车加个pause,最后将txt的后缀名改为bat,运行bat文件,看看他的路径定位在什么目录下,此目录即为报错目录。
看控制台最后一行,是定位的文件。
可以从目前案例查看LayaFlash的H5项目性能状况:大型动作h5游戏《猎魂之刃》(仅含Laya(runtime),3M+)地址:安卓手机最新版QQ浏览器(QQ空间的玩吧)最新页游里,
其他部分移植案例:www.layabox.com。
技术突破:HTML5游戏性能超越Unity3d
是的。
不建议在手机原生浏览器里访问,因为没有加速器支持,游戏体验效果一般。LayaFlash开发测试后的游戏,最终会打包成APP,APP内置了加速器,或者用移动端加速插件运行。
另外我们还会提供pc端加速器测试版本和手机端加速器apk供开发者测试使用。
因为手机浏览器一开始就不是为了运行游戏而设计的,在运行游戏的时候会涉及到大量的图形渲染操作,而游戏的性能也取决于浏览器自身的性能。
H5的一些兼容性与性能问题只能依托LayaPlayer才能更好的解决。目前LayaPlayer已经在很多浏览器植入运行了,如果你的游戏对接了我们的LayaPlayer,运行在支持LayaPlayer的浏览器上可以直接调用我们的运行器,对游戏进行加速
LayaFlash对游戏中涉及到的图片、声音等资源做了智能内存(显存)管理,能自动帮大家解决内存等问题。
影响不大,发热量主要来自手机的CPU或GPU的运算,还有页游转手游后图片的精度需要处理,精度太高的图片手机上肯定会承受不了,图片尺寸都需要一定比例的缩放。
图 片多是因为在网络加载的时候增加了IO的输出,layabox的加速器端是动态创建类似plist图集的,而且图片加载的输出这块对服务器的影响也不 是很大。为了优化图片的加载,layabox现在已经开始写工具把需要提取出来的图片资源打包成plist图集(使用LayaFlash工具进行资源转换时,开发者可以选择是否打包为图集,详细的打包图集功能正在完善,目前支持mc打包为图集),以此来减少网络层面上IO连接带来的 消耗。
用 LayaPlayer运行的游戏,在内存使用上都是智能管理的。而且用矢量的话会加大手机的计算导致手机发热量的增加。矢量图片的操作我们有支持方案,只是 目前没有一个更好的方案保证支持矢量的同时解决手机的发热量增加问题,这部分我们还在持续研究中。
因为我们H5里的BitmapData用的不是真画布,而是LayaFlash的指令流。这样做会造成指令流堆积导致运算量加大。
看代码质量,不过转之后的h5游戏性能肯定会有所提升,但是开发者也需要做一定的优化。因为一款性能优越的h5产品是需要开发者+运行器才能做到的,通用浏览 器是作的通用标准规范,不可能做到极致性能,各引擎商的运行器是针对自己认可的引擎标准作加速,所以比较好一些,但是引擎的运行器只是一个方面,开发者完全 不顾及性能,在对性能要求很高的游戏上,也会出问题。
手机端的重力感应,as端有对应的接口。LayaFlash已经写好并支持,使用方法和原生flash一致。
目前PC和手机上的主流浏览器都能支持。
不可行。手机浏览器也和PC本地浏览器一样,只有在读取图片时,才不涉及到文件跨文件读取。否则会涉及到跨域的问题或浏览器版本的问题。
IE9以上(包含IE9)才支持HTML5,而且支持的还是不全面。除了FireFox外,其他浏览器默认是不允许文件跨文件读取的,需要添加启动参数。
因为360默认用的IE的浏览器内核,可能会报错,需要确认IE版本是否支持HTML5。浏览器调试优先选择谷歌。而IE9以上的支持,支持有限。还有一种情况是浏览器默认不允许文件跨文件读取,需要添加跨域启动参数。
缓存。
腾讯X5浏览器(QQ浏览器)、QQ空间的玩吧、百度浏览器、猎豹浏览器等移动设备浏览器提供商的支持工作已经对接完了(其中QQ浏览器、QQ空间玩吧已经有上线的大型H5产品:猎刃2萌喵闯三国), 欧朋、遨游等浏览器正在对接。
需要有一个外网的服务器,把转换好的游戏直接放到外网,别人就可以访问了,类似于现在的一些小游戏网站。
可以的,需要在html文件里加上调用启动参数,具体可以和layabox的商务沟通。
针对好产品,我们推出入住式服务,CP方只要安排一个熟悉项目的程序员,我们免费派专人进驻企业,主持产品移植。
目前Laya提供2种打包方式:
a.微端包:
只提供了游戏url,在运行游戏的时候所有资源都是即时从网上下载,并且缓存到本地。
b.资源包:
是把项目的所有资源(其中包括:js、html、图片、声音等)按照LayaPlayer的格式进行打包,并拷贝到apk的资源目录下。运行游戏的时候直接读取本地资源,而无需从网上下载。
打包时,用户可以针对游戏加载的资源进行选择性打包,将需要打到apk里的资源放到打包工具指定的目录,在游戏利用资源时,如果apk里不存在资源则会直接到外部去加载指定的文件。
《萌喵闯三国》大型卡牌游戏,《猎魂之刃》大型动作游戏。在安卓最新版QQ浏览器和QQ空间的玩吧均可以试玩。