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只会加大差距了。