项目终于进行到目标实体性能测试和准备阶段,这次选择的实体是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;
这里需要说明,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(); } } }
三种状态只能选择一种,而实际上往往既要手势,也要单点,这就存在冲突,解决的办法是,手势用多点的方法,单点继续用MOUSE事件。