找回密码
 立即注册
查看: 1070|回复: 20

用一年时间如何能掌握 C++ ?

[复制链接]
发表于 2020-12-31 18:09 | 显示全部楼层 |阅读模式
有一定 C 语言基础,日后想从事游戏开发等工作,给自己一年时间,能在此期间精通 C++ 吗?
发表于 2020-12-31 18:16 | 显示全部楼层
本人大约从20多年前开始学习及使用C++,但仍未达到我认为「精通」的阶段,甚至对于C++11的各种新特性也未掌握。然而因为我是在读书时自学C++的,也是游戏程序员(原问题中提到题主想从事游戏开发),觉得也许能提供一点意见供网友参考。

首先引一下2010年8月号《程序员》刊登的拙文《C++强大背后》最后一段:
C++学习建议C++缺点之一,是相对许多语言复杂,而且难学难精。许多人说学习C语言只需一本K&R《C程序设计语言》即可,但C++书籍却是多不胜数。我是从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++有难度,但也是相当有趣且有满足感的。

如果题主认为的「精通」是指上述所指的第二层次,那么我估计一年全职时间也未足够「精通」。首先,阅读这些书籍本身也需要不少时间,而且对于一般人来说(指除了一些学习记忆能力超强的人),很可能需要阅读几遍才能记住一些细节。另外,阅读后必须要练习。除了入门的习题外,还需要做一些工程向的项目,才能了解各种语法、编程范式的使用方法及时机,理想地建议参与一些开源项目。然而,学习是需要不断思考并把结果沉淀,方法包括与朋友讨论、写博客、写知乎答案等,这些都需要时间。

如引文末段所指出,我建议不要把「精通C++」作为一个一年目标,应该要把学习语言作为一个持续的过程,同时要把语言运用在具体的应用场合中。

---------------------------------------------------
再讨论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++的适用时机。
    C++适合构造程序中需求较稳定的部分,需求变化较大的部分可使用脚本语言;程序须尽量发挥硬件的最高性能,且性能瓶颈在于CPU和内存;程序须频繁地与操作系统或硬件沟通;程序必须使用C++框架/库,如大部分游戏引擎(如Unreal/Source)及中间件(如Havok/FMOD),虽然有些C++库提供其他语言的绑定,但通常原生的API性能最好、最新;项目中某个目标平台只提供C++编译器的支持。
按应用领域来说,C++适用于开发服务器软件、桌面应用、游戏、实时系统、高性能计算、嵌入式系统等。

很大程度上,游戏──或说游戏引擎,都是C++非常适合的应用时机。

一些人认为,游戏开发者使用现成的引擎,就不需要使用C++了。过往,业界有一个普遍常识,就是用C++开发游戏引擎,而游戏引擎提供脚本引擎供编写游戏逻辑代码。但这个观点被Unreal Engine 4的决策改变,UE4放弃了维护多年且被大量使用的UnrealScript脚本语言,而改用原生C++作为游戏逻辑编程的语言。此决策背后有多个原因,但这里只想举出这例子展示C++在游戏开发中的用途及潮流,具体原因分析就不详细展开了。

除了自行研发游戏引擎需要使用C++,我们可以看到,大部分游戏引擎都提供了其C++原代码(Unity算是例外),这让我们可以
    方便调试游戏深度剖析、优化游戏的性能为引擎扩展新功能修改现有引擎以适应项目所需
在专业的游戏开发中,这些都是很常见的工作任务。所以,即使并非自研引擎,并使用脚本语言开发游戏逻辑,也有很多机会需要使用C++。

最后,「还需学习什么」是一个很难简单回答的问题,因为游戏开发涉及的知识面很广。建议可参考本人译作。
发表于 2020-12-31 18:19 | 显示全部楼层
  我觉得可以过来再更新一次了。
/*****************************************以下内容可以跳过*****************************************/
  我说一下我做游戏的历程吧,二年级的时候(我出生于1991.11)我开始接触电脑,当时对电脑的画图工具很痴迷,为什么画图工具能够做出这么好看的东西。所以我对这些所见即所得的东西非常着迷,因为我觉得很容易就开发出来一个东西炫耀。
  后来四年级时候,我的父母有接触一个游戏叫《传奇》,我在他们没在家的时候偷偷创建了一个帐号,体验了十五分钟(没错小学生就是我),觉得游戏真的很吸引人,我是父母在我从小禁止玩游戏的,所以我没有接触过任何游戏,包括红白机,这应该也是很多人的童年。在那时候,我的梦想就是未来能够做游戏设计师,做一个全世界的人都喜欢的游戏。
  慢慢CCTV某一个频道有一个栏目是一个教授开始了解有一样东西叫做powerpoint 2000.我开始拉一些图片进来,做了一个小游戏,你没看错,是ppt做了一个小游戏,是类似大逃杀的游戏。点一下进一个地点,有了最原始的交互。
  从初一的时候,我知道了有一个东西叫做VB,我也尝试用VB写程序。同时开始学习一个编程语言叫C,那时候我果断抛弃了C,因为VB真的很容易做出一个窗口,然后写一个helloworld拿出去炫耀。
  兴趣是最好的老师,我爸妈说学好这些东西就可以做游戏了。我就开始认认真真学C语言,当时效率也很高,我现在一直觉得我在吃老本。。学C的基本概念,用控制台做一个打飞机游戏,做一个RPG游戏,类似于colossal_cave_adventure。
  再到了高中,开始用VC++6来开发一些win32小游戏,我觉得把游戏做好是一种使命,那时候也知道了国内著名的工作室:西山居1995 完美时空 2004 琳琅天上2004.
  我的心愿就是加入他们,成为真正的游戏开发者。
  后来到大学,我学计算机图形学,数据结构,自学编译原理,汇编语言。才发现原本单纯的梦想发现是不可实现的,我不可能做出每个人都喜欢的游戏,就开始学习游戏引擎制作。如果你希望能够从事引擎开发,我推荐叶劲峰 @Milo Yip 大神翻译的《游戏引擎架构》一书。
  直到现在,我如愿以偿,成为了居士,开发游戏引擎。这不是一年两年能决定的,如果你要做程序,真的要多积累了。
