PV3D和Away3D性能比较
由于项目要用到Flash开发3D动画,于是想起了曾经不知在何处看到了几个Flash流行3D类库,经过一番挑选找到PV3D和Away3D,都说PV3D性能高但不灵活,Away3D灵活但性能不高。性能的确是个很重要的考虑因素,二者性能究竟差多少,网上没有现成的答案,于是自己动手,丰衣足食。费了一番周折,运行成功PV3D和Away3D的例子,然后开始测试:
测试内容:显示旋转球体,球体表面分20000个三角形,半径都设为200,不要光照。
flash尺寸为800*600,fps:30,质量LOW。
PV3D实测值:15.6 fps
Away3D实测值:4.23 fps
虽然二者的性能都只能用不堪入目来形容,不过考虑到也不是用flash开发3D游戏,PV3D那个15fps也是能忍的。
Away3D源代码
package
{
import away3d.cameras.*;
import away3d.containers.*;
import away3d.core.utils.*;
import away3d.lights.*;
import away3d.materials.*;
import away3d.primitives.*;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
[SWF(backgroundColor="#000000", frameRate="30", quality="LOW", width="800", height="600")]
public class GE extends Sprite
{
//texture for globe
[Embed(source="test.png")]
public static var EarthImage:Class;
private var scene:Scene3D;
private var camera:Camera3D;
private var view:View3D;
private var t:Date;
private var total:int;
private var material:PhongBitmapMaterial;
//scene objects
private var sphere:Sphere;
private var spherecontainer:ObjectContainer3D;
public function GE()
{
init();
}
private function init():void
{
initEngine();
initMaterials();
initObjects();
initListeners();
total=0;
t=new Date();
}
private function initEngine():void
{
scene = new Scene3D();
camera = new Camera3D();
camera.z = -50;
view = new View3D();
view.scene= scene;
view.camera = camera;
addChild(view);
}
private function initMaterials():void
{
material = new PhongBitmapMaterial(Cast.bitmap(EarthImage));
material.specular = 0x1A1A1A;
material.shininess = 10;
}
private function initObjects():void
{
sphere = new Sphere();
sphere.material = material;
sphere.radius = 200;
sphere.segmentsW = 100;
sphere.segmentsH = 100;
spherecontainer = new ObjectContainer3D(sphere);
scene.addChild(spherecontainer);
}
private function initListeners():void
{
addEventListener(Event.ENTER_FRAME, onEnterFrame);
addEventListener(MouseEvent.CLICK,onClick);
onResize();
}
private function onClick(e:Event):void
{
var t2:Date=new Date();
var inv:int=t2.getTime()-t.getTime();
trace(total);
trace(inv/total);
}
private function onEnterFrame(e:Event):void
{
total+=1;
sphere.rotationY += 10;
view.render();
}
}
package {
import flash.display.Sprite;
import flash.events.*;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.materials.*;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
[SWF ( width = '800', height = '600', backgroundColor = '#000000', frameRate = '30' ) ]
public class test extends Sprite
{
private var viewport:Viewport3D;
private var scene:Scene3D;
private var camera:Camera3D;
private var renderer:BasicRenderEngine;
private var cube:Cube;
private var ball:Sphere;
private var total:int;
private var t:Date;
public function test()
{
initPapervision3D();
createCube();
beginRender();
total=0;
t=new Date();
}
private function initPapervision3D():void
{
viewport = new Viewport3D();
addChild(viewport);
scene = new Scene3D();
camera = new Camera3D();
renderer = new BasicRenderEngine();
}
private function createCube():void
{
var mp:BitmapFileMaterial = new BitmapFileMaterial("earth512.png");
ball = new Sphere(mp, 500, 100, 100);
scene.addChild(ball);
}
private function beginRender():void
{
addEventListener(Event.ENTER_FRAME, render);
addEventListener(MouseEvent.CLICK,onClick);
}
private function onClick(e:MouseEvent):void
{
var t2:Date=new Date();
var inv:int=t2.getTime()-t.getTime();
trace(total);
trace(inv/total);
}
private function render(e:Event):void
{
total+=1;
ball.yaw(2);
renderer.renderScene(scene, camera, viewport);
}
}
}
PS:PV3D忘了设置质量,flash给默认为HIGH了,不过性能差距这么明显,改为LOW只会加大差距了。
浙公网安备 33010602011771号