用一年时间如何能掌握 C++ ?
?游戏开发 话题的优秀回答者
强烈反对
@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日更新)
编辑于 2014-06-08