为Android开发flash

项目终于进行到目标实体性能测试和准备阶段,这次选择的实体是Android平板,此款平板采用图睿2芯片,1G内存,支持4点触控,符合我们的要求。

性能测试第一步是基准测试,分别是对创建3000个空Sprite计时,然后是在Away3D渲染1000个面。

空类创建在我的E5300+2G电脑上耗时2300毫秒,在平板上耗时12000毫秒,差6倍。

面渲染是统计fps的,在电脑上运行最高144fps,平板上最高20。这与flash导出时是否选GPU加速没关系,可能是相关驱动没做好。这个结果差不多也是6倍。想到E5300的两个核心频率加起来差不多5GHz,而平板的CPU频率是1GHz,差距可能就在这里。

接下来是测试Android中flash对多点触控的支持,虽然官方提供了相关类,但实际还是另一回事。

先前看到有人用越狱后的ipad测试flash的多点触控,结果是ipad支持11点触控,touch4支持5点。但是都不支持手势。

于是我写了类似的测试代码:

textfield.text="max points:"+Multitouch.maxTouchPoints+"\n"+
                    "support gesture:"+Multitouch.supportedGestures;
运行结果出人意料,最大点数:1,手势:不支持。

这里需要说明,Android不支持直接打开swf文件,因此所有测试都是在浏览器中进行的。后来我知道有软件可以打开本地swf,再次测试,结果相同。

我怀疑是Android的flash player插件无法完全使用整个系统的特性和性能(比如无法GPU加速),所以把目光投向了AIR,把代码用AIR发布,再打包成apk到平板上安装。

让flash直接导出apk着实费了一番周折,先前用的flash是绿色版,无法安装官方的air for android插件,因此重装了flash,重装时遇到exit code:7错误,安装后又遇到java runtime错误。

当然最后还是成功发布apk,运行结果让人略有一些惊喜:的确和浏览器版不一样,最大触控点是2,支持所有手势。

虽然依然没有完全利用平板的4个触控点,但是2点用在手势上已经完全足够了。

随后用同样的办法测试先前的两个基准项目。结果不变。这回的确是性能限制,没有办法了。

下面是Away3D+触控代码:

 package  
{
	import away3d.cameras.Camera3D;
	import away3d.containers.Scene3D;
	import away3d.containers.View3D;
	import away3d.debug.AwayStats;
	import away3d.materials.WireColorMaterial;
	import away3d.primitives.Sphere;
	import flash.display.Sprite;
	import flash.ui.Multitouch;
	import flash.ui.MultitouchInputMode;
	import flash.events.*;
	
	public class test extends Sprite 
	{		
		private var scene:Scene3D;
		private var camera:Camera3D;
		private var view:View3D;
		private var sp:Sphere;

		public function test() 
		{
			scene = new Scene3D();
			camera = new Camera3D();
			camera.z = -800;
			view = new View3D();
			view.scene = scene;
			view.camera = camera;
			view.x = stage.stageWidth / 2;
			view.y = stage.stageHeight / 2;
			addChild(new AwayStats(view));
			addChild(view);
			
			sp = new Sphere();
			sp.radius = 100;
			sp.segmentsH = 15;
			sp.segmentsW = 15;
			sp.material = new WireColorMaterial(0xff0000);
			scene.addChild(sp);
			
			Multitouch.inputMode = MultitouchInputMode.GESTURE;
			Multitouch.supportedGestures
			stage.addEventListener(Event.ENTER_FRAME, onEnter);
			stage.addEventListener(TransformGestureEvent.GESTURE_ZOOM, onZoom);
		}
		private function onZoom(e:TransformGestureEvent):void
		{
			camera.z += 10;
		}
		private function onEnter(e:Event):void
		{
			view.render();
		}

	}

}
代码中有Multitouch.inputMode = MultitouchInputMode.GESTURE;这一行,这是告诉flash把触控解释为什么,这里是解释为手势,还有两种选择,一是TOUCH_POINT,即解释为单个触控点,二是NONE,即解释为鼠标点击事件。

三种状态只能选择一种,而实际上往往既要手势,也要单点,这就存在冲突,解决的办法是,手势用多点的方法,单点继续用MOUSE事件。

转载于:https://www.cnblogs.com/wocdev/archive/2010/12/24/1916086.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值