/*****************************************跳到这里就好*****************************************/
  从始至终,我是抱着一种使命来学习,来努力,来做游戏的。当时面试的时候,面试官问我,你为什么要做游戏,我说:“我一生就为了做游戏,生活能够过得去就行。”我现在也觉得,我如果不做游戏,我还能做什么(我现在很局限了,眼界很窄)。

我最近学校的课程是要用Objective-C开发游戏,我从来没有学过oc语言,但是我并不觉得他特别的难,相反,我觉得他很容易上手开发iOS应用,因为有C++的积累,我可能不知道具体的语法或者用法还有API,但是我可以通过C++来融会贯通。

  C++是一种潜移默化的东西,当你了解他之后,你学什么都会容易,觉得简单。

所以,C++是重中之重!!!

  吐槽完毕。。只有20个赞,第一次这么认真回答的说。 T_T

/*****************************************这是之前的回答*****************************************/

我不请自来了,因为我发现在这里面回答的人都在回答:“我想做游戏开发,难吗?”,而不是回答“我想从事游戏开发,一年内能精通C++吗?”。无视题主的提问,实在忍不住。
对于题主的提问,我比较赞同 @王选易  的答案 ,也许大家都是技术人员并且也在大学中学习游戏开发。

首先我回答题主的问题,作为大二即将升大三的学生,由于你大一大二忙于社团活动。以致于你可能错过了大学中打基础的黄金时期,大三的一个学年里面,除去你的课程时间,能够继续深入学习C++的时间也许并不多。所以,一年内你说可以精通C++,我觉得不可能。



我现在大三,从初一开始学习C++,对这些有一定的了解,也有一定的发言权。但是我从来不敢说我精通了C++。因为我的朋友,他是15岁开始学习C语言,现在学习C++已经超过20年。但是他对于技术非常的谦逊,抱着学习的心态去学习技术,也没在我们面前提过他精通C++。即使他已经是国内行业的领军人物。

说一下精通C++这个吧,其实精通这个词真的很大争议,至少在许多的社区都有人对这两个字吵的不亦乐乎,那么我来和你说一下熟悉的概念吧:

我觉得熟悉C++,至少要能够做到这些:
1、你完整阅读过C++ Primer 第五版之后的书,这本书可谓是C++程序员入门必读的书。(为什么我推荐第五版之后,因为第五版之后包涵的内容是C++11标准的内容,你现在重拾编程语言,那么推荐你看新的书)
2、你能够对面向对象编程有明确的概念。因为现在许多程序员用着面向对象语言,却做着面向过程的事情。
3、能够利用C++配合DirectX或者OpenGL来制作Windows小游戏。
4、对数据结构有一定的认识,能够准确针对问题选择你的数据结构。
5、其他内容一下子没想到这么多,等以后更新。

至于精通,精通C++不仅仅是C++的语法,还有编译的原理,那么又涉及到编译原理,还有计算机的组成原理。调试的时候,当你用release的调试,你又需要汇编语言的知识,又涉及到汇编语言。再后来你需要设计比较大型的程序,你要对数据结构,和设计模式有一定的认识。

再回答下一个问题:你希望从事游戏开发工作,做游戏其实不仅仅是看着最近火热,而是你要从一开始就对有游戏有接近疯狂的热爱,把做好一款游戏当做你的使命,你才有动力继续学习。因为程序学习起来非常枯燥。

至于你最后的问题:
你需要学习其他什么,我觉得其实你需要做游戏,不一定是C++,你可以选择另一个语言比如Objective-C开发iOS的游戏,或者学习C#,可以开发wp8或者xBox的游戏。
如果你单纯是做游戏,语言并不是问题,问题是你对其他知识的了解程度和对游戏行业的热爱,为了工作而工作可能并不会让你充满满足感与激情。

其他的知识:
计算机图形学
数据结构
编译原理
汇编语言
英语
数学

至于苦逼软件的作者的回答,我反对,并且我认为这不是合适的答案。

不是所有的人会为你“工作十几年游戏项目超过十年而买单。”

---------------------以下逐个写下来得罪人---------------------
“想做游戏开发根本不需要精通C++,根本就是南辕北辙。”
》游戏开发不需要精通C++,甚至说不需要会C++,但是你至少要熟悉任何一门开发语言,并且充分了解数据结构。这根本不是南辕北辙,而是取向问题。

“挑一个引擎熟悉起来”
》这是我看到最不负责任的回答,这位同学问的是未来的路,现在让一个学生直接选一个引擎,没有错,这样可以让他更容易找到小公司,但是会使用,不懂一个引擎的原理,在日新月异的今天,公司换了一个引擎,要重新去学习,如果掌握最基础的东西,那么无论任何引擎,都可以迅速上手。

“游戏开发就是耍剑,耍得好看才有饭吃”
》游戏开发实质就是程序员不仅要练剑,也要练气。

