用户界面的另外一种实现方案(2)现有的方案

来源:互联网 发布:手机竹笛演奏软件 编辑:程序博客网 时间:2024/05/17 20:42

我们知道,客户程序特点:

1、指定资源

2、类描述

3、对象描述

4、脚本

5、事件响应

 

那么现有的方案是如何实现的呢?我们举个魔兽世界中一个UI程序的例子:

<Frame>标签中包含名字name , parent以及子标签,每个子标签都可以包含<Scripts>来定义事件,如
<Scripts>
    <OnLoad>
        self.regionParent = self:GetRegionParent() ;
        self.min = 0.0;
        self.max = 1.0 ;
    </OnLoad>
    <OnUpdate>
       local alpha = self.min + (self.max - self.min)*self:GetProgress();
       self.regionParent:SetAlpha(alpha);
    </OnUpdate>
</Scripts>

在这段代码中包含了客户端程序的3个要素 :3、对象描述; 4、脚本;5、事件响应,但不包含类的描述和指定资源。上面这段代码是XML的,所以和HTML格式很象,如果把scripts看作javascript的话,就没啥差别了。实际上类的描述很多都是内嵌的。比如Frame,这个标签包含哪些属性和动作事实上已经在虚拟机中已经存在了。资源的指定很容易做到的,可以参照html。可以看出xml在对象化的界面描述中,是具有很大的优势的。现在我们试图将类的描述加入其中。这就需要一个全局的管理器,单纯的一个xml 标签无法实现这种目标。类的描述标签同时还必须处理继承。

<class name = "window"/>
<class name = "button" inherited="window"/>
<commit class="button" text = "提交" onclick="..."/>

然后我们就可以根据这段描述生成一个按钮。在这个脚本中,对象描述、脚本以及事件响应是放在一起了。这个和HTML是类似的。

现在我们再考察另外一个UI系统XUL。
      ◇建造一个xul+css+dom+js的布局引擎
  ◇实现附加的布局基元(layout primitives),比如spring,strut模型以及popups等,这些附加的布局基元可以和标准的css定义的布局基元进行互操作。
  ◇实现一个二进制的cache,以便加速xml和js的重载速度。
  ◇实现一个组件/标签扩展模型,例如xbl,允许xml标签可以被定义为组件,并在其他的页面,窗口和对话框中复用。
  ◇实现系统其他构件的xml标签支持,例如tree等等,这些构件在html中没有实现。
  ◇通过某种数据绑定形式(mozilla采用的是rdf),提供后台数据与gui xml文件的绑定。
  ◇除了本地语言格式之外,还要为js提供一套完整的sdk,支持文件i/o,网络等操作。
  ◇实现基础构造支持,提供命令运行和命令更新的支持
  ◇为css和xml实现一种高效的内存缓存,以便实现轻量级的原型复制和共享(可以使用类似“写时拷贝”的语义)。

哈,很意外地发现XUL解决了上面所提到地很多问题。比如二进制缓存解决解析脚本和对象描述加载的效率问题。xbl特性允许xml标签被其他复用。rdf提供后台数据和xml文件的绑定。很显然,xul的功能是强大的,具有很强的可扩展性。不过我们也同时发现,xul不是统一的解决方案,他们需要多种手段合作才能完成需要的目标。

而且,js的语言特性主要针对于web,是否具有更广泛的适用性,还有待进一步考察。我们从Mozilla ThunderBird中选取2个文件EdAdvanceEdit.xul和EdAdvanceEdit.js,在comm.jar,content/editor中,发现代码仍然很复杂。XUL的理念十分先进,但是基于js/xml/css带来不小的复杂性。而且他们使用全局变量document等,都是基于web结构的,能否被广泛使用其他项目,还需要进一步考察。xul架构中,描述和脚本分离的架构,在编写时也是十分麻烦的。

 

java也是一个经常被用于跨平台开发的界面设计工具。swat/swing是2个重要的工具,不过我们知道,java是以class被发布的,和其他脚本语言有一定的区别,在界面设计上更接近于编译语言c/c++等。

java在IDE等辅助工具上有完整的支持,所以在开发效率上是有优势的。但在执行效率,还是一如既往的慢。我想这个和java过分依赖于虚拟机的opcode有关。比如onclick事件的执行,如果本地执行需要1秒,但全部以opcode执行的话,估计需要2秒,甚至更多,这种情况,在游戏尤为难以容忍,所以,我们在大型游戏中,很难见到用java的作为脚本执行语言的原因吧。

原创粉丝点击