第二人生客户端程序, 第一部分: 探索第二人生

第二人生客户端程序, 第一部分: 探索第二人生
建立”第二人生”开发环境

级别: 中级
Peter Seebach (dw@seebs.net), 自由作家
原文: Second Life client, Part 1: Hacking Second Life
译: 赵珂 cn.zhaoke.com
http://blog.zhaoke.com/101.html

2007年4月2日

Linden实验室开发的”第二人生“开源版浏览器为”闭源”和”开源”两种开发模式的比较提供了一个很难得的机会. 本系列文章的第一篇主要介绍了这两种开发模式的不同, 以及如何建立您自己的开发环境.

第二人生是一个由客户端软件和托管服务器联合组成的虚拟世界. 它有点类似于”大型多用户”在线游戏(MMOs), 但它却有着与众不同的质量, 而且所有的内容都几乎由用户提供. 另外Linden实验室最近发布了客户端的开源版本. 这太不寻常了, 在商业MMO历史中是从来没有的. 开源版本的客户端选择了GPL 2版本, 无疑属于FLOSS(自由/开放源码)软件.

本文主要介绍了客户端(或”浏览器”, Linden术语)程序, 探索开发环境, 文档等更多的地方. 开发人员使用的开源开发环境可能跟商业环境有所不同, 而这个项目提供了探索折衷办法的机会. 当然, 探索程序的最好办法是动手去做, 所以本文将对源代码做少数的修改.

第二人生的系统需求

第二人生游戏客户端程序现在支持Microsoft Windows, Mac OS X和Linux系统(也许将能运行在更多的平台上). 下面将介绍如何在Linux上安装和开发, 最终的客户端程序在交叉编译后将能运行在于其它的系统平台. 运行客户端程序, 你的系统需要相应的3D硬件和CPU支持; 当然, 速度越快越好. 对于Linux的安装, 客户端程序需要硬件具有”direct rendering(直接渲染)”功能; 大多的nVidia或者ATI图形卡都提供该功能.

Linden最初在Debian, Fedora Core 4和Knoppix上测试过客户端程序; 我在SUSE 10.1上做过客户端程序测试, 鼓励大家使用自己常用的Linux发行版, 如果你有什么问题, 可以提交到Linden开发人员的支持论坛上(见资源栏目的链接).

现在编译安装第二人生客户端程序并不容易, 然而对于一个软件包曾经关闭然后重新启动来说是正常不过的. 过去安装早期的Mozilla程序就如同恶梦一般, 比较起来, 第二人生客户端程序就如同漫步在公园里的感觉.

第二人生客户端程序现在是一个Alpha版本, 包含了许多更新. 你可以在第二人生Wiki的”编译浏览器(Linux)“页面找到最新的软件包和安装指导.

安装指导提示编译时间大概在”数个小时”. 我在多个CPU和不同的Linux平台下编译了数次, 编译时间的范围在1个小时20分钟到仅仅25分钟 — 硬件没有任何问题. 下面是我遇到的一些有趣的事情:

.依赖旧的软件包. 客户端不支持gcc4, 你需要使用gcc 3.4.
.使用商业软件包如fmod声音工具包; 它是”免费的”, 不过是闭源软件. 类似的, 客户端程序最初只能使用Kakadu JPEG, 而不是OpenJPEG(参阅资源栏目获得更多信息).
.依赖非标准的软件包如SCons. GNU make的替代程序, 它能够运行在大多的Linux发行版上, 但是很少情况下是缺省安装. SCons是必须要安装的软件包, 在开始编译前, 你必须要准备好.
.特别和额外的安装需求: 比如, ELFIO标准构建过程生成一个静态库, 第二人生浏览器程序需要安装静态库, 而且还需要xmlrpc-epi和专门的补丁程序.
冲突: 说到xmlrpc-epi, 它与xmlrpc-c发生冲突. 虽然很难说是客户端的错误, 加速3D图形卡驱动程序会阻止OpenGL程序的编译, 这样会导致一些重复的工作.

如果你过去常使用开源开发环境, 商业的构建过程似乎是十分糟糕的. 为什么存在这样的依赖性? 为什么在开始使用软件之前我需要建立这些的环境?

部分问题是(对于商业程序来说是这样的)假设你只想在已符合编译条件的机器上安装浏览器程序. 当你已经控制了开发系统, 你将很容易确保每一个开发工作站或者编译机器提供你需要所有的库. 第一次编译OpenGL客户端程序会占用你很多的时间.

你需要手工建立整个环境, 这将会耽误你的工作时间. 许多Linux系统自身不提供本地补丁和软件程序, 因此你需要做大量的编译工作, 甚至在第二人生代码编译之前, 你需要确保每个相互依赖的软件能够独立地运行. 在开源项目当中, 这些工作是司空见惯的; 但是不同地方是这里没有”配置”过程, 因为根本就不存在. 如果你的系统正确建立, 这将会节省你很多的编译时间. 但是如果没有的话, 将占用您许多时间.

