加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【转】Starling 2D框架简介(一)

发布时间:2020-12-15 20:08:47 所属栏目:百科 来源:网络整理
导读:本系列是对Introducing Starling pdf的翻译,下文是对adobe开发人员中心的一片日志的转载,地址为http://www.adobe.com/cn/devnet/flashplayer/articles/introducing_Starling.html Starling 是在 Stage3D APIs 基础上开发的一种 ActionScript 3 2D 框架(可

本系列是对Introducing Starling pdf的翻译,下文是对adobe开发人员中心的一片日志的转载,地址为http://www.adobe.com/cn/devnet/flashplayer/articles/introducing_Starling.html

Starling 是在 Stage3D APIs 基础上开发的一种 ActionScript 3 2D 框架(可用于 Flash Player 11 和 Adobe AIR 3的桌面)。 Starling 是为游戏开发设计的,但是你可以将它应用于很多其它的应用程序。 在不必涉及低级 Stage3D APIs 情况下,Starling 使得编写具有快速 GPU 加速功能的应用程序成为可能。

大多数 Flash 开发人员希望利用这种能力提高 GPU 的加速功能(通过使用 Stage3D 技术),而不必编写如此高级的框架和深入研究低级的 Stage3D APIs。 Starling 是完全基于 Flash Player APIs 而设计,并将 Stage3D(Molehill)复杂性抽象化。 因此每个人都能看到直观的程序。

Starling 是为 ActionScript 3开发人员而设计,尤其是这些涉及2D游戏开发的人员。 在使用 ActionScript 3 之前,你必须基本了解它。由于 Starling 轻便、灵活并易于使用,你也可以将它应用于其它项目需求,例如 UI 编程。 这种框架要求设计得越直观越好,因此任何 Java 或者.Net 开发人员都可以马上开始使用它。

Starling使用概述

Starling 直观并易于使用。Flash 和 Flex 开发人员能够快速地了解它,因为它遵循大多数 ActionScript 规则并将低级 Stage3D APIs 的复杂性抽象化。Starling 使用熟知的概念,例如DOM显示列表、事件模型以及熟知的如 MovieClip、Sprite、TextField 等APIs,而不是依靠诸如顶点缓冲(vertices buffer)、透视矩阵(perspective matrices)、着色程序(shader programs)和组合字节码(assembly bytecode)进行编码。

Starling在很多领域都很轻便。 类的数量是有限的(大概有80k的代码)。 除了Flash Player 11 或者 AIR 3(以及在未来的版本中使用的移动支持)之外,它没有外部依赖。 这些因素使得你的应用程序很小并使你的工作流程简单。

Starling能够免费使用并富有朝气。 它根据 Simplified BSD 许可获得授权,因此你可以免费地使用它,即便是在商业应用程序中也是如此。 我们每天都在使用它并且我们依靠一个活跃的团队不断地完善它。

在后台操作中,Starling 使用 Stage3D APIs ―它们是在桌面上基于 OpenGL 和 DirectX ,在移动设备上基于 OpenGL ES2而运行的低级的 GPU APIs。 需要重点注意的是,Starling 是?Sparrow?的 ActionScript 3 端口,它等同于基于 OpenGL ES2 APIs 的ISO库(参见图1):

Starling 2D框架简介(一) - 第1张  | 长流技术

图1. Stage3D (Molehill) 分层位于 Starling 之上

?

Starling 重新创建了很多 Flash 开发人员熟知的 APIs 。 下图列举了通过 Starling 暴露的图形元素 APIs(参见图2)。

?

Starling 2D框架简介(一) - 第2张  | 长流技术

图2. Starling支持DisplayObject继承

?

在 3D GPU APIs 基础上可以创建 2D 内容,这看起来有点奇怪。 当涉及 Stage3D APIs 时,很多人认为这些 APIs 是严格地限制在 3D 内容中的。 实际上这是名称造成的误解:如果它叫做 Stage3D ,那么你怎么可以使用它创建 2D 元素呢?下图说明了关于使用 drawTriangles API 绘制 MovieClip 能力的问题(参见图3)。

?

Starling 2D框架简介(一) - 第3张  | 长流技术

