You are on page 1of 6

Terrarium 简介

王咏刚,译自 Terrarium Home,2003 年 3 月

简介

Terrarium 是微软公司开发的示例程序,它是一款向软件开发人员全面展示.NET 框
架应用开发技术的游戏。在 Terrarium 游戏中,开发人员可以创建草食动物、肉食动物或植
物,并将它们放到一个基于“适者生存”模型和对等网络结构的生态系统中。游戏既提供了
一个可以测试开发人员的软件开发与策略设计水平的竞争环境,也提供了一个近乎真实的
进化生物学和人工智能模型,以检验具有不同行为和属性的生物在生存斗争中的适应能力。
Terrarium 也展示了.NET 框架中的一些重要特性,如:使用与 DirectX 集成的 Windows
Forms 技术创建强大的用户界面(UI);XML Web Services 技术;支持对等的网络结
构(Peer-to-peer networking);支持多种编程语言;通过远程 Web 服务器升级智能
客户端,即基于 Windows 的应用程序的能力;使用包括凭据验证(evidence-based)
和代码访问(Code access)的安全架构来保护参与游戏的,运行着移动代码(Mobile
code)的计算机。本说明文档主要从技术角度概要介绍了.NET 框架的上述特性是如何在
Terrarium 游戏中发挥价值的。

游戏 概述

在进入技术细节之前,让我们大致浏览一下游戏运行时的实际流程。游戏可以在两种
模式中运行:
◆ 饲养场模式(Terrarium Mode):这种模式给用户提供了两种选择。用户可以独
立运行,无须与其他节点连接。在这种情况下,屏幕上显示的生态系统就代表了整个生态环
境。这种模式最适合于对你开发出来的生物进行测试。用户也可以选择加入到一组特定的节
点环境中,所有连入此环境的计算机共同组成一个小型生态系统。加入特定节点组的方法非
常简单,每个用户选择一个特定的专网,并在 Terrarium 控制台的“Channel”一项中输
入一个事先约定好的字串,就可以加入该网络了。输入字串后,用户的计算机只与那些输入
了相同字串的计算机构成一个独立的对等网络,并一同组建生态系统。
◆ 生物圈模式(Ecosystem Mode):这是游戏的标准模式。全世界所有连入游戏的
计算机共同构成一个完整的生态系统。每个参与者的计算机只是该生态系统的一个片断。
在上述两种模式下,开发者都可以使用 Terrarium 类库、.NET 框架开发包和 Visual
Studio .NET 工具随意创建他们自己的生物。或者,他们可以简单地把 Terrarium 当作一
个独立运行的应用程序或是屏幕保护程序运行,并通过 Terrarium 观看其他开发者创建的
生物在生态系统中为生存而战。
在创建生物时,开发者可以自行决定生物的每一种基本属性(如眼睛的颜色、运动速
度、防卫能力、攻击能力等),行为方式(寻找食物、活动和进攻的算法等)以及繁殖能力
(每隔多长时间繁殖一次,把哪些基本信息遗传给后代)。开发好一个生物的所有代码之后,
开发者将代码编译成.NET 程序集(Assembly,以 DLL 动态链接库的方式存放)。本地的
生态系统片断可以调入和运行该程序集,并在 Terrarium 控制台上显示出这一生物。在生
物圈模式中,新的生物种类被引入后,系统会自动在本地生态系统的不同位置创建该生物
的 10 个个体。在这种生物的所有个体都死亡之前,用户和网络上的其他人都不能再创建该
生物的新个体了。相反,如果该生物生活在饲养场模式中,用户可以在生态系统中创建任意
多个该生物的个体。
生物被载入 Terrarium 系统后,它就会按照自己的代码逻辑生活。每个生物的每一个
动作可以延续 2 到 5 毫秒(取决于计算机的运行速度),如果动作超时,该生物就会被强
制摧毁。这一规则可以防止任何生物浪费计算机时间或使游戏瘫痪(例如代码中的死循环)。
在网络每一个节点计算机的生态系统中,都有一个蓝色的“超时空球(Teleporter
ball)”在不停地随机滚动。如果用户在其登录的活动节点上执行程序(不论是在生物圈模
式中还是在加入了独立节点组的的饲养场模式中),每当蓝色的“超时空球”滚过某个生
物时,该生物就会被随机地传送到另一个节点计算机的生态系统中。
系统中有一个中央“主”服务器负责对等节点的搜寻和状态报告。

用户 界面

以上屏幕截图显示了 Terrarium 的控制台界面。界面中显示了生态系统的一小部分,


以及用户玩游戏时可用的几个控制按钮,包括载入生物,报告状态等。
屏幕上的窗口和按钮都是使用.NET 框架中 Windows Forms 命名空间中的类开发而
成的。这些类专用于 Windows 用户界面的开发,它们易于使用和扩展,集成了 Visual
Basic 语言的易用性和 C++语言的强大功能。
生态系统中的图形(包括生物和场景,其刷新频率是每秒 20 帧)是用 DirectX 开发
的。DirectX 图形库为开发者提供了直接访问系统显卡,创建高性能图形应用的支持。有趣
的是,在开发 Terrarium 游戏的时候,DirectX SDK 还没有提供对基于.NET 框架的托管
代码的支持。结果,Terrarium 的开发人员利用.NET 框架提供的 COM 包装技术将已有的
非托管代码连入了使用托管代码开发的应用程序中。调用非托管代码是.NET 框架的强大功
能之一,它可以使开发人员在开发新的应用时充分发挥已有的可复用组件的潜力。