ps:以上纯属个人观点。
发表于 2020-12-31 18:19 | 显示全部楼层
建议不要把掌握c++作为一个一年的目标。
C++的外延太广,就是应用领域、面向对象、设计模式等等。C++语法和标准库本身是有限的。
好比说常用汉字是有限的,但是国学是无限的。
应该把学习语言作为一个持续的过程,并且要把语言学习用在实际的开发场景中。
我见过很多大佬在C++这门绝学上已经潜心研究了整整十年,最终悟道这是一门终其一生都不敢说精通的绝学。
如果你能在C++上潜心投入,比普通人稍高一个层次,在市场上便非常有竞争力。
因为C/C++技术在很多行业应用广泛:网络、通讯、图像、游戏、桌面等,它也是目前唯一适应多方面需求的编程语言。C/C++适用于Windows程序设计,PC游戏、嵌入式等软件开发,在软件编程领域,几乎没有C++软件工程师不能解决的问题。主流的3种操作系统Windows、linu、Unix内核部分都是用C++语言和汇编写的,上层高级特性也是用C++写的。它的实时性,灵活性、是其他的编程语言无可比拟。
正是这些原因各类企业对C++软件工程师的需求持续升温。国际上许多著名的企业像IBM、HP等都将C++作为优秀程序员的必备软件语言要求,是招聘员工的基本参考。所以,业界流传着:掌握C++技术是通往一流企业的敲门砖。
另外分享一篇C语言/C++直通企业级开发的详细学习路线。B站上最为优质和全面的C++学习攻略分享。(作者codesheep,B站近40万粉丝大V。)
https://www.bilibili.com/video/BV1G7411K7j2?p=1&share_medium=android&share_plat=android&share_source=COPY&share_tag=s_i&timestamp=1596435670&unique_k=zXBcxNhttps://www.bilibili.com/video/BV1v441187mZ同时分享一篇他的 C 语言、C++ 学习路线的文章给大家,要知道语言本身只是工具,C++开发是个系统工程,更需要有深厚的内功训练。
先聊几个有趣的问题

这几个问题都是私信里常被问到的,也是我当时学习过程中的一些疑惑。
问: 为啥我学完了C语言或者C++,却还是啥东西也做不出来?
答: 编程语言学完了就能做出东西那也真是天才哇!应该说语言学得就算再精通,它其实也只代表完成了“最小的”那一部分,和实际上手干活之间还是有一个非常大的鸿沟,这个鸿沟就表现为下文即将详述的 编程基础四大件 + 应用实践编程
推荐:
<a data-draft-node="block" data-draft-type="ad-link-card" data-ad-id="ZhiTask_534588884688998400">问: 为什么C/C++写出来的东西都是运行于黑乎乎的命令行?这玩意真有用吗?
答: 嘿嘿,谁说黑乎乎的命令行里运行的程序就没有用!咱大名鼎鼎的Linux系统都以命令行跟用户交互呢,而且Linux里面很多强大的工具都是运行于黑乎乎的命令行!
问: 从技术学习和实际运用的角度来看,C/C++和Java到底区别在哪?
答: C/C++,它和Java确实不太一样。C语言和C++,尤其C++,语言粒度细、机制多,性能虽然高,但语言本身的包袱也确实重,我们更愿意称它“造轮子”的语言!也正是因为C语言和C++性能好、粒度细,所以什么都能做。而Java本身就是一种服务于互联网软件开发(后端开发+客户端开发)的语言,它有一个明显的“生态圈”的概念,所以应用领域非常清晰。我个人觉得C语言和C++编程比Java还是要难一些,Java毕竟是纯应用层的,C语言和C++则对程序员能力的要求要更高一些。
岗位分析

了解一下岗位,知道以后能做什么,这个也有利于自己树立学习目标。
C语言和C++属于“造轮子”语言,几乎什么都能做。不过一般来说,C语言和C++主要还是做后台(服务端)开发比较多,包括:
    通信公司后台开发互联网公司后台开发游戏公司后台开发……
当然这个后台开发具体职责又有很多细分,比如:
    有做数据处理和分析的有做基础协议和通信的有做服务端底层应用优化的甚至还有做后台系统驱动和内核的……
不管怎样,下面即将要介绍的这些学习路线和内容适用于以上所有情况。
语言本身的学习

C语言:
    除了最最基础的语法:变量、条件、循环、字符串、数组、函数、结构体等之外C语言最最最最最重要的那就是:指针、内存管理,以后企业里开发就靠它俩吃饭,这也是检验C语言掌握情况的两大标准
推荐书籍:《C Primer Plus》、《C和指针》、《C专家编程》
C++:
    C++和C语言确实是不同的语言,但是C++确实是对C语言的延伸,可以理解为在C语言里加入了面向对象的特性。因为只有面向对象特性的加持,代码才能更好的复用扩展工程化,这是大型项目的必备要素除了C语言所有的底子之外,还需要学习C++的面向对象(封装、继承与多态)特性、泛型、模板、STL等等
推荐书籍(有先后顺序):《C++ Primer》、《Effective C++》、《C++ 标准程序库》、《STL源码剖析》《深度探索C++对象模型》
最后一个小建议是:语言部分的学习建议不要拖太久,一定要规划好时间,一鼓作气,高强度给它压下来,否则容易把自己拖泄气。
编程基础“四大件”

基础四大件包括:数据结构和算法计算机网络操作系统设计模式
这跟学什么编程语言、后续从事什么编程方向均无关,只要做编程开发,这四个计算机基础就无法避开。可以这么说,这基础四大件真的比编程语言重要!!!
1、数据结构和算法
可以说这个直接决定了面试的成败!几种基础数据结构类型得烂熟于心,比如:字符串、链表、二叉树、堆、栈、队列、哈希等;基本的几大算法也要了如指掌,比如查找、排序、动态规划、分治等等。
建议LeetCode多刷题啊啊啊啊啊!
参考资料: 《大话数据结构》、《算法》、《剑指offer》《LeetCode刷题》
2、计算机网络
此处的计算机网络指的就是TCP/IP协议栈,可以说它是当下互联网通信的基石,无论如何一定要对TCP/IP的协议栈了如指掌,主要就是学习和掌握原理,包括:ARP协议、IP协议、ICMP协议、TCP和UDP协议、DNS协议、HTTP协议、HTTPS协议
推荐书籍: 《TCP/IP详解》
3、操作系统
该部分重点包括:进程和线程的相关原理(原子性、并发、锁)、内存相关原理(内存分布、内存调度)
推荐书籍:《深入理解计算机系统》
4、设计模式
倒不需要23种设计模式全部记住,常见的几个如:单例模式、工厂模式、代理模式、策略模式、模板方法模式建议熟练于心。
推荐书籍:《大话设计模式》、《设计模式之禅》
应用实践编程

