什么时候应该对数据进行硬编码与加载外部数据?


36

我需要大约一千行代码来制作自己的2D天基游戏,该游戏创建随机生成的恒星系统的网络,并随机选择行星,驻地,船只和武器来填充它们。

游戏可能需要使用数百个不同的站点/飞船/等-这就是我想知道的。我是否应该花时间创建一个“软编码”数据加载器,该数据加载器会将所有这些信息存储在(例如)XML文件中,因此在以后进行修改时会更容易些,还是我应该简单地处理一下现在正在做-将所有对象硬编码到游戏的主引擎中。

我是该项目的唯一人员,正如我所说,这只是我业余时间在大学以外从事的业余爱好。但是社区会建议投资创建一个额外的系统来将数据存储在其他文件中吗?

用这种方式对数据进行软编码与通过构造函数对所有数据进行硬编码相比,有什么好处?可以修改外部文件是否有长期利益-如果我不希望游戏具有“ mods”,是否需要外部文件?如果这只是我几周或几个月内会放弃的业余爱好,我应该在这上面浪费时间吗?


10
您要查找的术语是“数据驱动的”,是的,从长远来看,使用XML(或真正的JSON之类的任何格式)文件创建新工作站并附带它要比在较小项目中执行的操作快得多。再加上以后,您可以删除和编辑而无需触摸代码和重新编译,从而节省了第二次时间。
Patrick Hughes

@PatrickHughes在输入我的答案时,您已经在评论中了!
MartinTeeVarga

1
如果我们试图将“软编码”合法化为真实术语,那么我建议采用“将硬编码输入用于软编码数据矩阵”的公司编码。
肖恩·米德迪奇

1
@ Singular1ty这个站点比其他一些SE更宽容讨论。我认为您的问题符合“良好讨论”的资格。
塞斯·巴丁

2
@ Singular1ty啊,就在这里。我发表第一条评论时找不到。 blog.stackoverflow.com/2010/09/good-subjective-bad-subjective
Seth Battin

Answers:


62

是。您应该实现一个系统,以将内容加载到主机之外。

简洁答案的标题。

不会。它不会消耗太多时间。

我认为这是否是对您有限时间的有效分配的问题尚无定论;即使仅占项目总时间的一小部分。

您将花费数百(数千)小时来完成一个游戏项目。也许不是在Pong克隆上,但是对于复杂的太空游戏肯定是这样。将其与配置文件读取器进行比较。实现一个系统来管XML到主构造函数,并随后重新启动游戏过程中,将采取也许 10或20小时。即使您需要花费50或100,也仅占项目总时间的一小部分。

节省时间

这不是时间上的花费;这是时间上的投资。它将得到回报。

工作流程很重要,拥有配置加载程序将使您的工作流程更好。通过创建一个允许您即时编辑配置的系统,您将节省无数的重建。您可以在游戏运行时查看它,调整XML并在几秒钟内重新检查。或者,您可以查看代码,查找一行代码(成千上万个代码),非常仔细地编辑其值(毕竟,您位于主引擎中),重建,执行,使游戏回到测试状态,尝试记住更改之前的外观,并查看更改是否达到了预期的效果。假设您的发动机没有任何损坏,那么您的行程肯定会中断。

从更基本的comp-sci角度来看,请记住,编写软件最耗时的部分是没有几次额外的击键或空格。这是在寻找错误。而且,如果您花一些额外的时间通过编写更多详细的代码来使事情变得更清晰,则可以节省更多的时间。在您的情况下,编写内容导入器可以使代码更简洁,更易于阅读。您的源代码将具有简单的文件加载功能,而不是英里数的硬编码值。同样,您无需阅读游戏引擎代码即可读取配置文件。这两部分都变得更易于维护且更易于调试。

一人团队受益最大

如果您雇用了一名艺术家来创作其中的某些内容,则需要为他们制作工具。他们需要进行像素编辑,并迅速看到效果。您不敢强迫他们重建代码以查看所有更改。他们的时间很昂贵,您不想浪费时间。

现在想象一下,艺术家是非常熟练和缓慢的(程序员艺术家),并且还有很多其他事情需要担心,因为他们也是主要的程序员和音乐家。您绝对不想浪费时间,否则项目将永远无法完成。而且,这位cr脚的艺术家会讨厌接受培训成为一名更好的艺术家,因为他们将所有时间都花在重命名代码中的资产字符串上。

