尽管C ++似乎是国王,但据我所知,C仍广泛用于游戏中,尤其是在游戏机上。但是,今天用C编写整个游戏引擎会不合理吗?与C ++相比,C有什么优点?为什么有人可能想通过C ++使用C?
尽管C ++似乎是国王,但据我所知,C仍广泛用于游戏中,尤其是在游戏机上。但是,今天用C编写整个游戏引擎会不合理吗?与C ++相比,C有什么优点?为什么有人可能想通过C ++使用C?
Answers:
但是,今天用C编写整个游戏引擎会不合理吗?
这是合理的,但问题是它能给您带来什么?您可能不需要C提供的极端可移植性,并且放弃C ++提供的所有功能实在可惜,除非您真的从哲学上反对它。
与C ++相比,C有什么优点?
更好的编译时间?
为什么有人可能想通过C ++使用C?
我认为这主要是审美选择。许多人喜欢C,因为它简单,最小并且感觉很干净。C ++具有很多不错的功能(仅名称空间就值得使用),但它又大又杂乱。
#define malloc(x) my_malloc(x)
#define free(x) my_free(x)
,您现在正在调试内存。使用C ++,您永远都不知道什么时候会分配什么,因为分配内存的方法有很多(新的,malloc,类构造函数等)
我已经与已经交付了多种产品的纯C游戏引擎进行了广泛的合作,因此这是绝对可能的。这是我在C和C ++引擎中工作的个人经验:
使用受约束的C ++代码(避免使用模板和对序列化对象的继承),也可以轻松实现所有这些好处,但是CTO决定,如果不使用C ++更加令人困惑的元素,则可以更轻松地实现简单性可用。
我个人认为这有点极端,因为我确实错过了在for循环中明智地声明变量以及继承的许多完全合法用途的能力。但是,考虑到所有因素,最终并没有使我们付出太多生产力
我正在将用C ++和Lua编写的2D游戏引擎重写为C和Lua。到目前为止,经验非常好。显然,在C语言中进行向量和矩阵运算的效果不佳。但是除此之外,我发现作为C ++开发人员花了10年以上的经验使人耳目一新。
与C ++相比,C具有许多优点:
除此之外,进入C思维方式还有许多优点。在C ++中,我经常发现自己使事情变得过于笼统和抽象。在CI中,通常会删除诸如get-set方法之类的东西,并且通常会预先分配固定大小的数组,而不是使用动态数组。通常,我最终会在C语言中得到更短,更容易调试的代码。数据结构通常更平坦,更易于在调试器中查看。
公平地说,我永远不会只使用C来开发应用程序。我之所以将它与高级语言(例如Lua)结合使用的原因是,如果C语言不是那么强大,它可以很好地补充C语言。
Id软件使用CI编写了他们的大多数引擎,您可以看一下用C编写的《重返城堡》。
我写了一些有关C vs C ++可伸缩性的经验,以及与普通数组相比STL向量的缺点。
我认为现在没有人专门使用C,通常将它与高级语言混合使用。
例如,用C进行编程比使用C ++进行编程有一些好处。C ++ 可以做很多用户看不见的事情,如果不注意的话会损害性能。C ++ 可以也很糟糕,当涉及到高速缓存使用,这也可以伤害你的表现。
因此,以类似C的方式而不是传统的C ++方式编写游戏的性能关键部分可能会带来一些好处。近年来,我从未听说过有人用C编写整个游戏。
在某些平台上,例如iPhone,使用C ++可以将可执行文件的大小增加一定的千字节(我忘记了多少,对不起),这就是一些iPhone开发人员选择混合使用C和Objective语言编写代码的原因-C。
我将为您提供更多的理由,说明为什么现在用C而不是C ++编写游戏引擎是不合理的:STL和BOOST。
我无法想象list
当您可以依靠开箱即用的代码(而不必编写!)时,再编写一个实现是值得的。
当然是合理的。我个人不会这样做,而且我认识的大多数C爱好者实际上只是在.cpp文件中编写类似C的代码。但是这些语言与实际上无关紧要的地方足够相似。
至于为什么有人会选择这样做,我认为这主要取决于反C ++的哲学。就我个人而言,我仍然不认为这是选择C而不是“ C-style C ++”的好理由。typedef struct Crazyness是避免使用C的充分理由,还有很多其他原因。
不幸的是,当我们开始使用C和C ++时,它们都是非常糟糕的语言。这就是近年来人们试图在脚本中执行许多代码的原因之一。
如果您正在寻找使用C语言工作的人的例子,您可以忽略id,因为我记得他们早就放弃了C语言。不过,Cryptic Studios(《星际迷航》在线)使用C语言进行所有引擎开发。据我所知,是的,这更多是因为哲学,而不是任何明显的优势。
可能的好答案是“同时使用”吗?
据我所知,可以优化panda3d项目,使用某些cython或重新编码这些部分来消除瓶颈。
在大多数情况下,需要优化的部分是具有大量迭代和嵌套或大量数值计算的部分,因此,我的(疯狂的)猜测是,一种公平的折衷办法是同时使用两种语言,并使用C语言。对于包含许多底层编程的部分,因此对于需要速度的部分,您不能滥用C ++语言,对于其余的游戏,则不能滥用C ++。
理想情况下,您要牢记高级知识,着眼于引擎的快速部分,然后使用脚本语言或C ++,它将使用更少的嵌套/循环。
当然,除非您将引擎专用于一种特殊的游戏,否则您永远无法制造出适合开发人员所需的所有游戏的引擎...
但是,请不要接受我的建议,因为我既不是经验丰富的游戏开发人员,也不是经验丰富的开发人员...我认为C会迫使您编写快速的代码,同时为像游戏一样大的项目编写良好而快速的C ++代码是另一回事...
C为John Carmack工作,使用C可能会带来很多好处,但是直到您从中受益时,可能要花一些时间。
C代码通常是有效的C ++代码。
C ++的主要问题是错误地使用了它(Linus Torvalds讨厌它,因此,他在库的可移植性方面也遇到了其他问题,例如,他正在操作系统级别上工作,必须能够在每个随机变量上运行它芯片在那里)。
例如,与c ++ std :: vector <>(或类似容器)相比,使用cstyle array []几乎没有优势。
向量是类型安全的,并且可以进行边界检查(您可以使用get()或[]访问元素,即使您不使用数组检查的方法,您仍然可以查询大小,而不用指针四处移动)。
但是,载体可以慢一些,如果,例如,你不声明构造函数中的默认大小。另外,如果向向量中添加内容,则可能需要减慢其大小。C ++ 11还增加了许多优点,例如统一初始化(您现在可以使用相同的语法声明和初始化向量),并且有move构造函数可以使您避免复制。您甚至可以创建自己的自定义初始化程序(如果您出于某种原因想要使用malloc以外的其他方式)。
或者当然,如果您确实需要调整大小,那么向量仍然更易于使用,您不必弄乱malloc,手动复制内容等等。
C ++为您提供了面向对象的代码。编译时,它将同样高效,因为它实际上只是使用代码的人员的抽象。尽管诸如构造函数之类的东西可能会减慢对象的创建速度。但是您将需要构造函数设置默认值,否则您可以不使用构造函数来初始化对象(通过省略())。
但是面向对象使编程游戏变得更加容易。游戏经常处理对象。