ActionScript 3(简称as)自2006年诞生以来,出现了一大批很优秀框架。就我的知识领域,运用包括pureMVC、pushButton Engine(组件框架)、Robotlegs、Ash等等。我将对这几个通用的开发框架进行一个较深入的总结。同时下文的种种判断、结论可能不完全正确,完全限于个人的思考、理解得到的。运用框架让开发效率更高,扩展性好,可维护。理解框架让框架的作用发挥极致,开发挥洒自如!

       1 PureMVC

PureMVC很多人应该很熟悉,记得那时候as的开发框架还是很少的,这种基于mvc的框架对于as来说很实用的,as是客户端语言,处理大量视图逻辑,提供了机制去解决视图和控制器间的低耦合。既然是开发框架,我从几个方面去分析它。

> 框架机制:PureMVC几个核心的类组成:Facade(外观),Proxy(模型代理),Mediator(中介器),Command(控制器)。Facade是整个框架的核心,包括mediator、command、proxy全部由它管理。框架大量采用单例,包括Facade本身。mediator是视图的代理器,负责和view打交道,view本身只提供一个ui布局,逻辑控制处理全部在mediator中完成。command提供一种命令模式,单独处理一项逻辑事务,并且这种对应是可以配置,即使用一个命令名称对应一个命令体。这样将整个控制逻辑简单化,单一化模块化,便于替换,更新维护。proxy是数据模型的代理,一般情况我们会设计vo,就是特定的数据模型结构(data struct),然后使用proxy进行代理。整个框架静态分析下来就是这样的了,至此我们还没有分析框架的事件流,没有这个无法进行逻辑控制,协作处理。PureMVC采用了另一种设计模式,观察者模式,这里就涉及到观察者、通知者、消息。观察者就是对象的一个消息处理方法,通知者自然就是发送消息,消息又包括消息名称、内容等。消息发送是通过Facade进行的。Facade提供了机制,在mediator、commnad被注册时进行了消息名称+处理句柄的关联。所以当通过Facade发送消息的时候,将查找这种关联,并让那些observer观察者(meditor、command)进行响应。

> 有图有真相,看看框架示意图更加清晰点

> 运用与优缺分析

第一步,继承Facade,实现自己的外观,进行数据模型代理、控制器、中介器的安装。设计数据模型(vo),完成对数据模型vo的proxy。安装视图组织设计对应的mediator,完成视图事件处理句柄和控制逻辑。划分逻辑,将不同的处理逻辑封装在不同的command中。

pureMVC优点体现在:轻量级的库、简单易用、极大降低耦合度,独立不依赖第三方库。可以很好的协调人员进行mvc模式开发。就当前的框架而言,由于Facade是单例的,在多模块协作会出现问题。一个解决方案是让Facade在不同的包下。当然pureMVC提供了多核版本,这里就不进行讨论了。

       2 PushButton Engine(组件框架)

pushButton其实是一个
游戏engine,这里我列出来,是因为pushButton里面使用了一种基于组件的开发模式。按着设计者的初衷,一个游戏的设计,抛弃复杂的继承(因为继承本身也有诸多弊端,在复杂的游戏世界里),而采用一种“平铺”的方式,整个系统采用实体+组件完成。这个engine是比较复杂的,至今我的理解也不深入。如果是详细的讨论整个engine的开发流程,必须单独写一篇了。

> 框架机制:一切皆组件。pushButton包括几个核心类:entity(实体)、component(组件)、template(模板)、group(组)。entity就是一个对象,比如角色、npc,是个抽象的对象。entity总是由component组成,各个component负责不同部分,比如有的是渲染,空间属性,数据模型等。template理解为可以多次初始化创建的entity。group是一组对象的集合,当group被创建的时候,group的子节点objectReference对应的实体等也会被初始化创建。

   

         pushButton提供了查找、访问别的组件的接口,同时提供了一个共享的eventDispatcher,实现消息事件的传递。如果深入去研究,有LevelManager(负责关卡的具体初始化工作)、NameManager(负责名称和类对象索引)、TemplateManager(负责加载卸载关卡文件,和序列化控制)等。

> 框架示意图

查看大图: Go,右键另存为即可。

  

      > 运用与优缺分析

pushButton engine提供了基于XML配置文件的方法加载读取游戏,特别是关卡类游戏。一切基于组件! 在设计的时候,划分好不同的entity,然后分别设计不同的component。如果使用配置,必须写明objectReference,以完成初始化工作。如果使用手动,需要手动给entity添加不同的component,并手动实现整个流程。pushButton提供了屏幕管理类,方便视图间的切换,继承BaseScreen,实现自定义的screen。pushButton api很丰富,提供了很多公用组件模块。对应大的项目可以考虑发布一下组件,让多人提供协作开发。