准备好正确的环境, 实际过程和许多通常的路径自动创建好后, 你可以点击按钮继续下面的安装. 源代码下载页(见资源栏目)有一个表格, 显示了每一个版本的所有下载; 每一个支持平台的预编译库在表格行中分别提供下载.

整个安装过程不是完全自动的, 但也不需要很多的手动设置. 对于这个问题, Linden实验室可能会开发一套自动系统, 建立可视化的第二人生编译环境.

不同的是, 商业程序开发人员通常会假设已经完全控制了编译环境, 而开源软件通常能够在不同的系统平台上编译, 而且十分简单, 我们可能会这么做: 安装好gcc 3.4, 然后运行configure, make, 和make install安装第二人生客户端.

我不能通过运行configure, make和make install来安装第二人生客户端 — 因为根本就不使用make.

认识SCons

SCons用于编译第二人生的浏览器程序, 充当make的功能.

在我接触第二人生之前, 我从来没有听说过SCons. 最初的反应是”哦, 大声呼叫, 为什么他们使用的是出乎意料的商业程序, 而不是make呢?” 这样的反应差不多持续了5分钟, 也许10分钟. 然后我查看了项目网页, 我认识到我的反应(想法)是错误的. 首先, SCons不是”商业程序”, 不是make, 也不兼容make, 你不能称呼一个免费并且以源代码方式发行的程序为”商业程序”吧.

问题依旧存在, 为什么你们会使用一个大多用户都没有的程序(我的Linux系统是以”完全安装”方式安装, 也没有发现SCons程序, 虽然我在安装盘上发现了RPM文件), 而不是采用每个人都有的程序呢? 回答的结果会有很多; 坦白的说, 技术上SCons要强于make. 现在, 技术上的优势并不是绝对的; “广泛使用”和”大多人都熟知”的程序有着很多的优点. 然而, 这些优点在传统的开源环境中有着更强的作用, 在开源环境中你可以让陌生人能够选择你的项目, 然后协作开发, 而在传统的企业环境, 需要一个星期或者更多的时间来培训员工, 从而使他们能够更有效率的工作. 对于大型的编译工作(比如第二人生), 并行和分布式的编译具有很高的效率.

接下来你需要知道的主要事情是, 如果你不打算在编译过程中浪费时间, SCons需要使用到一个叫做”SConstruct”的项目文件. 因为SConstruct文件是Python程序, 它可以通过大量的内部配置工作来检查自身. 你不需要运行Configure来编译这些文件. 部分原因是SConstruct程序能够能够通过设置很多的编译参数来调整自己.

通过阅读SConstruct文件, 你可以深入了解编译过程. 你还可以在文件的注解部分了解到通过命令行传递参数的详细解释. 特别的地方如在文件头中推荐调用的编译版本针对的是每一个被支持平台, 而不是主机平台.

默认方式下, SConstruct文件使用内设的主机列表来进行分布式编译. 这是一个有意思的选项, 大概是SCons被采用的一个原因; make的许多版本都不支持分布式的编译, 但是如果你有一个正使用数个小时编译源代码的程序小组, 你可以考虑将来使用分布式编译的方法.

特定架构的优化
我们会想到一个问题, 为什么这里没有代码来卸载3D渲染, 比如, Cell BE芯片上的SPE协处理单元? 在实践当中, 回答很简单; 这里只有很少的面向用户的系统同时具有协处理来卸载和可访问的GPU来处理3D渲染. 例如, 运行在Linux上的PS3不能够访问系统上GPU. 对于大多用户来说, 在一定时间内将会开发出有着更高性能的功能. 也就是说, 虽然在商业上还没有见到, 但是哪些爱好者将会在项目中采用.

编译

Linden客户端程序的编译过程依赖于: 从许多不同的地方拷贝文件到一个集中的叫做”Linden编译树”地方, 这些不同地方包含了许多的Linux软件包, 包括它们的头文件. 你可以在开发者Wiki网页(见资源部分)上找到操作方法. 例如用于准备编译的Shell命令, 甚至如果你使用了预编译库, 这样来操作:

列表1. 拷贝include文件