这部分会涉及到一些工具、编程环境、和具体编程实践,应该说这一部分学完,自己应该能做点东西出来、或者说能看懂一些实际项目的代码。
实践这部分,我也是结合我之前在通信公司的实际工作经历和所听所见,来聊一聊。
1、Linux操作系统的使用
很多人初学C语言、C++(包括我)都是在Windows环境上进行的,而实际企业级开发几乎不可能,所以Linux系统必须要会,我们别无选择。先谈使用。
包括:常见的Linux操作命令基本的Shell编程
推荐书籍:《鸟哥的Linux私房菜》
2、编译/调试工具
首先是跟编译相关的:编译工具!
我们知道很多人学C语言、C++都在类似Visual Studio这种集成IDE里进行代码编译,这个其实也用了编译器,只不过是微软自家的MS编译器,而且所有操作均可视化。而企业里开发很少会基于Windows系统,所以Linux平台上的编译器更为重要,最典型的当属 GCC,甚至有些公司有自己定制过的交叉编译工具,但没关系,只要 GCC熟悉,其他问题都不大。
其次,大家自学C语言、C++,都借助类似VS这种IDE,点按钮即可对源文件编译。而企业里实际项目的编译动作叫 make,编译的实际动作和过程都是写在 makefile文件里,所以makefile的书写规则建议学习!
最后说到调试工具,Linux平台上的 GDB调试工具要熟练使用,会借助于它进行调试。
推荐资料: 这部分没有书可推荐,英文好的同学可以直接看 GNU官网关于 GCC和 GDB的文档,中文材料可以看:《debuging with gdb》(中文版)和陈皓先生的《跟我一起写makefile》
3、Linux环境编程
还是那句话,企业里C语言和C++几乎都是基于Linux平台的,这一部分我们没办法避开
(1)Linux系统编程
众所周知,Windows系统编程里有各种各样的Windows API,同理Linux系统API的使用就更加重要。
(2)多线程编程
此处指的是多线程编程实践相关的东西,一般包括:线程、资源、信号、同步、互斥、锁等等一些具体的编程方法。
(3)网络编程
此处的网络编程主要指的是具体Linux系统上的网络编程 API和 IO函数的编程实践。
推荐书籍:这三部分综合在一起,推荐必看书籍包括《Unix环境高级编程》、《Linux高性能服务器编程》、《POSIX多线程程序设计》
文章来源:codesheep
整理不易,据说双击屏幕有惊喜
发表于 2020-12-31 18:27 | 显示全部楼层
强烈反对 @kubisoft 功利性太强的高票答案!
这是在把一个能成为业界top 1%的顶级游戏开发技术大师的黑马,往能傻乎乎地受你们压榨的IT民工的火坑里推,你造吗?
这让我想起了乔帮主关于“卖糖水”的那句经典话语,而我们的版本是:

你是愿意就这样学点皮毛混口饭吃随波逐流,还是成为真正的游戏开发业界顶尖技术大牛,推动业界的发展,去改变世界?

关于上面这句话的两个抉择,我们来做个选择题。

A.     如果你是想从事游戏行业当个二流的民工打打杂一辈子就这样过去,请去看@kubisoft兄有些对现实妥协之前排名第一的答案。(不带人身攻击的,只是对事不对人而已呢)  这种太依赖IDE和游戏引擎所谓速成方式,到最后只能是二流的民工,打杂的,混饭吃的。知道其然,不知道其所以然。遇到真正的专业性问题就卡壳了,比如如何优化渲染质量之类的问题。或者开发的项目就是那种2D的小儿科,或者山寨跟风赶进度赶上市的快餐游戏,而不是画质精美,设计精良,堪称经典,为国产游戏长脸,推动全球游戏业界发展的革命性大作。

B.     如果你是志向高远,想制作出改变世界的革命性游戏,或者推动游戏产业的发展,成为游戏开发业界top 1%的技术领军人物。请熟练C++,请修炼好内功。@王选易 兄 @徐奕成  兄的答案是极好的。且正如萌萌的V大 @vczh 所言,就算你的志向是开发crysis这样的游戏,其实也只需要用到C++的一小部分就够了。C++各种范式是发明来解决所有问题的,游戏只是其中的冰山一角,你没必要精通,没必要学会C++的所有部分。我们这里所说的,是了解原理,学C++只是其中的一小部分,与其说去不断的学C++的更多高级特性,更好的学习方向是熟练利用C++配合DirectX或者OpenGL来制作Windows小游戏,对数据结构设计模式有一定的认识,且能够准确针对问题选择你的数据结构,研习计算机图形学blablabla的。
(PS:不要轻易用“精通C++“这个狂妄的词眼,后文有一些关于这个梗的解释)

正如我之前在自己博客里面所转载的文章《编程巨星的唯一秘诀》中说的:

“对所做的事情的理解越深,你就会做的越好。”

既然题主都提到要走熟练C++,以后开发游戏这最正统的技术道路了,他内心渴望的应该是志向高远,做个强者,而不是去当IT民工打杂做技术含量不高的事情。

