• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
元某人的代码农场
博客园    首页    新随笔    联系   管理    订阅  订阅

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();
		}
		
        

}
PV3D源代码

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

posted @ 2010-11-05 23:24  元某人  阅读(2784)  评论(2)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3