pushButton的api相对比较复杂,engine核心控制逻辑也需要深入学习才能弄懂!对应这样一个engine,学习成本相对是较高的,稳定性方面也可能存在风险。

       3 Robotlegs

robotlegs框架对我而言,很熟悉了。我们的整个项目ui部分完全是基于这个开发的,我还看到过有人使用robotlegs开发出了完整的大型rpg游戏。robotlegs本质上还是mvc类型框架。不过robotlegs使用了依赖注入的方式降低对象间的耦合,简单的说对象间的相互引用是通过robotlegs框架完成的,同时robotlegs提供了更好的通信机制,和更低的耦合性。

> 框架机制:robotlegs本质上也是使用mvc框架机制。包括:Actor(数据模型)、mediator(中介器)、command(控制器)、context(上下文)。整个框架的核心是依赖注入。context中负责完成几个映射的初始化工作,包括控制器、中介器、视图的映射。同时还包括对注入器的初始化工作。并且context里面还提供了一个事件派发器eventDispatcher。actor就是model部分,对应自定义数据模型一般继承actor,事件数据模型更新是派发事件通知给meditor和command。mediator提供对view的中介,负责处理和view的交互,发生消息命令。mediator被注入了meditorMap,可以实现新的视图中介器关联。

   

         command即是控制器部分,负责处理特定的逻辑块。需要说明的是command被注入了commandMap、meditorMap、eventDispatcher,还有injector。这些对象提供了command更加广阔的能力,包括发送事件、映射新的命令关联、新的视图中介器关联。最后就是mvcs中的“s”,s即是service,提供获取外部数据的服务功能。本质上将robotlegs、pureMVC是一个东西,最大的区别是依赖注入、事件派发机制。

> 框架示意图

事件流参看Robotlegs官网: Go

  

       > 运用与优缺分析

robotlegs的具体运用和pureMVC很像。继承context设计自己的context,完成数据模型、视图、命令体映射等工作。设计基于actor的数据模型,当模型属性改变时派发事件。完成视图组织对应的mediator,安装好视图事件处理句柄,和处理逻辑。设计完成特定处理的命令体。注意的是依赖注入是框架自己完成的,并且注入点可以使用接口。

robotlegs的优势可见一斑:轻量级的库、简单易用、极大降低耦合度。耦合度比pureMVC做的更彻底。并且依赖注入是可配置的。同时,我认为robotlegs的事件机制更高效,简单易懂,整个框架通过eventDispatcher对象进行收发。对于劣势可能是在于使用成本方面,由于引用依赖注入,框架要复杂很多。同时对于不需要开发大量视图交互的游戏,就没有这个优势了。http://www.shengshiyouxi.com

       4 Ash

Ash是richardlord在2012设计的框架,借助这个框架richardlord开发了一个太空大战游戏,让我看到一个新的设计框架的诞生。实体系统现在正变得越来越受欢迎,有名的例子比如Unity。当然Ash现在很简陋,还不成熟,相信richardlord能做的更好!

  

       > 框架机制:“实体系统结构来源于解决游戏主循环这个问题的一次尝试。它将游戏主循环作为整个游戏的核心,并且预先假设在现代游戏结构中,简化游戏主循环比其他任何方面都重要,比如,它比分离控制器上的视角重要的多”。这是这个框架的出发点,简化游戏主循环。在ash中,最终游戏的主循环控制完全通过迭代system的update方法实现。ash包括几个核心类:entity(实体)、component(组件)、node(节点)、system(系统)。entity对应任何游戏都是存在的,可以理解为游戏中一个用例,一个组成对象,比如太空飞船。component理解为entity的不同部分,飞船可以分为渲染、数据模型、碰撞检测、控制组件等。system可以理解为处理具体一组抽象的针对node节点的逻辑。node是为system服务的,因为一般来说系统不关注具体的entity,而是关注一组特定的节点。节点又是由特定的组件构成的。本质上讲node提供了特定或者抽象的entity的组件的访问。system通过处理特定的node,实现处理对应的entity的组件,而组件对应一个entity来说,是共享传递的,从而实现逻辑处理。

> 框架示意图

> 运用与优缺分析

Ash提供了Game类,使用时考虑给Game添加处理系统即可。一般会先划分不同entity,以及添加各自对应的component类。处理逻辑有先后顺序,决定了添加system到Game时有顺序安排,通过划分逻辑处理层次,将设计不同的system的扩展类,同时设计出配合system处理的node类。node类本质上是收集对entity的component的访问。整个游戏结构一目了然!

