引进Starling(二)

作者的话:本系列为Starling的引进教程,原文《Introducing Starling - rev 1.2.6》。前两章系转帖,原文地址:http://www.adobe.com/cn/devnet/flashplayer/articles/introducing_Starling.html。从第三部分起,为本人独立翻译,争取一周内发表完成。


入门

你可以访问官方的 Github页面*下载Starling。 此外,你可能发现访问Starling 网站*也会受益匪浅。

Starling根据 Simplified BSD许可获得授权,所以你可以在任何类型的商业或者非商业项目上使用Starling。 如果你需要更多的信息,你可以联系Starling 框架团队

在你下载Starling之后,你可以像引用其它AS3库一样引用Starling库。 为了使用Flash Player 11 beta的新版本,你必须把SWF版本13作为目标,这是通过将额外的编译器参数即-swf-version=13 传递给Flex编译器实现的。如果你正在使用 Adobe Flex SDK,那么请按照如下步骤操作:

  1. Flash Player 11*下载新的playerglobal.swc。
  2. 从Flex 4.5 SDK表中下载 Flex 4.5 SDK* (4.5.0.20967)。
  3. 将相应的版本安装到你的开发环境中。
  4. 在 Flash Builder 中,通过选中File > New > ActionScript project 创建一个新的ActionScript项目。
  5. 打开 Property inspector(右击并选中Properties选项)。 在左边的菜单列表中,选中ActionScript Compiler。
  6. 使用右上角的 Configure Flex SDK 选项将项目指向 Flex build 20967。单击OK。
  7. 设置你的项目目标为SWF版本13。
  8. 打开Property inspector并从左侧菜单列表选中 ActionScript Compiler。
  9. -swf-version=13 添加至 'Additional compiler arguments' 输入。这就保证了输出的 SWF 把 SWF 版本13当做目标版本。如果你在命令行而不在 Flash Builder 中进行编译,那么你必须添加相同的编译器参数。
  10. 核查你已经在你的浏览器中安装了新的Flash Player 11 版本。
设置你的场景

在你已经准备好了你的开发环境之后,你就可以深入研究相应的代码,并且看看你如何能够充分利用这一框架。 使用 Starling 非常简单,你只需创建一个 Starling 对象并添加到你的主类即可。 在本文中,当涉及到诸如 MovieClip, Sprite 以及其它对象时,我所指的都是 Starling APIs,而不是来源于 Flash Player 的本地对象。

首先,Starling构造器(constructor)需要多重参数。 下面是签名:

public function Starling(rootClass:Class, stage:flash.display.Stage, 
                         viewPort:Rectangle=null, stage3D:Stage3D=null,
                         renderMode:String="auto")
事实上,只有前面3个经常使用。 相关的 rootClass 参数需要一个至扩展 starling.display.Sprite 的类的引用,而第二个参数是我们的 stage,然后是一个 Stage3D 对象:

package 
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import starling.core.Starling;
    
    [SWF(width="1280", height="752", frameRate="60", backgroundColor="#002143")]
    public class Startup extends Sprite
    {
        private var mStarling:Starling;
        
        public function Startup()
        {
        	// stats class for fps
	addChild ( new Stats() );
			
	stage.align = StageAlign.TOP_LEFT;
	stage.scaleMode = StageScaleMode.NO_SCALE;
		
	// create our Starling instance
            	mStarling = new Starling(Game, stage);

           	// set anti-aliasing (higher is better quality but slower   		    performance)
               mStarling.antiAliasing = 1;

           	// start it!
	mStarling.start();
        }
    }
}
在下面的代码中,Game类在被添加到 Stage 时可以创建一个简单的四边形:

package 
{
    import starling.display.Quad;
    import starling.display.Sprite;
    import starling.events.Event;

    public class Game extends Sprite
    {
	private var q:Quad;
		
        public function Game()
        {	
	addEventListener(Event.ADDED_TO_STAGE, onAdded);
        }
		
		private function onAdded ( e:Event ):void
            {
	q = new Quad(200, 200);
	q.setVertexColor(0, 0x000000);
	q.setVertexColor(1, 0xAA0000);
	q.setVertexColor(2, 0x00FF00);
	q.setVertexColor(3, 0x0000FF);
	addChild ( q );
             }
    }
}

上述代码将一个侦听器添加到 Event.ADDED_TO_STAGE 事件中,并在事件处理程序中对应用程序进行初始化。 这样你就可以安全地访问 Stage。

注意: 关注一下这个微妙的细节:上面描述的 Game 类从 starling.display 程序包中,而不是从 flash.display 程序包中扩展了 Sprite 类。必须检查你的导入语句并确保你不是使用本地 API 来替代 Starling API。

正如在 Flash 中所预期的,Starling 中的对象有一个默认的位置0,0。因此添加几行命令使四边形位于 Stage 的中央:

q.x = stage.stageWidth - q.width >> 1;
q.y = stage.stageHeight - q.height >> 1;
现在,测试一下项目以便于观察相应的结果(参见图8):

图8. 四边形位于Stage的中央

注意锯齿消除功能(anti-aliasing)值允许你设置锯齿消除功能所需的类型。 一般来说,值为1就基本上可以接受,但是你可以选择其它值。 该框架支持的锯齿消除功能(anti-aliasing)值的变化范围是0到16,但是,下面的列表给出了最常用的值:

  • 0: 无锯齿消除(anti-aliasing)。
  • 2: 最低程度的锯齿消除(anti-aliasing)。
  • 4: 高质量的锯齿消除(anti-aliasing)。
  • 16: 极高质量的锯齿消除(anti-aliasing)。

