用什么static语言来做软件是一个大问题?

用什么static语言来做软件是一个大问题?

用什么程式语言来做软件是一个大问题,思考了一个周末,现时想做一个混合语言的游戏开发系统架构。暂时只考虑三种程式语言: C++、C# 及Lua。以下首先分析这三种语言的特性,之后再提出一个系统架构科案。

三种语言的比较C++

C++是一个strongly typed、static、multi-paradigm (procedural, object-oriented, meta-programming) 的语言。基本上是游戏引擎的 de facto 语言,其实没有什么第二选择。

优点

缺点

C#

C# 是为.Net 而设计、 strongly typed、static、object-oriented 的语言。C# 的语法参考了C++的语法,但作了许多改善。

优点

缺点

Lua

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发表于,本文經過修正。

摘自混合语言的游戏开发系统架构 - Milo Yip - 博客园 ()

文章来源:http://mp.weixin.qq.com/s?src=11×tamp=1688793171&ver=4637&signature=MUHGc*iHk52TkahqxbdkvosIr7*UoxFaSFhoDknP7jAJMjGgtVFpi0bdtPaSwYIG4UqBWAGtW9HCRiZhrESpGb*xkoc09s685Gp3ii*PNI4FsCMLfebcxd4b0TM1LFWl&new=1