cp -a /usr/include/atk-1.0 ${SLSRC}/libraries/i686-linux/include/
cp -a /usr/include/gtk-2.0 ${SLSRC}/libraries/i686-linux/include/
cp -a /usr/lib/gtk-2.0/include/* ${SLSRC}/libraries/i686-linux/include/gtk-2.0/
cp -a /usr/include/glib-2.0 ${SLSRC}/libraries/i686-linux/include/
cp -a /usr/lib/glib-2.0/include/* ${SLSRC}/libraries/i686-linux/include/glib-2.0/
cp -a /usr/include/pango-1.0 ${SLSRC}/libraries/i686-linux/include/

假设 ${SLSRC}指示你释放第二人生客户端程序树后的位置. 实际上, 我没有成功运行上面的命令, 因为在我的系统上, 所有的/usr/路径都已被/opt/gnome/替换; 例如, gtk的include文件位于/opt/gnome/include/gtk-2.0目录. 不过问题还是很容易解决, 之所以提供一个详细的列表, 大家可以亲自编写庞大的配置脚本. 你将需要花费一些时间来运行它.

编译过程页面上还提供许多类似的指令, 但是对于已下载的预编译库, 你可以跳过编译去直接运行. 简单调用带有几个额外参数的SCons:

列表2: 调用Scons

$ cd indra
$ scons DISTCC=no BTARGET=client BUILD=release

额外参数指定无论是分布式编译(不, 否则你将要做大量的网络准备工作), 分布式编译的目标就是编译(你只拥有客户端程序的源代码 ), 还是其它的编译方式(例如, 你可以编译一个调试版本). 如果你想同时运行多个实例, 只需增加add -j 3到scons命令行, 这跟GNU make是一样的.

目录树

第二人生的浏览器程序源代码有两个主要的目录: “libraries”目录, 包含了支持代码和头文件, 还有”indra”目录, 包含了浏览器程序的源代码, 还有linden的支持库.

.o文件位于/tmp临时目录; 特别的是, SCons在/tmp/username目录中构建目录树, username目录存放了输出文件, 在绝对需要时避免改变目录树本身. 相反, 二进制文件存放在indra目录的子目录newview/中. Linux二进制文件大概有131MB(unstripped). Stripped的大小只有26MB(瘦身了不少).

文档

你也许希望一个项目以开源的方式发布, 第二人生有一个Wiki栏目. 通常来说, Wiki不是最好的, 但是对于文档来说是一个不错的起点; 我会在接下来的文章中更加深入地介绍.

结论

了解事物的最好办法是看修改有多容易或者多难. 我将在第二部分介绍.

第二人生客户端程序的设计有一些有趣和与众不同的地方, 而且它不能与当前开源环境完全兼容(例如, 第二人生客户端实际上使用的是它自己的GUI图形用户接口库, 包含了完整的按钮和菜单, 而没有使用现成的库 — 在游戏开发中很少见, 但是更少见的是采取了开源开发方式), 第二人生的组织看起来也很不错: 具有好的开发模式和相应的开源发行方式. 模块更加模块化, 这是一件好事, 我会在下面文章中讲述.

资源

学习
. 初次接触第二人生吗? Wikipedia通常是”一个好的开始“, 虽然在你稍微熟悉过后再来查看会比较有用.

. IBM启动了”第二人生商业小组“来开发虚拟培训,会议和商业的潜力. 而且也正在开发如Virutal Sears中国故宫的虚拟在线复制项目. 一些人正在第二人生上开展谋生活动.

. 体验视屏短片, 观看虚拟世界2007, 描绘了在虚拟现实游戏中的商业机会, 更多关注于广告和娱乐.

. OpenMetaverse是一个正在开发的与第二人生开源资源相关的项目.

. 第二人生开源入口包括了在MS Windows, Mac OSX, Linux和FreeBSD下获得和编译源代码的向导, 还包括通常的编译问题, 等等更多. 你需要登陆(使用你的第二人生用户名和密码), 甚至你还能查看第二人生用户和开发人员论坛.

. 开发人员将会对学习Scons有所兴趣; OpenSL缺陷管理系统循序渐进地介绍如何增加不同的功能分类 — 甚至是奖金 — 人们将为需要改进的代码付款.

. 开源第二人生如何帮助开源社区? 例如, OpenJPEG比以前更好用了, 感谢第二人生客户端程序开发社区的贡献.

. 在第二人生游戏中创建事物, 请参阅使用Linden脚本语言(Dobb博士网页入口).

. 商业和开源开发环境有什么不同吗? 最大的不同是, 在商业环境中, 构建系统是为了程序的需要. 在开源环境中, 程序通常都是为了满足不同主机系统的需要. Peter许多关于工程方面折衷的想法都将影响到开源软件的开发方向, 同样也受到了Eric Raymond书籍的影响,: Unix编程的艺术(Addison Wesley). 更多的是, Peter与Linden的谈话”Open Source Busybody“中获得更多的见解,” Rob Lanphier.

. 访问 developerWorks Linux Zone 获得更多Linux开发者资源.

. 随时关注 developerWorks 技术事件和网络广播.

获得产品和技术

.订购免费的 SEK for Linux,这有两张 DVD,包括最新的 IBM for Linux 的试用版软件,包括 DB2、Lotus、Rational、Tivoli和 WebSphere.

.使用 IBM 试用软件 构建您的下一个 Linux 开发项目,这些软件可以从 developerWorks 上直接下载.

讨论

通过参与 developerWorks blogs 加入 developerWorks 社区.

关于作者
Peter Seebach 有多年使用计算机的经验,已经逐渐变成了计算机高手. 但是他仍然不知道为什么需要如此频繁地清理鼠标.

备注
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.

Keyword: , ,