赞
踩
用什么程式语言来做软件是一个大问题,思考了一个周末,现时想做一个混合语言的游戏开发系统架构。暂时只考虑三种程式语言: C++、C# 及Lua。以下首先分析这三种语言的特性,之后再提出一个系统架构科案。
C++是一个strongly typed、static、multi-paradigm (procedural, object-oriented, meta-programming) 的语言。基本上是游戏引擎的 de facto 语言,其实没有什么第二选择。
优点
缺点
C# 是为.Net 而设计、 strongly typed、static、object-oriented 的语言。 C# 的语法参考了C++的语法,但作了许多改善。
优点
缺点
Lua 是一个dynamic、weakly typed 的脚本语言。 Lua 被应用到许多商业游戏当中,最为人熟悉的例子如Far cry/Crysis 用Lua 来做gameplay、World of Warcraft 用Lua 做使用者接口。这些例子中Lua 版本的API 也开放给玩家来做MOD 或Add-on。
优点
缺点
没有一个程式语言适合做所有的任务。我把以上的资料编成一个简单的表:
一个游戏通常会由不同的人员制作,编程人员大概可以分为做Technology、Toolset、Gameplay等领域。Technology 指做游戏引擎核心部份,或客制化第三方的游戏引擎。Toolset 包括面向不同使用者的软件工具,从Content pipeline (如汇入汇出档案)、Asset Management、Level Editor及其他编辑工具等。而Gameplay 是指游戏内容中的行为部份,可以分为游戏的核心行为(如人物控制、战斗系统),及为个别人物及关卡编写的行为(如NPC对话、AI、任务、场境中的trigger等等)。
基本上Technology 的部份需要高效、跨平台、和低阶API连接。基本上只可以选择 C/C++。
Toolset 的部份需要许多GUI 的部份,也要因应使用者(美工、关卡设计、音效设计等)的要求迅速改变或加强功能。另外Toolset 要处理不同种类的档案,现时常见会使用XML 作为中介的档案(如COLLADA)。以上三种语言其实都可以使用来做toolset。用C++ 的话可以选择一个GUI API 如Win32、MFC、WTL、wxWindows、Qt 等等、或使用自己开发的GUI API。但是用C++ 开发GUI 的时候,编程困难程度比较高,编释时间亦长。这两点可能不符合需要经常改变需求的Toolset。如果使用脚本语言来做GUI 的话,就需要一个好的程序库连接及工具。许多时候这些脚本用的程序库和原来的GUI 程序库会有版本后滞的问题。所以,我暂时认为用C# 做大部份工具是比较好的选择。 .Net 提供的GUI (Windows Form) 及XML、Regular Expression 等功能也支持得很好。
而 Gameplay 的部份是经常要改动的。除了纯粹改动数值外,还要在行为的处理上改动。对于个别人物和关卡的编程可能由关卡设计师负责,他们的编程能力可能相对较低。脚本语言比较适合。有一些情况也可以用视觉化的脚本来表达。首先尝试用 Lua 吧。
以下两张图是现时对于混合语言的游戏开发系统架构的设计。
游戏执行期
游戏开发期
两张图的橙色部份都是由Swig 生成的模组。 这个设计是基于以上的分析,把Technology、Toolset和Gameplay的部份用各自最适合的语言来实现。 为了跨平台的需求,在执行期的版本是没有C#的部份,只使用Lua 的轻量脚本Runtime。 C++ Engine 设定为执行期和开发期的共通部份,所以把需要用C++ 的Toolset 部份抽取了出来。 而在游戏开发期中,希望可以在工具里直接运行及调试游戏,所以会同时有三个语言的执行环境。
在搜集资料的时候,看见可以把Mono 的CLR 嵌入程式中,就好像把C# 用来做脚本语言。连接的实现方式类似于P/Invoke。用Mono 作为Gameplay 的脚本引擎是很吸引的。在效能上,由于采用Just-in-Time (JIT) 把MSIL 翻译至native code,执行速度一定会比直译式的脚本快。 C#在语法上跟C++/Java相似,许多人会懂得使用。此外,Mono 利用CLR 的特性,还可以支持其他语言。 这个方案的其中一个问题是它不太Light-weight。或许可以删掉大部份的程序库及JIT来改善。另一个想法是,透过另一种语言的结合,可以引证系统的可延展性。基于可延展性,在将来也可以考虑加入用Mono来做Scripting。所以暂时采用 Lua。
原来只是想记录一些想法,却发现写这篇日记花了多个小时。希望除了作为一个记录,也可以引发大家一起讨论,那么也可能是值得的。
我后来使用这架构开发 Mil Engine,但在开发中,我放弃使用.Net 的 XML 库,而采用C++的 rapidxml 开源库。之后会介绍陆续介绍 Mil 和把它开源。
其实一般游戏引擎都会使用脚本语言,本文旨在分析及设计。而使用.Net来做ToolSet并非主流商用引擎的选择,但在Mil 中也证实是一个很好的选择。
本文原来是繁体中文,在2008-02-22发表于http://miloyip.seezone.net/?p=7,本文經過修正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。