图3. 可以使用 drawTriangles API 创建2D影片剪辑吗?

?

GPU 具有较高的效率并能快速地绘制三角形。 通过使用 drawTriangles API ,你可以绘制两个三角形,然后选取一种纹理并且使用UV映射将它应用到三角形中。 这样可以创建了一个带有纹理的四边形,它代表一个 sprite 。 通过更新每一个帧上的三角形的纹理,最后的结果就是一个 MovieClip 。

幸好我们没有必要通过这些细节使用 Starling 。 你只需要提供帧数,将它们提供给一个 Starling MovieClip ,这就是所有需要做的(参见图4)。

?

Starling 2D框架简介(一) - 第4张  | 长流技术

图4. 使用 drawTriangles API 和一个带有纹理的四边形,你可以创建一个2D图形

?

为了更好地了解 Starling 如何降低复杂性,检查你必须写入的代码以便于用低级的 Stage3D APIs 显示简单的带有纹理的四边形。


//?create?the?verticesvar?vertices:Vector.<Number>?=?Vector.<Number>([-0.5,-0.5,?0,?//?x,?y,?z,?u,?v-0.5,?0.5,?1,0.5,?-0.5,?0]);?
//?create?the?buffer?to?upload?the?verticesvar?vertexbuffer:VertexBuffer3D?=?context3D.createVertexBuffer(4,?5);?
//?upload?the?verticesvertexbuffer.uploadFromVector(vertices,?4);?
//?create?the?buffer?to?upload?the?indicesvar?indexbuffer:IndexBuffer3D?=?context3D.createIndexBuffer(6);?
//?upload?the?indicesindexbuffer.uploadFromVector?(Vector.<uint>([0,?2,?3,?0]),?6);?
//?create?the?bitmap?texturevar?bitmap:Bitmap?=?new?TextureBitmap();?
//?create?the?texture?bitmap?to?upload?the?bitmapvar?texture:Texture?=?context3D.createTexture(bitmap.bitmapData.width,?
bitmap.bitmapData.height,?Context3DTextureFormat.BGRA,?false);?
//?upload?the?bitmap?texture.uploadFromBitmapData(bitmap.bitmapData);?
//?create?the?mini?assemblervar?vertexShaderAssembler?:?AGALMiniAssembler?=?new?AGALMiniAssembler();?
//?assemble?the?vertex?shadervertexShaderAssembler.assemble(?Context3DProgramType.VERTEX,"m44?op,?va0,?vc0n"?+?//?pos?to?clipspace"mov?v0,?va1"?//?copy?uv);?
//?assemble?the?fragment?shaderfragmentShaderAssembler.assemble(?Context3DProgramType.FRAGMENT,"tex?ft1,?v0,?fs0?<2d,linear,?nomip>;n"?+"mov?oc,?ft1");?
//?create?the?shader?programvar?program:Program3D?=?context3D.createProgram();?
//?upload?the?vertex?and?fragment?shadersprogram.upload(?vertexShaderAssembler.agalcode,?fragmentShaderAssembler.agalcode);?
//?clear?the?buffercontext3D.clear?(?1,?1?);?
//?set?the?vertex?buffercontext3D.setVertexBufferAt(0,?vertexbuffer,?Context3DVertexBufferFormat.FLOAT_3);
context3D.setVertexBufferAt(1,?Context3DVertexBufferFormat.FLOAT_2);?
//?set?the?texturecontext3D.setTextureAt(?0,?texture?);?
//?set?the?shaders?programcontext3D.setProgram(?program?);?
//?create?a?3D?matrix?var?m:Matrix3D?=?new?Matrix3D();?
//?apply?rotation?to?the?matrix?to?rotate?vertices?along?the?Z?axism.appendRotation(getTimer()/50,?Vector3D.Z_AXIS);?
//?set?the?program?constants?(matrix?here)context3D.setProgramConstantsFromMatrix(Co
ntext3DProgramType.VERTEX,?m,?true);?
//?draw?the?trianglescontext3D.drawTriangles(?indexBuffer);?
//?present?the?pixels?to?the?screencontext3D.present();


[转载自]

http://www.techsite.cn/?p=49

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读