Starling基于stage3 d开发gpu加速的2d游戏

Post on 09-May-2015

2.065 views 1 download

Transcript of Starling基于stage3 d开发gpu加速的2d游戏

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling:基于Stage3D开发GPU加速的2D游戏

Peter Huang

Adobe Platform Evangelist

weibo.com/fans8

1Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

安装率

一致性

易用API

编程语言

工作流

为什么游戏开发者青睐Flash

2Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

游戏性能的需求

3Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

目前提升性能的方案:Pixel Blitting

BitmapData.copyPixels

Flash Player AIR

4Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

目前提升性能的方案:GPU加速矢量

AIR

仅适用于矢量图形在移动AIR应用的加速

<renderMode>gpu</renderMode>

5Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

我们需要GPU硬件加速!

•未来,运用CPU像素复制的方式并不是最高效的选择

•屏幕尺寸越来越大,分辨率越来越高,更会增加CPU压力

•运用GPU进行图像渲染才是终极解决之道

6Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

新的渲染方式:Stage3D

最新版本的Adobe® Flash® Platform runtimes提供了Stage3D API,

这是一套底层的GPU加速API,可以高效的运行在浏览器、桌面、移动设备、电视设备上.

Flash Player 11 AIR 3

7Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

2D对象如何通过GPU呈现?

8Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Low-Level Stage3D APIsvar vertices:Vector.<Number> = Vector.<Number>([-0.5,-0.5,0, 0, 0, // x, y, z, u, v-0.5, 0.5, 0, 0, 1,0.5, 0.5, 0, 1, 1,0.5, -0.5, 0, 1, 0]);

var vertexbuffer:VertexBuffer3D = context3D.createVertexBuffer(4, 5);

vertexbuffer.uploadFromVector(vertices, 0, 4);

var indexbuffer:IndexBuffer3D = context3D.createIndexBuffer(6);

indexbuffer.uploadFromVector (Vector.<uint>([0, 1, 2, 2, 3, 0]), 0, 6);

var bitmap:Bitmap = new TextureBitmap();var texture:Texture = context3D.createTexture(bitmap.bitmapData.width,bitmap.bitmapData.height, Context3DTextureFormat.BGRA, false);texture.uploadFromBitmapData(bitmap.bitmapData);

var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();

vertexShaderAssembler.assemble( Context3DProgramType.VERTEX,"m44 op, va0, vc0\n" + // pos to clipspace"mov v0, va1" // copy uv);

var fragmentShaderAssembler : AGALMiniAssembler= new AGALMiniAssembler();

fragmentShaderAssembler.assemble( Context3DProgramType.FRAGMENT,"tex ft1, v0, fs0 <2d,linear, nomip>;\n" +"mov oc, ft1");

9Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

上述方法对初学者来说不易

10Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling

starling-framework.org

开源框架

11Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling

•纯ActionScript 3库•模仿传统的Flash Displaylist架构(Sprite,MovieClip..)•所有内容由GPU直接渲染•渲染性能具有质的飞跃•新增Bitmap字体显示、Sprite Sheet、粒子效果等特性

12Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling让开发者更快上手

// 创建材质对象

var texture:Texture = Texture.fromBitmap ( new embeddedBitmap() );

//创建图像对象

var image:Image = new Image(texture);

// 设置坐标属性

quad.pivotX = 50;

quad.pivotY = 50;

quad.x = 300;

quad.y = 150;

quad.rotation = Math.PI/4;

// 显示

addChild(quad);

13Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling经典案例

Rovio公司在Adobe MAX 2011 Keynote上展示了基于Straling创建的Angry Birds网页版

14Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling经典案例

作者最初采用Flash Blitting方式创建此游戏并通过AIR发布在

iOS App Store/Android Market/BlackBerry平台上

现在用Starling框架后实现60fps满帧运行

http://bit.ly/pbKvz3

15Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling经典案例

http://www.waste-creative.com/games/invaders/

16Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling经典案例

基于Starling框架开发的一个开源小游戏

http://www.whacksite.com/

17Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling核心API

Thin layer (80kb), on top of Stage3D

18Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling核心显示API

starling.display

19Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling中的事件

Starling具有丰富的事件机制来管理各种行为

•Bubbling of events (propagation)•Event.ADDED, Event.ADDED_TO_STAGE, Event.REMOVED,Event.REMOVED_FROM_STAGE•Event.TRIGGERED, Event.MOVIE_COMPLETED•Event.FLATTEN, Event.RESIZE•Event.ENTER_FRAME•ResizeEvent.REISIZE•TouchEvent.TOUCH•KeyboardEvent.KEY_UP, KeyboardEvent.KEY_DOWN•事件基于EnterFrameEvent.ENTER_FRAME

20Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

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() {! ! !! ! ! stage.align = StageAlign.TOP_LEFT;! ! ! stage.scaleMode = StageScaleMode.NO_SCALE;! !! // create our Starling instance mStarling = new Starling(Game, stage);  ! // set anti-aliasing (higher the better quality but slower performance) ! mStarling.antiAliasing = 1;  ! // start it! mStarling.start(); } }}

正式发布项目时•根据项目设置合适的Anti-aliasing质量

•关闭代码中error checking

•请将代码按正式版(Release Build)发布

Starling简单起步及编译小提示

21Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling中的显示对象

•Quad•Image•Sprite•MovieClip•Button•Textfield•....

22Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Quad对象

•最简单基础的显示元素•无材质贴图,仅定点坐标及颜色参数构成•Color interpolated on the GPU

Example :

q = new Quad(200, 200);q.setVertexColor(0, 0x000000);q.setVertexColor(1, 0xAA0000);q.setVertexColor(2, 0x00FF00);q.setVertexColor(3, 0x0000FF);addChild (q);

Solid color :

q.color = 0x00FF00; starling.display.Quad

23Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Image对象•Image对象扩展至Quad,即添加了材质的Quad•对于Image对象,你需要为其赋予材质(Texture)•提前创建/上载材质优于需要时临时创建•状态跟踪 (setTexture – 相对消耗资源)•采用压缩的材质

Example :

// create the texturevar sausageBitmap:Bitmap = new Sausage();

// create the texturevar texture:Texture = Texture.fromBitmap(sausageBitmap);

// create the Imagevar image:Image = new Image ( texture );

// display itaddChild ( image );

Tint :

image.color = 0xFF0000;

starling.display.Image

24Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Image中材质处理

//提前为Image对象创建好材质及位图数据

var texture:Texture = Texture.fromBitmap(sausageBitmap);! ! !for (var i:int = 0; i < NUM_SAUSAGES; i++) {! // create a Image object with our one texture! var image:Image = new Image(texture);

for (var i:int = 0; i < NUM_SAUSAGES; i++) { // 每创建一个Image对象就在内存中新建一个材质及位图

! // for each sausage! var image:Image = new Image(Texture.fromBitmap(new Sausage()));

正确做法

不正确做法

25Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

动态材质

如何将动态绘制的图形(shapes)用作材质?•使用传统图形绘制 (shape.graphics)•绘制完成后,点阵化并上载至GPU•提前绘制预存而非需要时临时处理

Example :

// create a BitmapData buffervar bmd:BitmapData = new BitmapData(radius * 2, radius * 2, true, color);

// draw the shape on the bitmapbuffer.draw(s);

// create a Texture out of the BitmapDatavar texture:Texture = Texture.fromBitmapData(buffer);

// create an Image out of the texturevar image:Image = new Image(texture);

// show it!addChild(image);

26Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Starling中的碰撞检测

•边缘检测 (半径、rectangle...)•材质中用到的BitmapData API (原有的 BitmapData.hitTest方法等)•嵌入第三方碰撞/物理引擎(Box2D..)•碰撞检测太消耗运算资源将影响渲染性能,尽可能的优化碰撞算法!

Example :

private function onFrame(event:Event):void{ point1.x = sausageImage1.x; point1.y = sausageImage1.y; point2.x = sausageImage2.x; point2.y = sausageImage2.y;  if ( sausageBitmapData1.hitTest(point2, 255, sausageBitmapData1, point1, 255)) { trace("touched!"); }}

27Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

按钮

•Starling中的按钮即是容器 (扩展自DisplayObjectContainer)•你可以为按钮赋予各种图片材质•具有一些特别的行为事件 (如auto scale等)

Example :

// create a Bitmap object out of the embedded imagevar buttonSkin:Bitmap = new ButtonTexture();! ! !// create a Texture object to feed the Button objectvar texture:Texture = Texture.fromBitmap(buttonSkin);! ! !// create a button using this skin as up statevar myButton:Button = new Button(texture, "Play");

// display itaddChild (myButton);

starling.display.Button

28Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Sprite对象

•Sprite属于容器 (扩展自 starling.display.DisplayObject)

•跟原生的Display List中Sprite一致,Starliing中的Sprite也

是最轻量级的容器

starling.display.Sprite

29Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Flat Sprite

•flatten方法可以提升渲染性能•如同cacheAsBitmap一样简单好用•在渲染一个树形显示队列的时候此方法相当有用•子对象有变化的时候,需要重新调用此方法相应变化

Example :

// freeze the childrencontainer.flatten();

// assign changes to a childchild.scaleX = child.scaleY = .5;

// refreshcontainer.unflatten()

30Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Flat Sprite

在没有运用Flatten方法时渲染机制

对每个显示对象对立进行数据运算

子对象越多消耗运算越多,从而影响性能

31Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Flat Sprite

运用Flatten方法后渲染机制

获取所有子对象的几何数据于一个大的缓冲中

绘制整个显示数列时仅调用一次draw

32Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

MovieClip对象

•类似原生的时间轴MC•每帧可具有不同的材质•灵活可控的方法 (自定义运动帧频, addFrame, removeFrameAt, 等)•不支持嵌套 (MovieClip 扩展自 Image)•不支持在帧上使用Script脚本

Example :

// retrieve the frames the running boy framesvar frames:Vector.<Texture> = sTextureAtlas.getTextures("running_");

// creates a MovieClip playing at 40fpsmMovie = new MovieClip(frames, 40);

starling.display.MovieClip

33Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Sprite Sheet

•Sprite Sheet让你将展现一个对象的各个材质组合在一张图片上(动画序列图, UI的皮肤等)•图片尺寸请使用2的阶乘以获得更好性能和节省内存 (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, ...)•Stage3D 限制最大的材质图片为 2048 x 2048 像素•如果其中素材超过了尺寸限制,请创建多个

34Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Texture Atlases

•Texture Atlases(材质图集)比Sprite Sheets更优化

•将游戏中用到的各种元素集合在一个大的图片中

•减少数据、材质上载至GPU的频度•图片尺寸尽可能为2的阶乘(1, 2, 4,

8, 16, 32, 64, 128, 256, 512, ...)•在一张图片中尽可能集合多的元素

35Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

创建Sprite Sheet和Texture Atlases的工具

下一个版本的Flash Pro将集成此功能!

可以将一个或多个Graphic/MovieClip对象导出为Sprite Sheet

36Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

创建Sprite Sheet和Texture Atlases的工具

TexturePacker

http://www.texturepacker.com/

37Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

创建Sprite Sheet和Texture Atlases的工具

Dynamic Texture Atlas Generator

https://github.com/emibap/Dynamic-Texture-Atlas-Generator

•作为Starling扩展的开源AS3项目

•将原生的MovieClip动态转换为Texture Atlases

•点阵化MovieClip的每一帧,创建到位图材质中

•初始化游戏时会占用一些时间

•使用原生矢量MC,减少了SWF文件的尺寸(以动态生成时间为代价)

38Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Juggler对象

•让Starling中的MovieClip对象动起来

•Starling对象默认具有Juggler

•你可以灵活的创建多个Juggler对象来控制游戏的不同部分

(主场景、背景、菜单等)

Example :

// retrieve the frames the running boy framesvar frames:Vector.<Texture> = sTextureAtlas.getTextures("running_");

// creates a MovieClip playing at 40fpsmMovie = new MovieClip(frames, 40);

// play it!Starling.juggler.add ( mMovie );

39Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

暂停与继续

•在程序的任何地方都可以访问到核心的Starling对象以及主juggler

•Starling.current.start()/Starling.current.stop()为全局方法,将开始/停止全部

渲染及事件相应

•将游戏分作各个模块并创建各自的juggler(如点击暂停按钮时,暂停游戏主场景,

播放暂停面板相关动画等.)

Example :

private function onFrame(event:EnterFrameEvent):void{ if ( paused ) alertBox.advanceTime ( event.passedTime ); else battle.advanceTime( event.passedTime );  dashboard.advanceTime ( event.passedTime );}

40Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

控制资源及对象生命周期

•当不需要对象时请使用Dispose方法•及时删除无用的listeners : removeEventListeners() or removeChild(child, dispose) or removeFromParent(true)

•注意区分starling.displayObject.dispose/ texture.dispose •对所有显示对象,调用dispose将自动删除其中的listeners,同时也删除GPU中的缓存buffer

•对于Texture对象,将从GPU显存中清除此材质

41Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

与原生API结合

•GPU方式并非无所不能,我们需要在游戏中结合原生的元素•如目前在文字输入时,我们依旧需要原生的text input•Starling提供了 Starling.current.nativeOverlay方法让你随时访问原生对象

Example :

var textInput:flash.text.TextField = new flash.text.TextField();textInput.type = TextFieldType.INPUT;Starling.current.nativeOverlay.addChild(textInput);

42Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Text对象

•Starling框架提供了更快的文本显示方式•TextField 和 BitmapFont API•TextField 采用原生TextField来渲染并作为材质上载到GPU•BitmapFont 采用位图字形 (将文字以位图形式保存在spritesheet)

43Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

位图文字创建工具

GlyphDesigner

http://glyphdesigner.71squared.com/

Bitmap Font Generator

http://www.angelcode.com/products/bmfont/

44Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

粒子系统•ParticleDesignerPS对象让你在Starling中快速的创建粒子系统•粒子系统让你的游戏更绚•相对传统粒子性能更加强大•粒子系统相关代码作为扩展在Github上下载:https://github.com/PrimaryFeather/Starling-Extension-Particle-System

Example :// load the particle emitter configvar psConfig:XML = XML(new StarConfig());// upload the particlevar psTexture:Texture = Texture.fromBitmap(new StarParticle());// assemble themmParticleSystem = new ParticleDesignerPS(psConfig, psTexture);

// emitter positionmParticleSystem.emitterX = 800;mParticleSystem.emitterY = 240;

// start itmParticleSystem.start();// show it!addChild(mParticleSystem);// animate itStarling.juggler.add(mParticleSystem);

45Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

粒子编辑工具

http://particledesigner.71squared.com/

Particle Designer

46Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

粒子编辑工具

http://onebyonedesign.com/flash/particleeditor/

Particle Editor

47Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

其他资源

•Starling官方站点

http://www.starling-framework.org/

•Starling学习手册下载

http://www.bytearray.org/?p=3371

•论坛用户贡献的扩展包(如MrDoob Stats、Robotlegs等)

http://forum.starling-framework.org/topic/list-of-user-contributions

•Starling优化技巧

http://villekoskela.org

48Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

Stage3D相关其他2D框架

•ND2Dhttps://github.com/nulldesign/nd2d•M2Dhttps://github.com/egreenfield/M2D•REMXhttps://github.com/sleep2death/sl2d-framework•SL2Dhttps://github.com/sleep2death/sl2d-framework

49Thursday, December 1, 2011

Show Time!!

50Thursday, December 1, 2011

Q & Ajunhuang@adobe.comwww.fans8.comweibo.com/fans8

51Thursday, December 1, 2011

© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.

52Thursday, December 1, 2011