MVC(模型-视图-控制器)游戏引擎体系结构-是或否?[关闭]


18

我正在阅读一本很棒的书《Game Coding Complete》,该书强烈建议使用MVC(模型-视图-控制器)方法,并具有三个关键层:

  1. 游戏应用层
  2. 游戏逻辑
  3. 游戏画面

在我看来,这种方法似乎对移动计算机游戏来说是一个过大的杀伤力。

请问您对此有何看法?即使增加了模块之间所需的额外通信,实现这种体系结构是否值得?此设计是否会消耗大量CPU能量,以致最终结果会比未实现时慢得多?


5
-1并投票关闭。关于游戏中的MVC的所有值得一提的内容都在gamedev.stackexchange.com/questions/3426/…上进行了说明,到目前为止,我们所得到的只是垃圾。

@Joe Wreschnig这是相当苛刻的,但我想真正的...
斯波克斯

@chaos:实际上,我对您的答案投了赞成票,但是我们真的不需要另一个答案说“如果有帮助,请使用模式,否则请不要使用”。也许我们做到了,但是那仍然很可悲。但是,我仍然不知道如何引用诸如垃圾之类的“继承之类的运行时设计”之类的表达式。

2
@乔:哦,谢谢。:) OOP是免费的,这种说法有些让人吃惊。我通过一些标准,我们想应该不会像我重申需要百分点,但菜鸟会发生,所以做debatably重复的问题。它也起到了让后来者到我这样的站点的作用,尽管活动已经大量消失,但也收集了一些代表。:)我的意思是,该死,我有40K代表,但在这里我什至无法编辑标签Wiki。
混乱

Answers:


30

我什至支持将MVC结构用于简单的移动游戏。如果没有别的,它可以解决一个困扰没有足够时间被开发者困扰的问题:将显示代码与游戏逻辑分离。

不过,我还要说,要记住,MVC与所有设计模式一样,可以使您的生活更轻松。这意味着,如果在任何给定时间遵守有关使用MVC时应该做什么和不应该做什么的一组规则,将会使您的生活更加艰难,请忽略它。将发生以下两种情况之一:1)您稍后会被咬,然后将理解为什么从头开始做不同的事情从长远来看实际上会让您的生活更轻松,或者2)没有任何后果。

从本质上讲,计算机程序设计吸引了许多规则制定者,他们重视遵循优雅原则而不是实际完成任何事情,并且他们喜欢提出自己的价值体系。不要让他们让你成为其中之一。您的游戏可能发生的最重要的事情是发布


亲爱的混乱,我最喜欢您的回答,因此,我将其标记为对我的问题的回答。MVC方法将抽象添加到代码设计中。通常,抽象会增加额外的代码步骤,而这些代码可以通过更加直观的设计来避免。据我正确理解,我不必担心由于MVC设计而增加的抽象所带来的成本。
Bunkai.Satori 2011年

1
好的答案,+ 1。.理论虽然很好,但是如果您不做的话,可能会导致游戏无法交付。
詹姆斯

@ Bunkai.Satori:它确实添加了抽象,而IMO则是有用的抽象。我同意你的最后一条语句,与澄清,有有成本的,而且我不认为你需要它担心。
混乱

4

除非您拥有令人难以置信的糟糕的编译器,否则编译时设计不会消耗CPU能力。面向对象的语言或方法的性能特征与过程语言没有什么不同。您不会为使用MVC调用任何其他开销。模块化存在于编译时,而不是运行时,一旦代码被内联和优化,就不会有任何区别。

许多现代游戏实际上在单独的线程上运行模型和视图,并在大多数平台上获得了巨大的性能优势。

最终,MVC是一个不错的设计,可让您免费获得更多的维护和更少的错误。没有理由使用它。这就像问为什么要使用for循环而不是手写的gotos。除非您有出色的设计,否则肯定比没有更好。

编辑:编译时设计不消耗CPU能力。像继承这样的运行时设计显然可以做到。


-1。MVC是设计时的决定。继承是设计时的决定。两者都发生在编译时和运行时之前。两者都会对性能产生重大影响。内联并不总是使代码更快。您的线程建议非常幼稚。没有什么是免费的。

谢谢DeadMG的回答。基本上,我的意思是,随着越来越多的中间步骤的添加,每个抽象级别的代码都会变得混乱。MVC是更抽象的设计,最有可能导致完成相同任务的更多步骤。这将对速度产生影响。
Bunkai.Satori 2011年

4

在代码的清晰度和程序的技术要求(速度,内存等)之间,几乎总是要权衡取舍。面向对象的语言与过程语言相比具有开销,但是事实证明它们比过程语言具有许多优势,尤其是在代码的长期维护(错误等)以及开发速度方面。

因此,考虑到这一点,我建议MVC作为游戏程序员值得为您实现。您的代码将更好地遵循面向对象的原则,尤其是封装,并且可能会更容易维护(修复错误或添加新功能)。

另一方面,请确保实际完成游戏,不要花太多时间在“引擎”上工作,以至于永远无法完成。

有关更多信息,请阅读问题“为什么不在游戏体系结构中更多地使用MVC和TDD?” 我的回答很长。


1
面向对象语言一点也不比过程语言慢。如果您用C ++编写一些进行位移位的代码,它不会比C中的任何慢。语言或程序与过程相比,根本不会比过程慢,只是因为它是面向对象的。程序只会表现性能下降,因为它们的编写不好。结果,我觉得有必要降低您的回答。
DeadMG 2011年

嗨,里基特,谢谢你的解释。听起来很合逻辑。DeadMG,好的,一方面,您是正确的;另一方面,我认为OO方法比程序语言在编译后的代码中添加了更多信息。OO相关代码的这些额外位使生成的代码变慢。你同意吗?
Bunkai.Satori 2011年

3
现在,哇...确保C ++中的简单行将与C中的行a++完全相同a++(其中a是原始类型等)。但是考虑一个简单的C ++类,该类具有一个执行某项操作的虚函数,即使内部代码相同,该虚函数与简单的C函数相比也会产生大量开销。面向对象的语言有开销。很抱歉明确地说出“速度”。如果额外的内存分配不会导致程序变慢,那么您是绝对正确的。
Ricket

2
如果该函数是虚拟的,则意味着程序需要在运行时在同一函数的2个不同版本之间进行选择。(否则,您将不会使其虚拟化。)在这种情况下,无论如何,您都有额外的条件或间接级别,您必须使用过程语言来实现自己(例如,通过函数指针或switch语句) 。这不是开销,这是问题的本质。
Kylotan'1
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.