即我是不能同意更多 @Aaron Luo 兄的观点。
”题主还是学生,别用压榨it民工的想法来教导!题主可以从cocos2dx和unity3d开始学游戏开发,但是,如果想一直做编程,请别忘了必须同时修炼c++, 因为它可以给你认识到真正的编程,让你懂得更多计算机编程思想,以后就算不写c++也可以迅速了解别的语言,别的工具的~而不会变成仅仅依靠IDE工具,随便抄抄别人代码,完成山寨程序的It民工。“

也不能同意更多 @徐奕成@Floristt兄的观点。
@Floristt 兄在评论区说:那些不懂原理只是挑一个工具熟练掌握使用或许在当前游戏市场火热的背景下也能混得不错,但是感觉很快会遇到职业瓶颈。这对自身而言就是一种风险。如果一项技能你学三个月就能耍通常意味着可以轻易找到一个人代替你。
@徐奕成 兄说: 你学会这些可以让你比较容易找到一个工作,但是几年之后会碰到你的职业瓶颈,要么继续学底层,要么转行。否则公司会毫不犹豫地找人来替代你。其实有一句话我很赞同:“程序员如果不学好底层,将毫无作为。C++让你走向程序员这条路,编译原理和汇编语言等让你走得更好,数学英语让你走得更远。”

大方向的话,就如@王选易 兄所言,如果你是图形程序员,那么最好的项目就是,自己做一个游戏引擎如果你是Gameplay Programmer,那么最好的项目就是,自己做一个游戏项目。

另外, @IMAGICE 兄在评论区说到,“还是那个问题,是选择偏向游戏(文艺方向,独立开发),还是想做好技术(引擎开发,技术研究,打工,这个可能是大部分人的归路)。”
是时候引出游戏开发领域的两大流派了,即 @伍一峰 兄在回答中提出的气宗与剑宗。
独立开发者和小团队因为时间和精力的限制,大多是以实现为目的,这也是情有可言,这就不难解释 @kubisoft 兄所推崇的以快速实现为目的,依赖工具、引擎和不求甚解的剑宗流派有不少人的追捧。(文艺方向另谈)
每个人切入这个行业的方法不尽相同,能选择最适合自己的入门方式就是最好。但是入门后如果想有更好和更长远的发展,必须开始崇尚气宗一派,了解内部技术细节,修炼好内功。不要流于形式,浮于表面,依赖工具,而是要深钻进去,了解得越深越透彻越好。最好是能自己了解游戏引擎的底层原理,甚至是写出自己的游戏引擎来,这样才是更高的境界(当然这只是极少部分的顶尖高手能达到的境界)。
总之,剑宗一派适合入门,这样有趣,有成就感,能快速得到成果,但容易遇到职业瓶颈,后劲不足。气宗一派注重内功,了解原理,作为稀缺的高水平人才资源,能有更多选择的权力,有更长远的发展。而且不难理解游戏开发领域是先有了气宗才有了剑宗,且了解原理,内功深厚的气宗境界更高一筹。
能找到自己的合适的方式就是最好。并不是否定从引擎出发入门这条便捷之路,其实我的建议,若决定走修炼技术为主的气宗一派,先学点C++,然后配合着C++学一些底层API(DirectX或OpenGL),能写一些比较炫酷的三维游戏场景,或者说自己实现一个小型的软引擎,再去真正地接触引擎,利用引擎做一点有趣的demo或者完整的游戏,阅读一些优秀开源引擎的源码(比如Ogre,irrilicht,Unreal Engine4 ,cryEngine),甚至自己实现引擎或者做游戏项目,这是重视技术的气宗流派比较科学的内功修习方式。

我们都知道,气宗和剑宗的争执永远不会停歇,就像这个回答下的评论区,永远不是一边倒,而是气宗剑宗的支持者平分秋色,各有千秋。
我很欣慰的是,这个答案写出来之后,一天之内就已经超过了当时排名第一的、已经在答案中被我@了无数次的kubisoft兄有些对现实妥协,倚老卖老(不带人身攻击呢,只是对事不对人)的答案。这证明大家的眼睛是雪亮的,内心还是不甘心的,还是希望做个明白人,做个强者,知其然并知其所以然,并且希望自己有能力站在更高的山峰,去完成更大的事业。
(PS:这段貌似才算是比较理性的分析,回答一开始写的有些小愤青了,但的确是肺腑之言。)

----------------------------------------------------------------------------------------------------------------------------------------
既然提到了小愤青,就另外附一点我在2013-03-25写的一篇年代久远带些小愤青的拙作中的一些观点:
“【
事实如此,现在市面上所有画质精美的单机游戏作品(鬼泣5,上古卷轴5,刺客信条3,仙剑奇侠传5前传,古剑奇谭等等……),所有的大型网络游戏(Dota2,英雄联盟,魔兽世界,龙之谷,剑灵等等等……),所有高性能的三维游戏引擎(虚幻3,Unity3D,Cry Engine3等等……),以及一些高性能的2D游戏引擎(Cocos2d-x等等),都是用C++来开发的。
其实游戏引擎并没有那么神秘,说白了也就是那么回事,用类封装好功能的C++代码而已。C++写出来的游戏引擎自然能跨平台。Unreal Engine3、Unity3D、Cocos2d-x等游戏引擎就是绝好的例子。

学好C++,你可以亲手写出Unity3D,亲手写出 Cocos2d-X,让大家都叫你大神,大家都用你写的游戏引擎做游戏,等着你什么时候心情好了更新一下给引擎加更多功能;而不是只会盲目跟风,今天大家说Unity3D火,就都去学Unity3D,明天大家说Cocos2d-x热门,就来学学Cocos2d-x。你学游戏引擎,学的只是人家某引擎作者某C++大神按心情来定的函数调用方式,学的只是如何调用一些别人写好的一些类,一些API函数。这样在别人规定给你的一些rule中固步自封,大家觉得有技术含量么?

