分享基于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配置:
<android>
        <manifestAdditions><![CDATA[
        <manifest android:installLocation="auto">
        <application>
                <activity>
                        <intent-filter>
                                <action android:name="android.intent.action.MAIN"/>
                                <category android:name="android.intent.category.LAUNCHER"/>
                        </intent-filter>
                        <intent-filter>
                                <action android:name="android.intent.action.VIEW"/>
                                <category android:name="android.intent.category.BROWSABLE"/>
                                <category android:name="android.intent.category.DEFAULT"/>
                                <data android:scheme="todoair"/>
                        </intent-filter>
                </activity>
        </application>
        </manifest>
        ]]></manifestAdditions>
</android>

<iPhone>
        <InfoAdditions><![CDATA[
                <key>UIDeviceFamily</key>
                <array>
                        <string>1</string>
                        <string>2</string>
                </array>
                <key>CFBundleURLTypes</key>
                <array>
                        <dict>
                                <key>CFBundleURLSchemes</key>
                                <array>
                                        <string>todoair</string>
                                </array>
                                <key>CFBundleURLName</key>
                                <string>MobileB</string>
                        </dict>
                </array>
        ]]></InfoAdditions>
        <requestedDisplayResolution>high</requestedDisplayResolution>
</iPhone>

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


挺好的总结!文章转自

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值