ActionScript通用开发框架的更多相关文章

  1. .NET通用开发框架

    在开源中国社区,简单整理了下比较好的.NET通用开发框架.一个好的通用框架大概包括:开源.扩展性好.灵活性好.复用性好.维护性好.易测试.易发布.易部署.快速业务搭建(或业务集成).通用性强.参考资料 ...

  2. C#.NET Winform 通用开发框架

    C/S系统开发框架-企业版 V4.0 (Enterprise Edition) 简介: http://www.csframework.com/cs-framework-4.0.htm 视频下载: 百度 ...

  3. 一种小型后台管理系统通用开发框架中的Cache缓存设计

    本篇博客记录一下我在实习的公司的后台管理系统开发框架中学习到的一种关于网站的缓存(Cache)的实现方法,我会在弄懂的基础上,将该方法在.net core上进行实现.因为公司开发都是基于.net fr ...

  4. Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...

  5. 【开源】Ionic项目实例《Ionic中文社区》

    介绍 这几天闲着没事,就做了个第三方的Ionic社区的移动客户端,练练手,界面设计和图片资源直接从官方版拿来的.真懒o(︶︿︶)o 唉 网站开放出来的接口,都已全部实现,大家可以下着试试看. 源码 h ...

  6. 【框架学习与探究之依赖注入--Autofac】

    声明 本文欢迎转载,原文地址:http://www.cnblogs.com/DjlNet/p/7603642.html 序 同样的又是一个双11如期而至,淘宝/天猫实时数据显示,开场3分钟总交易额突破 ...

  7. 如莲开发平台(MIS基础框架、Java技术、B/S结构)

    关于     「如莲」是一套MIS类系统基础框架,主要用于各类“管理信息系统”的开发,也适合做网站后台开发.可省去开发时的框架搭建.规范约定.权限管理等基础工作,直接专注于业务功能实现.     「如 ...

  8. Struts2、Spring、Hibernate 高效开发的最佳实践(转载)

    Struts2.Spring.Hibernate 高效开发的最佳实践 Struts2.Spring.Hibernate(SSH)是最常用的 Java EE Web 组件层的开发技术搭配,网络中和许多 ...

  9. Hibernate 延迟加载 分析

    出处:http://www.ibm.com/developerworks/cn/java/j-lo-hibernatelazy/#icomments Hibernate 的延迟加载(lazy load ...

随机推荐

  1. JavaScript实现弹框

    提起JS弹框,我首先想到的是Alert,然后想到的还是Alert,最后我竟然就只知道Alert.然后面试就死在这个Alert上了.恼火. 根据网上各位大神的总结,我整理了一下,也顺便学习了一下. 一. ...

  2. android对象序列化Parcelable浅析

    一.android序列化简介 我们已经知道在Android使用Intent/Bindler进行IPC传输数据时,需要将对象进行序列化. JAVA原本已经提供了Serializable接口来实现序列化, ...

  3. UIWebView(本地数据部分)

    创建UIWebView和UISegmentedControl webView用于显示内容,segmentedControl用于切换读取内容的类型 为了方便起见 用拖拉控件形式布局完界面 /* 使用UI ...

  4. Hibernate中session的产生的方式

     *  session的产生的方式      * 1. sessionFactory.openSession         每次都会新创建一个session,只要新创建一个session,hiber ...

  5. Firefox中Vimperator插件配置

    具体配置什么,同学们可以网上看下善用佳软关于Vimperator的说明,在这里我列出两条我个人觉得最有用的命令 set nextpattern=\s*下一页|下一张|下一篇|下页|后页\s*,^\bn ...

  6. C#三种方式实现序列化(转)

    序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用. 序列化和反序列化最主要的作用有: ...

  7. JQUERY1.9学习笔记 之基本过滤器(十二) 根元素选择器

    根元素选择器 描述:选择文档的根节点元素.jQuery( ":root" ) 例:显示文档根节点标签名. <!DOCTYPE html><html lang=&q ...

  8. Android模拟器Genymotion安装向导

    Genymotion简述 Genymotion提供Android虚拟环境的工具集.相信很多Android开发者一定受够了速度慢.体验差效率及其地下的官方模拟器了.如果你没有物理机器,又不想忍受官方模拟 ...

  9. spring xml配置标签详解

    <!-- 指定类的名称 在对bean进行定义时,除了使用id属性来指定名称之外,为了提供多个名称,可以使用alias标签来指定. --> <alias name="&quo ...

  10. Hadoop 学习笔记(一) HDFS API

    http://www.cnblogs.com/liuling/p/2013-6-17-01.html 这个也不错http://www.teamwiki.cn/hadoop/thrift thrift编 ...