我们是时候该该想一想了,为什么现在全球范围内优秀的三维引擎,就是没有我们国产引擎的影子。
所以,无论是哪个平台,Windows也好,iOS也好,Android也罢,如果你真正想在游戏开发领域有所作为,混出个名堂,请学C++,请学计算机图形学,请了解计算机图形API(OpenGL或者DirectX),而不是在跟风某种“热门”的游戏引擎的大潮中随波逐流,在某种移动平台的游戏开发中迷信某某引擎,乐不思蜀,固步自封。
咳,扯远了,而且有些小愤青了,我并没有歧视其他编程语言的意思。浅墨只是想表达,无论是哪个平台(Windows,Play Station,Xbox,Android,iOS, WindowsPhone, WUII),在三维或者高性能游戏开发领域,确实就是C++的天下。
】“原文在这里:【Visual C++】游戏开发四十九 浅墨DirectX教程十七 三维天空的实现


----------------------------------------------------------------------------------------------------------------------------------------
2014-6-2更新部分。
答评论区  @李柯  兄的一段话。关于站在巨人肩膀上的一些思考。
首先对于这部分, 在这篇回答的评论区,@invalid s兄的文字是相当的深刻与一针见血,推荐大家读一读。

1.我们并不是说支持完全去从头造轮子,而是你理解的越深,就可以收放自如,做个有选择权的强者。当没有合适你的轮子的时候,当遇到技术瓶颈的时候,你自己完全可以制造个更好的,前所未有的轮子,而不是懵在那边,等待你所谓的巨人们心情好后的施舍,造一个合适的轮子给你用,或者因为长久以来的太依赖工具而丧失了本来的能力。
我大家所希望的,是能做一个真正的明白人,心中有墨水,心中有底气,然后无所畏惧,遇到什么瓶颈都不虚。
我们站在巨人的肩膀上的同时,不仅仅是靠业界巨人们写出来的库去实现自己的东西,而是可以理解与吸收巨人们的思维、技术和实现方法。当达到一定境界后,我们可以当下一个巨人,推动业界革命。这大概就是大牛与民工,强者与弱鸡,最外在的区别与表现形式。
太依赖所谓的巨人们的肩膀,太依赖工具,如同井底之蛙,日复一日地调用让你崇拜的大神们写出来的类库,以为只要能做到这样就天下无敌了,以为就是软件行业的全部了——这大概就是目前,我们国内软件行业的误区所在吧——依赖工具,浮于表面。

2.能理解内部实现细节肯定是推崇的,这个看个人,或迟或早,但是越早越好。
我写这个答案只是希望题主以及看到这个回答的朋友们能有更长远的眼界,立意更高远,能有更宽的视野,能知道更大的世界,而不是一辈子就这样炒炒现饭调用调用别人写的函数窝囊地就过去了。
人的一生精力有限,作为一个聪明人,作为一个明白人,入门的时候什么方式越快越好,但是入门之后呢,如果希望自己有更好更大的发展,大方向千万不要错,不要过分依赖拘泥于工具,浮于表面,一定要跳出那个圈子,从井里爬出来。
即,如果希望自己变得更强,不人云亦云随波逐流,最好的方式或许就是自己去理解细节,也并不是咬文嚼字地要自己真正花大工夫花精力去做一款引擎,这个量力而行。

人的一生精力有限,没有哪条路哪种方法适用于所有人,但一个人只要能专注于自己认为值得事情,能自得其乐,那也是值得尊敬的。

回答 IMAGICE兄的评论:
3.直接用轮子,并真正做出非常赞的作品出来,那也是值得尊敬的。当今游戏引擎的发展,为我们提供了前所未有的便利,我们可以合理的利用他,但千万不能太迷信太依赖他。
但如果已经在某个领域花了10年甚至更长的时间,还没能有所突破,那就得反省自己,是不是方法问题了,是不是方向问题了,是不是之前研习的时候,或进度太慢,还是走了很多弯路。我们都清楚,并不是每个人都能有很好的技术天赋与底子,当然也不是每个做游戏的人都要去理解和实现底层,要量力而行,要有所侧重,要找到自己最合适的角度。我们只是从长远来看提倡将知识挖深,让自己打开眼界,不做井底之蛙,不随波逐流,让自己因为站得高看得远,而有更多更广选择的权利。
技术与创意,并不矛盾。人生在世,有所为,有所不为,游戏开发亦如此。

----------------------------------------------------------------------------------------------------------------------------------------

以下算是一些关于C++的附加思考。
【关于“精通C++”这个字眼,请不要滥用】
引用@徐奕成 兄的一段话。
徐兄现在大三,从初一开始学习C++,对这些有一定的了解,也有一定的发言权。但是他从来不敢说他精通了C++。因为徐兄的主管, 15岁开始学习C语言,现在学习C++已经超过20年。但是他对于技术非常的谦逊,抱着学习的心态去学习技术,也没在我们面前提过他精通C++。即使他已经是国内行业的领军人物。

引用 @渐修竹  兄的一段话。
“我也做了两年c++了,也不敢说精通,我们老大做了至少8年,也没敢说精通,我认识的很多大神,也都没敢说精通。事实上我认识的很多大神都很谦虚,我跟他们学到了很多,大家的简历上也都写着熟悉c++之类的字眼。”

即对于博大精深的C++,业界的大牛们穷其一生去研习都不敢言能精通它。就算是天天去钻研C++,一年也只能学个皮毛而已。
C++的精通细节与思考,可参看萌萌的V大 @vczh 的这篇回答:怎么样才算是精通 C++?
至于快速入门,强烈推荐 Essential C++,其为C++业界入门必读《C++ Primer》的作者剥去繁杂,只讲C++核心的一本书。
而后续的一些,可以参考这个豆列中的书单:学习C++语言
----------------------------------------------------------------------------------------------------------------------------------------

