守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1482|回复: 0

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

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51691
    钢镚
    1422

    开源英雄守望者

    发表于 2015-4-8 20:20:27 | 显示全部楼层 |阅读模式
    好久没来了,今天有空就把我在AIR Mobile开发中总结的问题给大家分享下:

    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配置:
    1. <android>
    2.         <manifestAdditions><![CDATA[
    3.         <manifest android:installLocation="auto">
    4.         <application>
    5.                 <activity>
    6.                         <intent-filter>
    7.                                 <action android:name="android.intent.action.MAIN"/>
    8.                                 <category android:name="android.intent.category.LAUNCHER"/>
    9.                         </intent-filter>
    10.                         <intent-filter>
    11.                                 <action android:name="android.intent.action.VIEW"/>
    12.                                 <category android:name="android.intent.category.BROWSABLE"/>
    13.                                 <category android:name="android.intent.category.DEFAULT"/>
    14.                                 <data android:scheme="todoair"/>
    15.                         </intent-filter>
    16.                 </activity>
    17.         </application>
    18.         </manifest>
    19.         ]]></manifestAdditions>
    20. </android>

    21. <iPhone>
    22.         <InfoAdditions><![CDATA[
    23.                 <key>UIDeviceFamily</key>
    24.                 <array>
    25.                         <string>1</string>
    26.                         <string>2</string>
    27.                 </array>
    28.                 <key>CFBundleURLTypes</key>
    29.                 <array>
    30.                         <dict>
    31.                                 <key>CFBundleURLSchemes</key>
    32.                                 <array>
    33.                                         <string>todoair</string>
    34.                                 </array>
    35.                                 <key>CFBundleURLName</key>
    36.                                 <string>MobileB</string>
    37.                         </dict>
    38.                 </array>
    39.         ]]></InfoAdditions>
    40.         <requestedDisplayResolution>high</requestedDisplayResolution>
    41. </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.多人开发,需要注意开发人员之间的配合、协作,使用统一的接口,统一访问各种资源;事先约定好开发规范,否则项目可能会陷入进退两难的境地。






    本文来自:http://bbs.9ria.com/thread-284731-1-1.html
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-8-20 21:41 , Processed in 0.040784 second(s), 37 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表