脚本语言在游戏编程中的作用

时间:2009-03-04 02:51:52

标签: c++ scripting

所以我一直在讨论脚本语言在游戏开发中的正确作用。据我所知,有两种思想流派:

1)脚本语言功能强大且功能齐全。大部分游戏代码都是用语言编写的,代码只有在性能表明它是必要的时候才会被转移到C ++中。这通常类似于Lua或Unrealscript。

2)这种脚本语言非常有限。几乎所有的游戏代码都是用C ++编写的,语言只是为了向设计人员公开底层功能。

我的沮丧来自于看到第二种方法经常被滥用,大型系统以一种语言实现,该语言没有使该代码可维护的功能。

所以我开始支持第一种方法,但在与一些设计师交谈后,我意识到他们中的许多人似乎更喜欢第二种,而且大部分程序员更喜欢一种。

所以我仍然想知道哪种方法更好。我只是看到错误的代码并指责工具而不是程序员,还是我们真的需要一个更复杂的工具?

12 个答案:

答案 0 :(得分:18)

当你处理像视频游戏一样复杂的东西时,编译的C ++代码的编译链接运行测试周期非常非常慢。使用脚本引擎可以让您对游戏进行大的功能更改,而无需编译程序。这是一个巨大的,大量的时间节省。如你所说,需要优化的东西可以根据需要转移到C ++中。

AAA引擎受脚本编写的高度推动。 Torque,用于Tribes II(以及许多其他游戏!)是脚本化的,Unreal有Unrealscript等等。脚本编写不仅适用于mod,它是高效开发的关键。

答案 1 :(得分:16)

我认为设计师需要看到适合他们的语言。这是不可协商的:他们必须花时间设计,而不是编程。

如果脚本允许快速开发具有产品价值的游戏代码,那么程序员也应该这样做。但它必须具有产品价值:做两次都不能节省时间。因此,您必须将脚本保留在原位。如果开发人员可以在一周内编写库存系统脚本,或者在一个月内用C ++编写,那么您需要功能全面的脚本,如果只是为了给您更多时间来手动优化可能会达到性能限制的部件。所以不是库存,高分表,键映射系统,或高级游戏逻辑,如角色应该做的事情。如果这样做可以节省您花费在加速图形和物理上的任何时间,那么这些都可以编写脚本:程序员需要能够确切地解决瓶颈问题,高级程序员可以做出合理的预测,赢得了什么?是的。

设计人员可能不应该知道或关心程序员是否使用脚本语言来实现游戏代码。他们不应该(1)是好还是坏。所以,即使程序员想要(1),为什么这会给设计师带来不便呢?他们甚至注意到脚本语言是全功能的,如果他们只需要相当少量的标准配方?出了点问题,但我认为Lua不是一个好的语言。

一种可能性是,对两者使用相同的脚本语言,成为在设计者使用的接口和游戏代码内部接口之间划清界限的障碍。正如我在顶部所说的那样,这是不容谈判的。即使他们使用相同的脚本语言,程序员仍然必须为设计人员提供他们完成工作所需的功能。仅仅因为设计师使用Lua编写AI策略和对话树,而Lua是能够编写物理引擎的全功能语言,并不意味着您的设计师需要编写自己的物理引擎。或者使用Lua超过10%的功能。

你可以同时做(1)和(2)。没有理由你不能给程序员Lua和设计师一些微型功能不足的DSL,它用Lua脚本“编译”到Lua中。

答案 2 :(得分:13)

我认为你想要的平衡是这样的:你需要在脚本中使用游戏逻辑,但在代码中需要游戏功能

脚本的一大优势是您可以轻松设置等待。例如:

enemy = GetObjectFromScene(“enemy01”);    在5秒内{enemy.ThrowGrenadeAt(玩家); }

只是一个人为的例子。这种逻辑在C ++中设置会很烦人。脚本可以更容易地表达这种逻辑,但是你希望实际的功能(它调用的函数)是用C ++编写的。

脚本不会 变慢。在游戏机上以60fps运行大量脚本游戏,但它需要良好的设计并在上面的选项1和2之间找到适当的平衡。

答案 3 :(得分:7)

我无法真正看到大量脚本代码优于大量C ++的论点。人们可以提出反驳论点。我已经看到了用脚本语言编写的可怕的大型项目,这些项目始于脚本的心态 - 让事情快速而肮脏。遗憾的是,这不能很好地扩展。实际上没有办法仅仅基于编程语言来制作代码质量参数。人们可以用任何语言编写可编辑代码,编译或编写脚本。

无论如何,在不知道性能瓶颈在哪里以及用户最想要“编写脚本”的情况下,真的不可能知道“方法1”和“方法2”之间的界限。

我建议使用“方法3”来完成或部分在C ++中完成,并在C ++中公开一个干净的SDK。这样做的好处是可以强制您编写代码,就好像它是组织外部的用户界面必须使用的那样。它有望使其更易于维护,并为您实现脚本界面带来额外的副作用。您现在需要的所有脚本界面都转发到SDK。中提琴!

使用这种方法,您可以避免在“脚本化”与“C ++”之间划分界限。您和您的用户可以选择使用SDK在C ++中添加功能,也可以使用脚本语言。

答案 4 :(得分:3)

像往常一样,我认为答案是“这取决于。”

没有办法Halo 3或使命召唤4可能主要基于脚本。通过定义,顶级AAA级游戏必须推动他们触摸的任何平台的信封。这不能用脚本完成。

然而,休闲游戏是一个不同的故事。像Unity这样的主要游戏团队都有很多内置的脚本。

