分享基于Flash AIR和Starling、Feathers的经验积累

1.iOS中加载本地json文件,其键值必须是字符串,如{"tileWidth":"106"} 否则decode时报错(待验证)。

2.File.applicationDirectory为App安装目录是只读的,File.applicationStorageDirectory可以写入。

3.位图尺寸要尽量接近2的幂次方,把多个相关图片用TexturePacker制作成纹理集(SpriteSheet)。

4.静态Sprite要平面化即调用flatten方法,不需要触碰的话把touchable设为false。

5.Touch事件没有捕获阶段;要在冒泡阶段判断触碰对象可遍历对象数组用Touch.isTouching方法判断。

6.Starling中尽量不要使用滤镜,用的话一定要注意,在同一时刻,每一个滤镜只能应用于一个显示对象。否则,它就会变的很慢,需要更多的资源和缓存,并导致无法预料的后果。

7.使用Starling框架的QuadBatch批次渲染模式,可以优化渲染、提升性能。

8.FlashBuilder 4.7中使用Air SDK则无法直接使用swc中嵌入的BitmapData,需要换成flex sdk:打开.actionScriptProperties文件,修改useFlashSDK值为false。

9.AssetsManager加载位图字体文件后会自动注册TextField,可用TextField.getBitmapFont获取字体。

10.AIR好像不支持[Frame]元标签进行预加载。

11.用FileStream异步操作文件后要使用setTimeout(fs.close, 1)方式关闭流,否则当再次打开文件时会引发被占用异常。

12.当json字符串中有用科学计数法表示的值时,注意'-'前后不要出现空格如4.9406564584124654e-324,否则解析错误(用格式美化工具后可能会出现这种情况)。

13.Startling单个纹理最大限制为2048x2048,Player11.8 & AIR3.8支持到4096,需修改Starling profile参数为Context3DProfile.BASELINE_EXTENDED。

14.Feathers的Theme是对皮肤统一管理(换肤、复用),所以资源可分为主题风格和游戏内素材。

15.使用位图字体替代系统字体;不要频繁的读取显示对象的宽高;Image替代Button;使用ATF纹理格式。

16.如果有完全不透明的矩形纹理,我们可以让GPU禁用那些纹理混合。这对于大背景图像特别有用。设置displayObject.blendMode = BlendMode.NONE。

17.NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE;可以运行时唤醒屏幕。

18.在FlashBuilder4.7编译器选择启用遥测数据可以用Scout分析性能,移动端需要装AdobeScout。

19.使用uint类型时要确定不会出现负值,否则会有bug,如 for(var i:uint = length - 1; i >= 0; i--)。

20.SQLite不支持非标准SQL,如一次插入多条数据 INSERT INTO TABLE(col1, col2) VALUES(val11, val12), (val21, val22);替代方案:INSERT INTO TABLE(col1, col2) SELECT val11, val12 UNION ALL SELECT val21, val22;这样的写法是属于复合SQL语句,表示先把两个SELECT的结果集进行无删减的联合,再把联合结果插入到TABLE中;当数据量大时也可使用事务提交多语句的方式。

21.File::copyToAsync 好像不支持移动设备(android上无反应),用FileStream写文件代替。

22.切记在使用LoaderContext时每次需要new新的实例。

23.本地存储文件时,如果applicationStorageDirectory内还含有目录,则使用file.parent.createDirectory();创建文件的父目录(parent不能少)。

24.App间跳转URI配置:

        
        
        
               
                        
                                
                                
                        
                        
                                
                                
                                
                                
                        
               
        
        
        ]]>




        
                UIDeviceFamily
               
                        1
                        2
               
                CFBundleURLTypes
               
                        
                                CFBundleURLSchemes
                                
                                        todoair
                                
                                CFBundleURLName
                                MobileB
                        
               
        ]]>

        high


MobileA跳转代码:navigateToURL(new URLRequest("todoair://me=neo&you=jack"));
MobileB接收参数:NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke);

25.Feathers TextInput组件在2x分辨率下背景图有黑底现象,把9宫格图换成普通Image即可解决。

26.可使用socket模拟http请求方式来获取HTTP头,如服务器文件最后修改时间等,如果只需要服务器返回HTTP头(不返回内容), 请设置提交方法为:URLRequestMethod.HEAD。

27.当局部变量属性类型为*时,在条件判断语句赋值后多次调用可能会存在bug(变量值变为一科学型数值?);解决:在条件判断后直接return数据 不再赋值后return变量。

28.锁屏或黑屏或运行大量复杂动画等,在程序降频后,会影响程序的执行 如setInterval。(所以socket应用不要在客户端发心跳,因为时间间隔受帧频影响不够准确, 有待测试)。

29.android设备上app切换后,应用在后台运行,仍可激活当前屏幕;在锁屏或黑屏情况下切回app(激活状态下正常),starling会黑屏(GPU纹理丢失,但仍在运行),设置handleLostContext亦无效,解决方法:在app切换前让屏幕激活,或让starling重新上传纹理 Starling.current.dispatchEventWidth(Event.CONTEXT3D_CREATE);(较慢)

30.AIR4.0开始Starling启动加快,并可自动选择最佳profile(加载4k纹理时不用手动设置Context3DProfile.BASELINE_EXTENDED)。

31.starling项目加载另一starling的swf的临时解决方案:发现直接传对象行不通;在子swf不new Starling,而在父项目中通过getDefinitionByName获取子starling的root类,生成实例再添加到父项目中。

32.registerClassAlias(),如果想要传递任何非原生数据类型时(即使是一些原生的类也需要),这个调用就非常重要。所以记着,需要在两端都调用registerClassAlias()方法。如果不调用这个,传输的数据将会被作为原始Object对象。(在当前域或子域,两端都存在的自定义类无需注册别名)

33.Worker多线程之间共享内存,要共享一个byteArray对象,你需要设置byteArray.shareable=true,然后调用messageChannel.send(byteArray)或者worker.setSharedPropert(“byteArray”, byteArray)方法来共享它。

34.Away3d 4.0后包含了一个叫做Stage3DManager的实现Stage3D结合其他ActionScript库的渲染的API,如和Starling协作,前提是要共享away3d的stage3d。

35.starling项目加载一个away3d项目,目前还没找到共享使用stage3d的方法,但可以使用Starling.current.stop(true);先暂停一切渲染,这时可能2d界面无法显示,可以加上setTimeout(Starling.current.render, 100); 卸载swf后记得调用Starling.current.start();启动Starling。(真实项目有纹理的时候有待测试)

36.feathers目前在新主题中非嵌入字体(使用设备字体),文字显示会偏上。

37.feathers中位图字体和设备字体无法混合使用,特别是用到了feathers组件(除非用starling文本框)。

38.关于Android和Ios后台运行机制:Android允许app后台运行,只是帧频降为4(满足socket最低连接要求);Ios应用在后台模式10分钟后整个进程会休眠,所以有些游戏打开后会进行重连。(这样某些需求就无法在ios下实现,如锁屏后app接到socket指令自动激活屏幕)

39.对于快速原型开发,使用flex mobile是个不错的选择(特别是应用类app),spark组件已针对移动端做了优化,但尽量不要使用矢量图和矢量动画。

40.多人开发,需要注意开发人员之间的配合、协作,使用统一的接口,统一访问各种资源;事先约定好开发规范,否则项目可能会陷入进退两难的境地。


挺好的总结!文章转自

你可能感兴趣的:(FeathersUI,Starling)