使用Starling 对AIR 快速移植到ANDROID

最近在学习Starling与Air For Android开发。发现其实ADOBE的AIR为我们做了大部分的工作。包括一堆参数的设定等等。

接下来我们尝试对一个AS3写的PC端俄罗斯方块进行移植。

考虑到Starling的优势,我们先选择在纯FLASH 天然的情况下加入GPU渲染。

当中出现的问题的是:

1>尽量避免使用原生FLASH连接库

2>Texture纹理上传资源的限制,所以针对Texture.fromBitmap或者fromBitmapData的使用次数和上传的纹理大小要特别注意。

3>资源回收,这是个大问题,在单帧时间过长内存消耗过大的情况下,基本上是卡着不动的,GPU会耗死,总结了几点:

A.尽量减少侦听,一般使用过后立马回收

B.Sprite Image 等对象在不使用的时候 立马dispose()掉。

C.避免大批量addChild 对象。充分考虑对象重用,例如这次移植的俄罗斯方块的小方块,俄罗斯方块一般都是能四个小块组成所有形状。

考虑到对象重用 这里直接由始至终都是使用四个小方块对象。于每一个方块停顿后dispose()相比 这种方法能是内存的使用速率减慢2/3。

加入Starling之后再生成AIR程序所遇到的问题:

1>手机项目使用GPU加速的参数设置,应该在项目文件夹 <项目名字>+-app.xml 的文件的

在“</initialWindow>”前面增加两行
<renderMode>direct</renderMode>
<fullScreen>true</fullScreen>

(PC上是项目文件夹列表中打开html-template,右键用Open with->Text Editor打开html.template.html文件。在第48行插入一行代码:params.wmode = “direct”,确保SWF打开显卡的调用功能。)

2>不能使用BITMAPDATA等FLASH本身的原生类。考虑到此使用Starling的QUAD类直接在SPRITE上绘画。

不过这有一个确定就是帧频会下降大概20左右 具体原因暂时还不明白。

3> 生成的APK有17M大,应该是导出设置出了问题。暂时还不明白 记录下待以后研究下。

移植前后代码量:

原版源码:456行

加入STarling之后,真正运行的大概:600

从原生FLASH到STARLING 做了比较大的改动 主要是逻辑上和现实对象上的改动。再尽量修改少源码的情况下。。

其实还可以更少的。。有几个函数比较鸡肋 完全可以去掉。

加入到AIR项目移植到android之后大概:610

其实从使用STARLING框架之后再到andoroid 基本就是修改显示参数了。

AIR入口部分:
[cc lang=”JAVA”]
package
{
import flash.desktop.NativeApplication;
import flash.desktop.SystemIdleMode;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;

import starling.core.Starling;
import tool.Stats;

[SWF(width=”480″, height=”800″, frameRate=”60″, backgroundColor=”#123456″)]
public class Tetris_phone extends Sprite
{

protected var _starling : Starling;

public function Tetris_phone()
{
super();

// 支持 autoOrient
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.frameRate = 60;
NativeApplication.nativeApplication.systemIdleMode=SystemIdleMode.KEEP_AWAKE;
_init();
}

private function _init():void{
_loadComplete();
}

private function _loadComplete():void{

Starling.handleLostContext = true;
_starling = new Starling(Tetris , stage);
_starling.enableErrorChecking=false;
_starling.start();

this.addChild(new Stats());
}
}
}
[/cc]

源码

发表评论

邮箱地址不会被公开。 必填项已用*标注