stage3D之启动GPU加速

很多教程都会在开始讲到关于stage3D显示层级的概念,不知道大家有没有在这方面有所了解,没有了解也没关系,笔者制作过一个视频教程,里面讲到了这方面内容,具体的请看《stage3D理论概述》这篇文章。

估计大家可能现在对stage3D中的一些新增的类有些模糊,很多人看到flash.display3D这个包中的一大堆陌生的单词有些胆怯。其实大家不需要这么紧张,如果你仔细翻看最新的API文档的话,你还是能够看到,其中大部分类都定义了一些常量。而我们真正需要的功能类就只有少数的几个,如果你非要精简到最简单的话,那么你只需要4个类即可完成一个最简单的DEMO。

这四个类分别是:Context3D,VertexBuffer3D,IndexBuffer3D,Program3D。实际上如果你不考虑贴图的话,这四个类基本上可以称得上时stage3D的四大天王了。那么如何正确使用这写stage3D的API呢?下面就来为大家介绍一下如何开启stage3D功能。因为看到很多朋友在一开始接触stage3D的时候无法将舞台正确的实例化,但是错误的工作流不会引发运行时错误,这也就导致大家在学习的时候摸不到头脑,总会认为是在AGAL上面出现问题,比较我们现在还无法在GPU运行时将寄存器中的数据trace出来。好了我们来看看如何初始化这部分功能的吧。

由于我们对于stage3D的编程的目的最终都是可视化,所以我们不得不在制作时考虑一下关于stage的问题,这就需要我们在一开始就检测stage是否初始化完成,不要存在疑惑。很多人觉得stage在程序一开始运行的时候就会第一次被实例化并且创建出来,实际上这样做是相当危险的。因为你可能在不经意间为你的程序埋下了一颗定时炸弹。

所以我们第一部分的代码应该使用如下语句:

//侦听舞台创建		
this.addEventListener(Event.ADDED_TO_STAGE,init);

不必担心,这个代码是早在AS3出现的时候就一起出现的了。如果你对这个事件还是非常陌生,或者说一知半解,那么你可以翻翻我们伟大的API文档,里面会告诉你关于它的所有秘密。

当我们事件监听触发之后,我们就可以放手来选择我们想使用的stage3D层了,这里需要说明一下,在大部分机器中我们都能正常的使用4个stage3D图层,但是考虑到目前这些图层的特性和环境的因素,我还是推荐大家默认使用编号为0的这个stage3D图层,以免发生不必要的意外。创建并监听stage3D是否启动,请看下面代码:

//舞台创建相应函数
		private function init( evt:Event ):void
		{
			//注销舞台创建侦听
			this.removeEventListener(Event.ADDED_TO_STAGE,init);
			//侦听stage3D启动事件
			var stage3d:Stage3D = stage.stage3Ds[this.stageIndex];
			stage3d.addEventListener(Event.CONTEXT3D_CREATE, stage3d_scene_create_headler);
			//启动stage3D
			stage3d.requestContext3D();
		}

OK!通过这样几句简单的代码,我们在运行的时候就可以安全的启动GPU加速功能了,那么在启动之后我们能做什么呢?一句话总结:把你的3D梦想变成现实!

为了验证我们GPU的一些数据,我们仅仅做了一个非常简单的代码就是将图形库驱动程序类型打印出来。代码如下:

//stage3d启动成功响应事件
		private function stage3d_scene_create_headler( evt:Event ):void
		{
			//将可编程管道取值
			this.context3d = stage.stage3Ds[this.stageIndex].context3D;
			trace(“Your stage3D is created!”);
			//打印图形库驱动程序类型
			trace(“Graphics library driver:” + this.context3d.driverInfo);
		}

由于我这里使用的是MAC机器,所以打印出的内容为:

Your stage3D is created!

Graphics library driver:OpenGL (Direct blitting)

下面应该是大家看这篇文章的时候迫切想看到的全部代码!

package
{
	import flash.display.Sprite;
	import flash.display.Stage3D;
	import flash.display3D.Context3D;
	import flash.events.Event;

/**
 * 程序入口,负责开启stage3D功能 
 * @author mebius.A闪(张鑫磊)
 * 
 */
public class stage3Dstudy extends Sprite
{

	/*------ property ------*/
	private var stageIndex:uint = 0;
	private var context3d:Context3D;
	/*------ function ------*/
	/**
	 * 创建一个stage3Dstudy对象 
	 * 
	 */
	public function stage3Dstudy()
	{
		//侦听舞台创建
		this.addEventListener(Event.ADDED_TO_STAGE,init);
	}
	//舞台创建相应函数
	private function init( evt:Event ):void
	{
		//注销舞台创建侦听
		this.removeEventListener(Event.ADDED_TO_STAGE,init);
		//侦听stage3D启动事件
		var stage3d:Stage3D = stage.stage3Ds[this.stageIndex];
		stage3d.addEventListener(Event.CONTEXT3D_CREATE, stage3d_scene_create_headler);
		//启动stage3D
		stage3d.requestContext3D();
	}
	//stage3d启动成功响应事件
	private function stage3d_scene_create_headler( evt:Event ):void
	{
		//将可编程管道取值
		this.context3d = stage.stage3Ds[this.stageIndex].context3D;
		trace("Your stage3D is created!");
		//打印图形库驱动程序类型
		trace("Graphics library driver:" + this.context3d.driverInfo);
	}
}

}