在结束回答之前,感谢 @洪逸群兄在回答中的at,间接地邀请,让我知道有这个讨论存在:)

总之,最后的最后,还是那个抉择:

你是愿意就这样学点皮毛混口饭吃随波逐流,还是成为真正的游戏开发业界顶尖技术大牛,推动业界的发展,去改变世界?

在二十几岁这段人生可塑性最强的时光里,我们应该是满怀信心,志向高远,想让自己与这个急功近利、日渐扭曲世界有所不同的吧。

(呃,这个问题已经被改得面目全非,为了注重真实性,此回答就这样保持原貌吧。2014.6.8日更新)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2020-12-31 18:34 | 显示全部楼层
写了多年C++,说一点自己的感悟。虽然自己近期没有接触C++了,但是毕竟学习的第一门语言就是C++,使用时间最长的也是它。回顾起来,它就像老朋友一样,始终带给我一份亲切感。尽管自己距离精通C++还有太漫长的距离,但也从使用C++的过程中有了不少的收获和感悟,在这里分享一下。手机打字,想到哪里就写到哪里,如有谬误之处,还望不吝赐教。
C++的入门学习曲线相对高一点,但是如果循序渐进,不刻意追求那些奇技淫巧的话,其实还好的。就我自己而言,我把C++看作是帮我组织和简化代码的好助手,而不是一个有着复杂语法和号称“最难掌握语言”的工具。
其实仔细想想,C++的语法并不是随意制定的,而是有着严谨的体系,所以不能生硬地记忆。如果能够很好地理解和遵循这套编程思想体系(哪怕最开始的时候只是尝试去依葫芦画瓢),就可以比较容易地写出有着良好组织的代码。所以,语法不是给你带去痛苦的,而是用来帮助你写出更优秀代码的。
说到简化代码,可以利用C++编译器和标准库来帮自己做很多事情,而不要什么都自己去实现和解决。比如说,C++编译器可以提供RAII、模板等强大功能,既能省下代码工作量,还能减少出错的可能性,标准库则更无需多言了。所谓减少bug的最佳方式就是不写代码,我的理解大抵如此。
C++相对比较麻烦而容易出错的地方,一个是复杂继承层次和关系,一个是内存管理,一个是多线程编程,以下简单阐述一下自己的愚见。
对于复杂继承关系应该尽量避免(其实良好的设计基本可以避免这种情况出现),可以考虑用组合关系来替代。当然,还是要顺应领域模型,最好是有着清晰的映射关系,而不要为了组合而组合,那就过犹不及了。
对于内存管理,现代C++完全可以通过STL容器加上智能指针的方案妥善解决。此时,代码里不会再出现手动free的情况,很大程度上减轻了程序员内存管理的负担。当然,STL或智能指针要用好也不容易,特别要注意一些常见的坑(参见《Effective STL》)。
多线程编程则不仅仅是C++程序员要面临的问题。对于C++而言,通常有两种方式解决多线程资源访问冲突的问题:一是利用RAII来加锁和解锁(针对跨线程操作的对象),二是让同一对象或资源只在同一线程中进行操作。
再谈C++的学习和应用。C++实战大多离不开三类技能(不谈及算法): 一是C++本身内容的掌握,包括语法和标准库等;二是系统API的掌握,包括文件系统、图形接口、数据库系统、网络编程等;三是领域知识的理解,权且也把面向对象编程等思想和能力算在内。所以,这其实是一项综合能力的培养和学习,并不仅仅是学会了语法就OK。
要想用好C++,我自己的一点经验,首先要对语法有扎实的掌握,特别是一些细节和容易忽略的地方,不然就容易埋坑。当然,这不是说只有把语法全部掌握了才能开始写程序,而是要在实践中循序渐进,每实践一个知识点就尽可能把对应的细节和坑弄清楚,这样随着时间和经验积累,就能扎实地打好基础。此时,《C++ Primer》第5版可以作为案头必备的参考书和工具书。
同时,还要尽可能理解和掌握业界的最佳实践,并运用到自己的代码中。这些最佳实践怎么来呢?一是经典书籍,包括《Effective C++》、《Effective STL》等;二是优秀的开源项目,我个人非常推崇陈硕的muduo库,自己也从中受益匪浅;三是不断反思自己原来的代码,总结经验教训。对于第三点,可以采用快速迭代的思路,不要惰于优化和完善原有代码,因为这是提升自己的很好的机会。
再高一个层次,就是对于自己写下的每一行代码,都很清楚这行代码在背后做了什么事情,这样对于自己的代码就有很好的掌控力。比如,调用虚函数的时候,使用STL容器的时候,尽管我们只是一个函数或方法调用,但其实在我们的代码背后还默默地做了很多事情。从系统、语言、标准库三个层面,我分别推荐《深入理解计算机系统》、《深度探索C++对象模型》和《STL源码剖析》三本书,可以从中找到答案。
C++语言之父提到他设计C++语法的一项基本原则是向程序员提供尽可能的灵活性,但是这种多范式带来的灵活性和语法的复杂性也提升了团队合作的难度,并且对团队每一名成员的编程能力都提出了较高要求。一个简单的办法是通过项目约定来控制不同范式的使用,尽量统一大家的编程风格和思路,这样可以从语言层面控制项目的复杂度。
最后,谈一下自己学习C++的一些体验。刚开始学C++的时候,基本不得要领,写出来的软件虽然实现了对应的功能,但是健壮性和可维护性堪忧。被同事推荐后看了《敏捷软件开发:原则、模式与实践》,反思了以前编程的痛苦经历和种种问题,算是第一次提升;后来看过《深度探索C++对象模型》,对所写代码背后隐藏的东西有了比较深入的理解,算是第二次提升;再后来仔细研读了陈硕的muduo库源码,在实战层面有了更好的参考,算是第三次提升。虽然也看过其他很多书籍和源码,并且有着或多或少的收获,但是对于自己可以称作里程碑的节点,大概就是以上三个了。
回顾往昔,很感谢C++,让自己走上程序员这条不归路,并且越陷越深。其中必然有着种种痛苦,但是每次产品交付时的那种喜悦感和成就感,一直支撑着自己走到今天。而C++,陪伴了自己这么多年,带给了我很多编程的感悟和美好的回忆。看着自己曾经敲下的C++代码,就像看到了当年自己懵懂而努力的影子。如今,这门相对古老的语言在众多后起之秀的冲击下日渐沧桑,但是对于我,它永远是不可替代的。因为,它已经成为了我生命的一部分。
发表于 2020-12-31 18:36 | 显示全部楼层
如果你不想成为一个拿技术装b的geek而仅仅是想用一部分技术解决一部分问题,那么请你不要试图精通任何东西。因为任何技术在你精通之前,足够解决大部分问题了。
特别是c++。
发表于 2020-12-31 18:41 | 显示全部楼层
本来都不想更新了,但是其他人回答的都太不靠谱了,其他人都是在说怎么当以个游戏逻辑开发人员,但是你作为一个游戏引擎开发人员,你不会C++能行吗?

