为什么游戏引擎大多选择使用 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++,实现运行效率的提升。
你也许感兴趣的:
- Google 也要放弃 C/C++?Chrome 代码库中 70% 的安全漏洞是内存问题
- 总说 c++ 写底层,但是底层是什么,c++ 怎么写?
- C++ 为什么不加入垃圾回收机制
- 【外评】电脑从哪里获取时间?
- 【外评】为什么 Stack Overflow 正在消失?
- Android 全力押注 Rust,Linux 却在原地踏步?谷歌:用 Rust 重写固件太简单了!
- 【外评】哪些开源项目被广泛使用,但仅由少数人维护?
- 【外评】好的重构与不好的重构
- C 语言老将从中作梗,Rust for Linux 项目内讧升级!核心维护者愤然离职:不受尊重、热情被消耗光
- 【外评】代码审查反模式
你对本文的反应是: