谁是AIR的最佳搭档–使用C++等技术扩展AIR功能
最近一直在做AIR的项目,顺便结合前面文章来讨论一下各种方案的优缺点。
起因
AIR是一项不错的桌面技术。貌似现在很多公司都在采用AIR了,我估计很多人都是看上了它漂亮的UI吧(确实做的很酷噢,而且相应的开发效率很高)。不过有时候它并不能跟传统的桌面技术相比。我感觉原因有这么几个:
- 缺少各种类库支持。咋一看上去AIR或者Flex的第三方类库还是挺多的,不过注意,它们很多往往还是集中在UI方面,广度不够。
- 不支持系统相关的特性。这是跨系统的通病。看看java就知道。
- 不支持调用系统命令。这估计是最大的硬伤了。
解决方案分析
俺最喜欢搞技术混搭了。既然世界上有这么多技术存在,为什么不取长补短,发挥各自优势呢。在分析之前,首先先看看扩展程序将基于一个怎么样的架构:
这是以前的一张图了。它说明了一点,就是扩展程序跟AIR是并行的两条进程,之间通过socket交换命令,一般用户先启动扩展程序,扩展程序再启动AIR。 它的好处在于:低耦合,把AIR不能或不容易做的事情都交给扩展程序,它们之间只要用简单的socket命令就能相互指挥了。我暂时还没有想到更好的方案:)。下面总结一下这个扩展程序要具备哪些特性:
- 扩展性能好,类库多。
- 不用UI。废话,AIR已经是UI了。注意扩展程序完全做为一条没有UI的进程在跑,可以将对普通人它是隐藏的。这里顺便讲个问题,如果有人手动关了怎么办?要知道AIR是可以探测socket的连接情况了,如果关了,没办法,AIR给提示或者一起关了随便你。
- 体积小。有人可能不在乎。AIR runtime for windows 大概10M左右,for linux大概13M,for Mac大概15M。:-),自己衡量吧。我想用户都喜欢精巧的玩意儿吧,至少我是喜欢的。
- 跨平台。桌面技术很难做到跨平台,因为系统相关的特性就不支持了。不过我觉得至少70%可以跨平台就好了,至少为了工作量。
下面分析几个我当时考虑的几种技术:
- C++。这是一个很古老的技术,我最后选的也是它(最老搭配最新,绝配啊)。C++分好多种,为了跨平台,要少用VC等系统相关的API,要多用标准C++的类库,这里非常推荐一下boost类库。这里有人可能认为C++不是跨平台的,要知道C++的设计理念是write once, compile everywhere,只要在各个平台上编译就行了。如果要搭上其它的五花八门的功能,外面也有超多的类库支持。比如我做的录音程序(暂时还没找到跨平台的类库,我估计是没有的)和socket server。总结一下。优点:类库多,性能高,体积小,70%跨平台。缺点:难度比较高,容易出错。
- python。这个东西不是很大众(我喜欢的)。是基于C开发的,跟C++结合的很好,类库也够多,能做到90%跨平台。但是python要一个解释器和基本类库的才能运行的。总结。优点:类库多,性能可以(如果不是要求很高),90%跨平台,融合性非常棒(能调用dll等,跟各种其他技术都能很好配合),快速开发效率高。缺点:体积一般(如果结合解释器和基本类库一起打包大概5M左右),不够大众化。
- java。够普遍了,直接总结。优点:类库多,基本上完全跨平台,够大众化,开发效率高。缺点:完全跨平台(跨多了也不好),性能一般(其实速度可以了,不过JVM一开总要强点内存),体积大(JVM比较大了,这是我直接淘汰它的理由)。
还有一些其他的我不太懂,不过扩展程序不需要UI,这三个基本上够对付了。怎么取舍关键还是看需要。



恩,我也这样想,不过socket方法值得思考掂量
之间通过socket交换命令:之前写地图编辑器就像这么做的,主要用于生成文件.
AIR与JAVA,C++等交换信息似乎只能用Socket吧,难道写个文件让对方读?
关于以Socket方式调用Java的方法,好像有人写了个类库,名字忘了,不过估计应用的也不多。
体积小,难道 AIR runtime for windows 能不装吗?
干脆不用air,只用flex,把要用到的air的功能全都让扩展的程序去做,这样体积最小。
如果用python来扩展的话,好处是可以用pyamf,这样用AMF远程调用,会减少socket通讯时制定协议的麻烦
我也喜欢Python和AIR,但刚接触到AIR不知道它是怎么支持Socket的?有TcpClient组件吗?谢谢!
to DDGG
AIR和flash一样有相通的socket API
这个方法不错啊
最近就在做的东西就打算用这样的架构
希望有更多关于c++ 配搭 AIR的文章~
既然这样那为什么要用C++呢?
如果你使用本地C++代码,程序的发布和更新又会出问题了。
使用AIR就是需要UI,那倒不如C/S模式 加个自动更新程序还不好吗?
to sunny:
主要是用于一些特殊的需求,比如要用到本地API,这样C/S模式就没用了。
请参考此篇
http://www.adobe.com/devnet/flex/articles/flex_ui.html