游戏开发不止有一个开发游戏这一领域的。

为什么不认真读题!!
-----------------Update-----------------
先回答你的第一个问题,一年是不能精通C++的,但是能熟悉C++的,并且用C++做出一些Demo甚至一些游戏。但其实题主不是想问多长时间能学会游戏开发中的C++吧?楼主想问的是如何进入游戏开发这个圈子,所以我要反对一下 @王迅 的短答案了。

不管怎么说,还是要欢迎你来到游戏编程的世界,游戏编程是编程中最小众的领域。你身边的同学可能有许多的人都会各种前台开发,后台开发或者ACM算法,但是做过游戏的人可以说用一个手掌就能数过来了。

但是很巧合的是,我是个大三的学生,而且我现在做游戏开发,那么我的经验对你来说有些价值。

然后我再尝试着回答第二个问题。游戏开发还需要学些什么?

首先,题主要做的是学好C++,为什么这么说呢?因为不管是现在的图形引擎(如OpenGL)还是游戏制作引擎(如Cocos2d-x)都是把C++作为主力语言的。

那么,我就先推荐几本C++的入门书籍吧:
C++ Primer 中文版(第 5 版) (豆瓣)
C++程序设计教程 (豆瓣)
数据结构与算法分析 (豆瓣)
Effective C++ (豆瓣)
楼主可以按照顺序依次看下来,由于都是我看过的书,我可以完全保证这些书的质量!

接下来,楼主可以去 Problems | LeetCode OJ,Programming problems and Competitions :: HackerRank 这些网站刷一些算法题,毕竟光说不练肯定是不行的 =_=。

接着,摆在题主面前的是两条不同的发展路线
    Gameplay Programmer(游戏型程序员)Graphics Programmer(图形程序员)
Gameplay程序员适合游戏策划紧密合作的一种程序员,他们会编写游戏中的主要逻辑,为策划提供关卡编辑工具,第一时间测试并玩到最新的游戏。

由于Gameplay主要集中于游戏逻辑的编写,在这一块,我的经验是最好从使用一个游戏引擎开始,考虑到你的C++和程序员背景,推荐你使用Cocos2d-x这个游戏引擎,下面是这个引擎的网址。

Cocos2d-x: World’s #1 Open Source Game Development Platform

游戏逻辑部分,你需要理解游戏中的场景管理,资源管理,状态机,AI和网络这些模块的编写。具体的操作可以查看我的这个答案:

学Cocos2d-x,需要掌握多少C++知识?大概学多久可以做出一个游戏?

另一种是Graphics Programmer,或者说是Engine Programmer,他们是给程序员写程序的程序员(有点绕口啊=O=)。这部分你需要学习的是OpenGL和ORGE等等

首先,你要学习的是OpenGL,首先我们要看的当然是这个红宝书了!OpenGL编程指南(原书第7版) (豆瓣)

然后,就是读一些OGRE的源码了,国内的许多“自研引擎”就是通过ORGE做出来的,所以,作为一个Graphics Programmer读这个引擎的源码是非常必要的

最后呢?我们不管是当那种程序员,我们最终都是要做出项目的。

如果你是图形程序员,那么最好的项目就是,自己做一个游戏引擎

如果你是Gameplay Programmer,那么最好的项目j就是,自己做一个游戏项目

比如说我最近做个一个Demo类型的游戏项目:MrNerverDie/Four · GitHub

那么,题主你准备好加入游戏程序员的行列了吗?=w=
发表于 2020-12-31 18:43 | 显示全部楼层
反对目前第一@Kubisoft的说法,题主还是学生,别用压榨it民工的想法来教导!题主可以从cocos2dx和unity3d开始学游戏开发,但是,如果想一直做编程,请别忘了必须同时修炼c++, 因为它可以给你认识到真正的编程,让你懂得更多计算机编程思想,以后就算不写c++也可以迅速了解别的语言,别的工具的~而不会变成仅仅依靠IDE工具,随便抄抄别人代码,完成山寨程序的It民工
发表于 2020-12-31 18:52 | 显示全部楼层
@kubisoft 说得对,想做游戏开发根本就不需要精通c++,根本就是南辕北辙。不过理由我跟他不一样。就算你的志向是开发crysis这样的游戏,其实也只需要用到C++的一小部分就够了。C++各种范式是发明来解决所有问题的,游戏只是其中的冰山一角,你没必要精通,没必要学会C++的所有部分。

怎么样才算是精通 C++?
可以参考我的这个回答
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-20 09:09 , Processed in 0.104515 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表