不要对自己这样做。制作工具,您将有更多时间制作游戏。


3
哇,另一个奇妙的答案!非常感谢。我绝对同意能够快速更改值的功能-以及寻找错误的能力。忘记一两个小事情很快就会变成一场噩梦,我想做的一切事情都是减少联盟,名称和船体/武器值之间的微小变化而不断重复执行相同代码行。
Singular1ty 2013年

赛斯,欢迎来到您的新特权级别。使用您的关闭并重新打开投票!
MichaelHouse

谢谢,谢谢。我将等一会儿再使用它们。我从删除的投票帐户中获得了一些代表波动。
塞斯·巴丁

10

这是一个很好的问题,我能给出的最佳答案是,只有经验才能真正告诉您何时走更困难/更耗时的道路是一个好主意。如果有人告诉您您应该始终以“正确”的方式进行操作,那么他们就是错误的。

您已经了解到这是一个陷阱。一方面,硬编码之所以诱人,是因为它快速且容易上手,但是从长远来看,添加功能和调试将变成噩梦。另一方面,编写一个出色的,灵活的,可扩展的系统需要大量的初始投资,但从长远来看,这会使生活变得轻松得多。

我们的目标是完成某件事,如果您陷于无法建立一个好的系统,那么目标将进一步降低,您将失去动力。硬编码的东西在某些情况下还可以,但是您必须了解这样做的后果。硬编码不是一个好主意的原因如下:

  • 您可能认为您的项目很小,但是随着您决定添加更多功能,它可能会增长。如果您从硬编码开始,那么维护它(用新的东西更新它并修复各种不可避免的错误)所需的精力将开始严重超过最初的收益。

  • 硬编码的东西是根据定义特定于当前项目的。对于下一个项目,您将不得不从头开始,可能再次进行硬编码(因为这是您会满意的)。如果您将时间花在了一个体面的加载系统上,则可以跳过所有以后的项目中的工作和麻烦工作。

  • 您现在可能独自一人工作,但有时可能希望将其他人带入该项目。您是否要花时间解释令人讨厌的狭par系统并为其编写文档?

  • 硬编码通常涉及必须知道某些魔术数字的含义或复杂的类依赖性。您现在可以将其牢记在心,但是只需等一会儿即可离开代码。即使有大量的评论,设计不当的结构也要追溯到最后。

我想说,您应该只对最小的细节进行硬编码。如果您对正在被其他人使用,正在变得越来越大或正在另一个项目中使用的元素甚至只有丝毫的想法,那么现在就花点时间做吧。

另一方面,我像疯子一样制作原型,并且对某些事物进行硬编码既快捷又容易,使您可以专心进行实验。这取决于您的工作风格。


感谢您的回答。我已经发现我的系统已经失控了。因为扩展了Java中的内容,所以我的类通常有大约十到十五个构造函数参数,而我总是忘记它们按哪个顺序进行。我习惯于做“快速而肮脏的”事情,因为我的注意力跨度很短,但是我想一次完成一个项目。另外,如果我以后需要调整统计信息,我也不想陷入拖曳一千行硬编码对象的困境……
Singular1ty 2013年

@ Singular1ty在这种情况下,请停止当前正在执行的操作。现在该疯狂地重构了。忘记任何新内容,而专注于改善现有总体结构。我在一家游戏公司工作,并且我一直在努力休息和重构。但是,当然,它充耳不闻,我们总是像疯了似的,咬紧牙关,在虫子/黑客出没的泥潭中徘徊。何哼
DaleyPaley 2013年

8

您所说的是数据驱动的编程

对于小型项目,可能不值得花费时间,因为您通常可以改进许多更重要的功能。

但是,数据驱动的编程非常容易实现。如果您对此很认真,则可能应该使用XML,JSON或YAML,但也可以使用纯文本文件。

数据驱动的编程

优点

  1. 允许设计人员无需编程知识即可访问和修改游戏数据
  2. 您可以对游戏进行修改,而无需重新编译。这不应该被低估,因为您可以通过这种方式更快地开发游戏。好的游戏经过很多次迭代。

缺点

  1. 实施需要花费时间和精力。
  2. 这可能会增加程序的复杂性。

这些只是我现在能想到的一些利弊。让我知道您是否还有其他想法!
Nick Caplinger

1
我批准了您对标题的修改。
Singular1ty 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.