你很少需要用到超过2的设置,尤其是对2D内容。 然而,根据你的项目要求,你需要针对具体情况作出相应的决定。 在图9中,比较一下两个截图,观察两个锯齿消除(anti-aliasing)值(1和4)之间的细微差别。


图9. 比较一下锯齿消除(anti-aliasing)值为1(左)和4(右)之间的视觉差别

试验一下使用2以上的值为你的项目设置所需的质量。 当然,选择较高的值会影响性能。 注意 Stage3D 不会受到 SWF 文件的 Stage 质量影响。

下面给出能够与 Starling 对象一起使用的其它 API 的描述:

  • enableErrorChecking: 允许你启用或者禁止启用错误检查。 指定是否将渲染器遇到的问题报告给应用程序。 当 enableErrorChecking 设置为ture时,Starling 内部调用的 clear() 和 drawTriangles() 方法是同步的并可以抛出错误。 当 enableErrorChecking 设置为 false 时,clear() 和 drawTriangles() 方法是异步的且不报告错误。 启用错误检查将会减弱渲染性能。 只有当调试项目时启用错误检查功能,而在部署最终版本前禁止启用该功能。
  • isStarted:指示是否调用了 start。
  • juggler: juggler 是一个简单对象。 它仅保存了一列执行 IAnimatable 的对象,并且在被要求这样做的情形下提前了它们的时间(通过调用它自己的 advanceTime:方法)。 当一个动画完成时,它将会将其抛弃。
  • start: 开始渲染和进行事件处理。
  • stop: 停止渲染和进行事件处理。 当游戏进入后台运行状态以节约资源时,使用这个方法可以停止渲染。
  • dispose: 当你希望处理当前 GPU 内存上已渲染的全部内容时,调用这个方法。 该API能够在其内部处理了一切事务(例如着色程序(shader programs)、纹理和其它一切事务)。

一旦创建了你的 Starling 对象,调试记录会自动地输出,显示关于渲染的信息。 在默认情形下,当 SWF 文件正确地嵌入到页面或者当在独立的 Flash Player 中进行测试时,Starling 会输出如下代码:

[Starling] Initialization complete.
[Starling] Display Driver:OpenGL Vendor=NVIDIA Corporation Version=2.1 NVIDIA-7.2.9 Renderer=NVIDIA GeForce GT 330M OpenGL Engine GLSL=1.20 (Direct blitting)

当然,特定的硬件细节将会随着你的配置而变化。 上述信息表明已经使用了 GPU 加速功能,因为它包括驱动版本的细节。 为了便于调试,你可能希望能够强迫 Flash Player 内部使用的软件回退,以便了解当你的内容在软件上运行时它的表现如何。

添加如下的代码以便于通知 Starling 你希望使用软件回退功能(software rasterizer):

mStarling = new Starling(Game, stage, null, null, Context3DRenderMode.SOFTWARE);
当你使用软件时,输出的信息会确认你正在使用software 模式:

[Starling] Initialization complete.
[Starling] Display Driver:Software (Direct blitting)

确保你也在 software 模式下测试了你的内容,以便于更好地了解它在这种模式下的性能。 如果用户的配置使用旧版本的驱动(为了保持一致性,所有2009年之前的驱动都包含于黑名单中),那么你的内容可能回退到软件。

在下一节中,当你将你的 SWF 文件嵌入到页面时,你需要看一下 Stage3D 的要求。

Wmode 要求

你必须记住为了启用Stage 3D 和 GPU 加速功能,在页面中你必须使用 wmode=direct 作为嵌入模式。 如果你没有指定任何值或者选择除"direct"之外其它值,例如 "transparent"、"opaque" 或 "window",则Stage 3D 将均不可用。相反,当requestContext3D onStage3D被调用时,你会得到一个运行时异常的提示,告知你Context3D对象的创建失败。

下图列举了一个运行时异常的对话框:

图10. 在 Context3D不可用的情形下,运行时异常对话框

如果你的应用程序嵌入时使用了错误的wmode,那么必须小心处理这种情形。 你需要通过显示一条解释这一问题的信息以便给出合理的响应。 幸运的是,Starling为你自动地处理了这一问题并显示如下信息:

图11. 当应用程序没有正确嵌入时显示的警告

STAGE质量

作为一个Flash开发人员,stage质量的概念对你来说并不陌生。 记住当使用 Stage3D以及作为结果的Starling时,stage质量不会影响相应的性能。

渐进的增强功能

当GPU加速功能不起作用时,Stage3D将回退到软件中,并且将在内部使用一个名称为SwiftShader (Transgaming)的软件回退引擎。 为了保证你的内容在此种情形下运行正常,你需要检测什么时候你应该在software模式下运行,并且移除在software模式下可能会减慢运行速度的潜在影响。

在2D内容环境下,软件回退功能能够处理很多对象并提供良好的性能,但是,为了检测这一点,你仍然可以使用静态的属性环境从Starling对象中读取Context3D对象:

// are we running hardware or software?
var isHW:Boolean = Starling.context.driverInfo.toLowerCase().indexOf("software") == -1;


记住使用软件回退功能设计你的内容是一种很好的做法,它将提供一种渐进式的体验,从而确保在任何情形下都能获得最佳体验效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值