C++和游戏开发那些事,告诉你怎么用C++纵横游戏编程

c语言和c++
c 语言可以说是一门设计的非常成功的语言。但是c语言没有oop的特性,在做一些大型项目的时候力不从心。一些大型的c项目,随着项目的臃肿,人类基本没办 法维护这个项目了。要维护这么庞大的项目而又不出错,只能加入一些oop特性重构,有经验的c程序员写着写着,很多概念就类似c++了。干脆直接转c++ 算了。
c++ 和c相比,生产效率要高一点。虽然在一些商业游戏引擎中不使用stl自带的模板,但都实现了自己的一套模版库,甚至实现了自己的string库。如今的一 些商业3d引擎基本具备了跨平台的能力,但是由于不同平台的底层api(simd运算,文件读写,图形渲染)不一致,因此要对各平台/api的共有特性进 行抽象,这里c++比c更能胜任这样的任务。(利益相关:目前在学习swift+metal)
目前,流行的unrealengine4是完全c++写的,unity3d 5虽然有用c#但在将来会通过il2cpp转换成c++,实现运行效率的提升。
编程最重要的是实践,就是写代码、看别人写的代码、再写代码,你看再多的书,不写代码,你还是不会编程。但是写代码也要讲究方法循序渐进,不能刚学了几天语法,就想写个操作系统什么的,树立这种不切实际的目标只会让你的自信受到严重打击迷失自我。同时小编推荐一个学c/c++的学习群627819188无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!群内有很多干货和技术分享!
c++与游戏开发
c++是否游戏开发者所必须的技术。个人认为,这并不是完全必须的,但许多游戏开发项目需要到c++。以下列举一些过往曾流行的游戏平台/类型:
pc单机游戏(windows)pc网络游戏(windows、linux)移动平台游戏(j2me、symbian、palm……)家用游戏机游戏(ps1/2/3/4、xbox、wii……)掌上游戏机游戏(gb、gba、nds、psp……)网页游戏(html、flash)智能移动设备游戏(ios、android)
我们会发现,除了j2me和网页游戏外,大多数的平台都支持(或只支持)原生编程。而原生编程最常用的就是c/c++和汇编。
是否使用c++
c++并非万能丹,我按经验举出一些c++的适用时机。c++适合构造程序中需求较稳定的部分,需求变化较大的部分可使用脚本语言;程序须尽量发挥硬件的最高性能,且性能瓶颈在于cpu和内存;程序须频繁地与操作系统或硬件沟通;程序必须使用c++框架/库,如大部分游戏引擎(如unreal/source)及中间件(如havok/fmod),虽然有些c++库提供其他语言的绑定,但通常原生的api性能最好、最新;项目中某个目标平台只提供c++编译器的支持。
按应用领域来说,c++适用于开发服务器软件、桌面应用、游戏、实时系统、高性能计算、嵌入式系统等。
很大程度上,游戏──或说游戏引擎,都是c++非常适合的应用时机。
一些人认为,游戏开发者使用现成的引擎,就不需要使用c++了。过往,业界有一个普遍常识,就是用c++开发游戏
引擎,而游戏引擎提供脚本引擎供编写游戏逻辑代码。但这个观点被unreal engine4的决策改变,ue4放弃了维护多年且被大量使用的unrealscript脚本语言,而改用原生c++作为游戏逻辑编程的语言。此决策背后有多个原因,
但这里只想举出这例子展示c++在游戏开发中的用途及潮流,具体原因分析就不详细展开了。
除了自行研发游戏引擎需要使用c++,我们可以看到,大部分游戏引擎都提供了其c++原代码(unity算是例外),这让我们可以
方便调试游戏
深度剖析、优化游戏的性能
为引擎扩展新功能
修改现有引擎以适应项目所需
在专业的游戏开发中,这些都是很常见的工作任务。所以,即使并非自研引擎,并使用脚本语言开发游戏逻辑,也有很多机会需要使用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++缺点之一,是相对许多语言复杂,而且难学难精。许多人说学习c语言只需一本k&r《c程序设计语言》即可,但c++书籍却是多不胜数。学习c++大概可分为4个层次:
第一层次,c++基础:挑选一本入门书籍,如《c++ primer》、《c++大学教程》、或stroustrup撰写的经典《c++程序设计语言》或他一年半前的新作《c++程序设计原理与实践》,而一般c++课程也止于此,另外《c++ 标准程序库》及《the c++ standard library extensions》可供参考;
第二层次,正确高效地使用c++:此层次开始必须自修,阅读过《(more)effective c++》、《(more)exceptional c++》、《effective stl》及《c++编程规范》等,才适宜踏入专业c++开发之路;
第三层次,深入了解c++:关于全局问题可读《深入探索c++对象模型》、《imperfect c++》、《c++沉思录》、《stl源码剖析》,要挑战智商,可看关于模版及模版元编程的书籍如《c++ templates》、《c++设计新思维》、《c++模版元编程》;
第四层次,研究c++:阅读《c++语言的设计和演化》、《编程的本质》(含stl设计背后的数学根基)、c++标准文件《iso/iec 14882:2003》、c++标准委员会的提案书和报告书、关于c++的学术文献。
由于我主要是应用c++,大约只停留于第二、三个层次。然而,c++只是软件开发的一环而已,单凭语言并不能应付业务和工程上的问题。建议各位不要强求几年内“彻底学会c++的知识”,到达第二层左右便从工作实战中汲取经验,有兴趣才慢慢继续学习更高层次的知识。虽然学习c++有难度,但也是相当有趣且有满足感的。