项目终于进行到目标实体性能测试和准备阶段,这次选择的实体是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事件。