XML Web Services

一个 XML Web service 就是一个使用 SOAP、WSDL、XML 等 Internet 协议与标准,


通过 Internet 或 Intranet 输出可编程功能接口的服务程序。从本质上说,XML Web
Services 提供了一个基于松散连接的、面向消息和平台无关的分布式计算模型,无论客户
端或服务端运行的系统平台如何,客户程序总能通过统一的方法调用远程服务的功能接口,
这一远程调用甚至可以穿越网络上的防火墙。
Terrarium 中随处可见 XML Web Services 的身影。游戏本身运行在一个对等的网络
结构中,也就是说,所有参与游戏的计算机在地位上都是平等的,都既是客户机,又是服
务器,整个网络中只有一台用于节点搜寻和状态报告的主服务器。所有对等节点的计算机与
主服务器之间都是通过 XML Web Services 连接的。

IP 地址 验证

当一个节点计算机第一次运行 Terrarium 时,它将调用主服务器的一个 XML Web


Service,以查看自己提供给主服务器的是哪一个 IP 地址。然后,计算机将主服务器返回的
IP 地址(即该计算机提供给外界的 IP 地址)与自己的实际 IP 地址进行比较。有时
Terrarium 会发现自己实际的 IP 地址和输出到主服务器上的 IP 地址并不一致,其他
Terrarium 无法直接访问自己——这通常是由于客户计算机通过代理服务器或含有网络地
址转换(NAT)功能的路由器与外界相连。在这种情况下,因为其他节点无法与之通信,此
计算机将被禁止加入生物圈模式。

注册 和节 点搜 寻

假设节点计算机有一个静态的、公共的 IP 地址,它将调用主服务器的另一个 XML


Web service,将自己的地址加入到注册节点列表中。然后,主服务器将所有参与游戏的
节点数目返回给该计算机,同时还返回一个“节点联系表”。“节点联系表”中包括 20 到
30 个在地理上与该计算机临近的节点计算机地址,这些地址可在随后的游戏中用于生物传
送。“节点联系表”中的 20 到 30 个节点互相联结成一个完整的网络——没有哪个节点是
与网络的其他部分隔离的“孤岛”。特定的节点计算机会拒绝来自“节点联系表”以外的任
何地址的连接请求。节点计算机每隔 5 分钟刷新一次登记信息。如果某个节点计算机在 15
分钟内没有刷新过自己的登记信息,主服务器就会认为这个节点计算机已经断线,并会将
该节点地址从注册节点列表中删除,同时,主服务器还更新所有包含已断线节点地址的“
节点联系表”,用另一个在线节点来替换它。
载入 一种 生物 的程 序集

当开发者将他们开发出的生物代码编译成.NET 程序集之后,他们就可以使用“载入
动物(Introduce Animal)”按钮,将生物载入到生态系统中。这时,Terrarium 程序在
后台迅速扫描该程序集,以确认该程序集中实现了所有必需的方法,并确保该程序集中不
包含任何可用于作弊的功能。如果程序集通过了这些测试,节点计算机就调用主服务器上的
另一个 XML Web Service,注册这个新的生物,同时把一份程序集的拷贝送到主服务器
上保存起来(一旦该生物灭绝,用户可以使用主服务器上存储的拷贝重新把该生物载入到
生态系统中)。只有以上工作都完成以后,本地的 Terrarium 生态系统片断中才会创建出
10 个该生物的个体。
Terrarium 生态系统载入生物的程序集之后,将使用.NET 框架提供的,基于凭据验
证和代码访问的安全架构来保证其安全性。这包括阻止生物代码访问或潜在地破坏本地计算
机上的任何资源。有关安全性的更多信息请见下面“凭据验证和代码访问安全性”一节。

节点 状态 报告

大约每隔 6 分钟,每一台节点计算机将自己的生态系统中存活的生物数量和种类等信
息整理成一个数据集,发送给中央服务器。中央服务器将所有参与游戏的节点计算机发来的
信息整合在一起,并将统计报表发布到一个公共网站上。

对等 网络

对等网络功能是通过.NET 框架的 System.Net 和 System.IO 命名空间中的类实现的。


当“超时空球”滚过一个生物时,Terrarium 就从主服务器提供的“节点联系表”里,在
20 到 30 个节点计算机中随机选出一个作为生物传送的目的地。发送方首先询问被随机选
中的节点计算机是否拥有这种生物的程序集。如果没有,发送方就通过网络把程序集传送给
接收方——开发者用 System.Net 命名空间中的类可以很容易地管理这一功能。当程序集
被传送到接收方的本地磁盘上以后,发送方就使用 System.Runtime.Serialization 命名
空间中的类将该生物的状态对象(包含它的当前大小、能量级等信息)序列化,并通过网络
发送给接收方。接收方将该状态对象反序列化,并将其与程序集关联起来。由此生成的生物
个体是发送方所传送的生物的精确拷贝,它被载入到接收方的生态系统片断中并被
Terrarium 程序激活。