还有一个mods市场。具有良好脚本环境的可靠游戏引擎可以成为调整,推导以及在某些情况下完全是新游戏的平台。反恐精英是我个人最喜欢的例子。我认为你在这种情况下仅限于FPS跑枪式游戏。

因此,在游戏中有一个脚本编写的地方,但它可能会留在小型/休闲游戏和modder的空间中。

答案 5 :(得分:3)

行动脚本的最佳例子之一是Civilization IV。它使用Boost Python。结果,它非常缓慢。与“当性能指示必要时将代码移入C ++”这一陈述明确对立。

正确的方法是设计一个体系结构,并确定哪些问题在计算上很难以及哪些问题在预先指定时很复杂。图形,物理,寻路,输入的即时反馈,文本到语音 - 所有这些都在计算上很难。 “友好或敌对的立场”,“捍卫或攻击”,“花钱或保存”类型的人工智能决策都很难预先指定。

结论是,您希望将有能力但无灵魂的演员暴露给您的脚本代码。脚本代码描述了演员应该做什么,但C ++代码负责如何

关于编译链接循环,拥有适当的模块化架构非常重要。在处理路径寻找逻辑时,您永远不必编译图形代码。此外,像Incredibuild这样的工具可以帮助加快编译时间。大型游戏公司可能已经拥有一个渲染农场,它可以在编译农场中翻倍。

答案 6 :(得分:2)

说游戏应该只使用C ++(或声称AAA标题是这样完成的)只是无知。现在大多数游戏都以某种方式编写脚本,无论是专有脚本语言(UnrealScript),通用语言(Lua,python,C#,Java等)还是数据驱动(xml,专有二进制格式等)。只需进行一些研究,您就会发现大多数引擎都采用某种形式的脚本。

我认为是否拥有强大且功能齐全的脚本语言与极其有限的脚本语言的问题正在从错误的一端接近问题。应该设计脚本环境(语言或数据驱动),以便最好地支持创建游戏的过程。系统的表现力至关重要:设计师和脚本编写者应该能够轻松解决他们遇到的问题而不会有太多麻烦,同时他们不应该暴露于他们难以理解和学习的过于复杂的系统。通常程序员(包括我自己)倾向于通过假设如何使用系统来设计系统,并试图确保地球和天堂之间的所有特征都能被实现,从而导致系统复杂化。由于这种复杂性,设计师最终使用最小值来完成工作。

例如在我们的游戏(Rochard)中,我们设计了一个完全可扩展且可编写脚本的数据驱动AI系统,但关卡设计师最终只使用了库存AI模式,因为他们没有时间或精力来充分利用AI系统。所以最后我创建了一个很好的用户界面,可以轻松选择那些库存AI模式。

我认为这件事没有灵丹妙药。

答案 7 :(得分:1)

  

所以我开始支持方法   排名第一,但在与一些人交谈之后   设计师我意识到他们中的很多人   似乎更喜欢第二,和它   主要是喜欢一个的程序员。

这应该是显而易见的:如果脚本语言是“功能强大且功能齐全”,那么设计人员就有责任创建系统,因为他们可以利用这个机会。另一方面,如果脚本语言只暴露硬编码游戏的小细节,那么程序员必须创建这些系统,因为设计师不能。我并不是说每一方都是懒惰的,但显然两者都有项目要求他们专注的个人技能(因为没有其他人能够有效地做到这一点),这意味着如果有其他人做任务,他总是有兴趣可能的。

在此之后,正确的角色将取决于您公司的人力资源如何布局,以及游戏的任何性能要求。一旦你知道有多少人需要任何类型的脚本,你就会知道游戏需要多少,因此可以决定界面需要的宽度或范围。这有助于该语言的“域名”,如上面的onebyone.livejournal.com所述。

(值得一提的是,我是一名专业的游戏开发者,也是Gamedev.net上的脚本语言论坛的主持人。)

答案 8 :(得分:0)

游戏开发社区已经将脚本编写为构建用户界面和调整AI响应的常用方法。您可以在Gamasutra等网站上找到很多信息。有趣的是标准语言开始取代自定义解释器。

想到AAA游戏中最好的两个脚本示例是魔兽世界(使用Lua)和EvE Online(使用Python)。 EvE也在服务器端使用脚本:他们在Stackless Python上投入了大量资金。

更新:由于多核,性能基本上不会出现问题。即使是低端机器也会比显示器和模型更新所需的内核更多。您也可以花一个核心为UI运行脚本解决方案。

答案 9 :(得分:0)

如前所述;使用脚本编写游戏逻辑,使用C ++编写游戏功能。一个例子是脚本化游戏模式,但使用C ++进行渲染。

答案 10 :(得分:0)

如果我们将游戏分为两部分:引擎和实际游戏(设计)。

一个坚实的顶级游戏引擎很可能用C / C ++编写,有些人甚至用汇编代码进一步优化。你可以使用特定的CPU指令为图形和物理做很多非常快速的东西。在仅使用脚本语言渲染大型景观或多个复杂对象时,无法获得性能。

当涉及到游戏本身时,可以在较慢但更高级别的编程语言中完成许多方面。 AI和其他游戏逻辑可以用脚本成功编写。它可以加快开发速度,并以简单的方式为模块化和社区扩展开辟了道路。

答案 11 :(得分:0)

我认为这里的海报对于方法#1是正确的。这是一种更清洁的方法,尽管有设计师的抱怨,但仍会产生更好的长期效果。最后,代码将从平庸(坏)中确定好game programming