52
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. Starling:基于Stage3D开发GPU加速的2D游戏 Peter Huang Adobe Platform Evangelist weibo.com/fans8 1 Thursday, December 1, 2011

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

Embed Size (px)

Citation preview

Page 1: 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

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

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

安装率

一致性

易用API

编程语言

工作流

为什么游戏开发者青睐Flash

2Thursday, December 1, 2011

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

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

游戏性能的需求

3Thursday, December 1, 2011

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

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

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

BitmapData.copyPixels

Flash Player AIR

4Thursday, December 1, 2011

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

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

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

AIR

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

<renderMode>gpu</renderMode>

5Thursday, December 1, 2011

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

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

我们需要GPU硬件加速!

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

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

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

6Thursday, December 1, 2011

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

© 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

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

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

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

8Thursday, December 1, 2011

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

© 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

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

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

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

10Thursday, December 1, 2011

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

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

Starling

starling-framework.org

开源框架

11Thursday, December 1, 2011

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

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

Starling

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

12Thursday, December 1, 2011

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

© 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

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

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

Starling经典案例

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

14Thursday, December 1, 2011

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

© 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

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

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

Starling经典案例

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

16Thursday, December 1, 2011

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

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

Starling经典案例

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

http://www.whacksite.com/

17Thursday, December 1, 2011

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

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

Starling核心API

Thin layer (80kb), on top of Stage3D

18Thursday, December 1, 2011

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

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

Starling核心显示API

starling.display

19Thursday, December 1, 2011

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

© 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

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

© 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

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

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

Starling中的显示对象

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

22Thursday, December 1, 2011

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

© 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

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

© 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

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

© 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

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

© 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

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

© 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

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

© 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

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

© 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

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

© 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

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

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

Flat Sprite

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

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

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

31Thursday, December 1, 2011

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

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

Flat Sprite

运用Flatten方法后渲染机制

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

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

32Thursday, December 1, 2011

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

© 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

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

© 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

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

© 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

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

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

创建Sprite Sheet和Texture Atlases的工具

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

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

36Thursday, December 1, 2011

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

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

创建Sprite Sheet和Texture Atlases的工具

TexturePacker

http://www.texturepacker.com/

37Thursday, December 1, 2011

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

© 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

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

© 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

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

© 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

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

© 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

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

© 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

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

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

Text对象

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

43Thursday, December 1, 2011

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

© 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

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

© 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

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

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

粒子编辑工具

http://particledesigner.71squared.com/

Particle Designer

46Thursday, December 1, 2011

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

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

粒子编辑工具

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

Particle Editor

47Thursday, December 1, 2011

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

© 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

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

© 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

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

Show Time!!

50Thursday, December 1, 2011

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

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

52Thursday, December 1, 2011