支持 多种 编程 语言

.NET 框架支持 20 种以上的编程语言,包括 C++、C#、COBOL、Fortran、Java 等等。


开发者可以根据他们的需要和技术经验选择最合适的语言,由此开发的代码可以和.NET 框
架支持的其他 20 几种语言开发的代码无缝连接,甚至可以从其他语言开发的类中派生子
类。现在,Terrarium 中的生物只能用 C#或 Visual Basic .NET 语言开发。这样做的目的
是为了防止作弊。前面提到过,在载入新的生物时,Terrarium 客户端将检查生物的代码以
保证其中没有隐藏任何可以对其他生物构成不公平竞争的功能。静态方法、线程调用以及析
构器都可用于作弊。不幸的是,一些语言的编译器能够自动引入静态构造方法等不安全因素。
Terrarium 的代码检查机制将找出可用于作弊的代码并禁止它们在系统中运行。今后,
Terrarium 将会支持更多的编程语言。

通过 远程 Web 服务 器更 新版 本

.NET 框架极大地改进了智能客户端即基于 Windows 的应用程序的发布过程。这是因


为,.NET 框架解决了 DLL 冲突问题,并允许系统管理员通过远程 Web 服务发布和更新应
用程序。为了实现远程更新功能,Terrarium 实际上使用了另一个示例程序——.NET 应用
程序更新工具(.NET Application Updater)——来有效管理所有发布和更新工作。更新
组件调用主服务器上的一个 XML Web Service,以检查是否有 Terrarium 的新版本存在。
每台节点计算机上的 Terrarium 程序启动后 30 秒就会调用这个 XML Web Service,此
后每隔 15 分钟调用一次。这个 XML Web Service 只是简单地将节点计算机上的程序版本
号与最新的版本号作比较。如果有新版本发布,它就通过返回值告知节点计算机可下载新版
本程序的 URL 地址。使用 System.Net 命名空间中的类,节点计算机可以在运行旧版本程
序的同时,将新版本的文件下载到一个新的文件夹中。数字签名技术可以确保新版本的程序
是通过了认证并且未经窜改的。Terrarium 使用一个配置文件把程序的执行代理导向负责提
供用户界面和游戏功能的程序集所在的文件夹。下载完毕新版本后,Terrarium 会重写该配
置文件,使执行代理指向保存有新版本程序集的新文件夹。Terrarium 下一次启动时,就会
运行新版本的程序集了。保存上一个版本的文件夹会被保留下来,以防止新版本中出现错误。
Terrarium 将删除更早期版本的文件夹以节省磁盘空间。

凭据 验证 和代 码访 问安 全性

生物其实就是一段可以从一台计算机传输到 Terrarium 对等网络上的另一台计算机的


移动代码。感谢.NET 框架提供的基于凭据验证和代码访问的安全架构,计算机可以避免那
些有意或无意的不安全代码的威胁了。
一般地说,.NET 框架中的凭据验证机制可以使代码具有不同的信任级别,信任级别
与代码的来源及代码的其他属性(如作者的身份)相关。这些属性构成了可用于将特定代码
赋予某个代码组或代码类的凭据,每个代码组或代码类都拥有一个权限集,系统靠权限集
来判断该代码可以或不可以访问何种资源。在代码执行阶段还要感谢另一种名为代码访问安
全性的技术。.NET 框架的公共语言运行库(CLR)提供了底层的安全检查机制,确保代码
只能执行那些经授权许可的操作。这时,CLR 不仅要检查分派给请求特定操作的程序集的
权限,还要检查调用堆栈上可能会调用活动程序以完成特定操作的所有其他程序集的权限。
只有经这样全面的堆栈审查机制验证后的操作才能够执行,其他操作都不能执行。
代码组和与之相关的权限集可以基于企业、计算机、用户或应用领域等不同层次设定。
在运行阶段,不同层次的权限设定是逐级递进的。比如,在计算机层次的设置只比企业层次
的限制更强一些,依此类推。在 Terrarium 中,基本安全设置均作用于应用领域层次。在
Terrarium 应用领域中,生物代码只有可执行的权限。也就是说,代码可以运行,但不能访
问任何系统资源,如本地磁盘,系统注册表等等。尽管限制比较严格,这一策略还是给生物
提供了在 Terrarium 生态系统中生存和活动所需的自由,同时也为用户加入对等网络提供
了必要的保护。

结论

Terrarium 为开发人员提供了一条了解.NET 框架编程的便捷之路,它展示了.NET 框


架诸多技术进步中的一部分内容,提供了一个可用于学习进化生物学和人工智能的强大建
模工具。首先,也是最重要的一点是,它是一个游戏。开发一个生物的过程可能很容易,也
可能充满挑战,可能很轻松,也可能需要全力以赴,关键是你想得到什么样的结果。祝你玩
得开心,祝你好运!