为什么游戏引擎大多选择使用 c++ 而不是 c 开发?

为什么那些引擎选择 C++ 而不是 C,或者说在游戏引擎的开发中有哪些功能、特性是可以通过 C++ 开发而不可以通过 C 的?

我也曾经试着用C写,可结果发现开发效率、代码可读性,都不是一个档次的。最后才明白,发明C++的人确实是为了解决一些问题,而不是闲的蛋疼。

如何成为一个优秀的高级C++程序员

当初我是非常讨厌C++语言的,我认为C++能做的C都能做,它只是个语法糖而已,简单才是最美的,为什么我要去浪费时间研究那些诡异的特性。

后来慢慢的我对C++的态度变了,现在我觉得C++虽然不完美,但是够用。它比C可读性好,做到了开发效率和运行效率的折中,是我写代码的首选语言。

其 实并不是全部C++,最主要的架构核心部分C++而已,一个游戏引擎涉及到的内容超级庞大,又要搞效率高性能,又要好效果和易于扩展。高性能的关键核心代 码会使用汇编实现,比如SIMD指令进行各种浮点数学运算,高开发效率比如工具层,会使用脚本等来实现。而只有C++这样的全能语言才能做到在汇编和脚本 语言中间进行承上启下。

也就是说C++在游戏引擎中负责最主要的架构部分。

这部分包含了最重要的工程组织,从底层的基础库: 扩展std/boost数据结构,封装时间、IO/文件系统、多线程、反射、内存管理、数学库。。。。到中间层:窗口、游戏循环、输入设备/消息、图形渲 染接口层抽象、实时图形渲染管线设计、物理/碰撞检测、寻路、骨骼、动作、模型。。。。再到通用最上层的世界空间层次组织、天空盒、植被、水、粒子特效、 相机、。。。。

C++的开发效率肯定是高于C的,高一倍没压力,所以可以用省下来的开发时间去做性能优化。

一般来说,没有优化过的C++代码用 Profiling工具压榨出2~4倍的性能是很可能的。

而用C就算性能好,也没好到C++的3~4倍,好10~30%就不错了。

极端优化后的代码,C要好于C++,但是相同时间内开发出来的代码 C++性能会好于C,而且C++可读性可维护性要远远好于C。

的确没有什么不能通过C来做的。但C++更好。

因为游戏项目是个工程问题,关注开发效率。

而游戏引擎又是极端性能敏感的,关注执行效率。

这要求引擎程序有足够的弹性。可宏观分析,也可微观干预。

C++具有C简洁、直接和可移植的特性。

增加了语言层面的OO和一些良性范式。

在可控的资源损失前提下提高了生产力。

所以适合引擎开发。

C 语言可以说是一门设计的非常成功的语言。但是C语言没有OOP的特性,在做一些大型项目的时候力不从心。一些大型的C项目,随着项目的臃肿,人类基本没办 法维护这个项目了。要维护这么庞大的项目而又不出错,只能加入一些OOP特性重构,有经验的C程序员写着写着,很多概念就类似C++了。干脆直接转C++ 算了。

但是C++却是一门设计的非常不成功的语言。它为了实现大而全的功能,加入了非常多的特性,而这些特性交叉组合在一起就非常的复杂,人类非常难以驾奴它而且又容易出错。这也是很多程序员很恨C++的原因。

要解决C++的这个问题,就是给C++订一套规范。避免使用某些复杂特性,让它变得足够简单和具有高可读性。在C++11的标准下,配合自己公司定一个科学的内部规范,让所有员工通过一个C++可读性培训。那么C++用起来就非常爽手了。

c++ 和c相比,生产效率要高一点。虽然在一些商业游戏引擎中不使用stl自带的模版,但都实现了自己的一套模版库,甚至实现了自己的string库。如今的一 些商业3d引擎基本具备了跨平台的能力,但是由于不同平台的底层api(SIMD运算,文件读写,图形渲染)不一致,因此要对各平台/API的共有特性进 行抽象,这里c++比c更能胜任这样的任务。(利益相关:目前在学习swift+Metal)

目前,流行的unrealengine4是完全c++写的,unity3d 5虽然有用c#但在将来会通过il2cpp转换成c++,实现运行效率的提升。

你也许感兴趣的:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注