【MiloYip的回答(383票)】:
本人大約從20多年前開始學習及使用C++,但仍未達到我認為「精通」的階段,甚至對于C++11的各種新特性也未掌握。然而因為我是在讀書時自學C++的,也是游戲程序員(原問題中提到題主想從事游戲開發(fā)),覺得也許能提供一點意見供網(wǎng)友參考。
首先引一下2010年8月號《程序員》刊登的拙文《C++強大背后》最后一段:
C++學習建議
C++缺點之一,是相對許多語言復雜,而且難學難精。許多人說學習C語言只需一本K&R《C程序設計語言》即可,但C++書籍卻是多不勝數(shù)。我是從C進入C++,皆是靠閱讀自學。在此分享一點學習心得。個人認為,學習C++可分為4個層次:
- 第一層次,C++基礎:挑選一本入門書籍,如《C++ Primer》、《C++大學教程》、或Stroustrup撰寫的經(jīng)典《C++程序設計語言》或他一年半前的新作《C++程序設計原理與實踐》,而一般C++課程也止于此,另外《C++ 標準程序庫》及《The C++ Standard Library Extensions》可供參考;
- 第二層次,正確高效地使用C++:此層次開始必須自修,閱讀過《(More)Effective C++》、《(More)Exceptional C++》、《Effective STL》及《C++編程規(guī)范》等,才適宜踏入專業(yè)C++開發(fā)之路;
- 第三層次,深入了解C++:關于全局問題可讀《深入探索C++對象模型》、《Imperfect C++》、《C++沉思錄》、《STL源碼剖析》,要挑戰(zhàn)智商,可看關于模版及模版元編程的書籍如《C++ Templates》、《C++設計新思維》、《C++模版元編程》;
- 第四層次,研究C++:閱讀《C++語言的設計和演化》、《編程的本質(zhì)》(含STL設計背后的數(shù)學根基)、C++標準文件《ISO/IEC 14882:2003》、C++標準委員會的提案書和報告書、關于C++的學術(shù)文獻。
由于我主要是應用C++,大約只停留于第二、三個層次。然而,C++只是軟件開發(fā)的一環(huán)而已,單憑語言并不能應付業(yè)務和工程上的問題。建議讀者不要強求幾年內(nèi)“徹底學會C++的知識”,到達第二層左右便從工作實戰(zhàn)中汲取經(jīng)驗,有興趣才慢慢繼續(xù)學習更高層次的知識。雖然學習C++有難度,但也是相當有趣且有滿足感的。
如果題主認為的「精通」是指上述所指的第二層次,那么我估計一年全職時間也未足夠「精通」。首先,閱讀這些書籍本身也需要不少時間,而且對于一般人來說(指除了一些學習記憶能力超強的人),很可能需要閱讀幾遍才能記住一些細節(jié)。另外,閱讀后必須要練習。除了入門的習題外,還需要做一些工程向的項目,才能了解各種語法、編程范式的使用方法及時機,理想地建議參與一些開源項目。然而,學習是需要不斷思考并把結(jié)果沉淀,方法包括與朋友討論、寫博客、寫知乎答案等,這些都需要時間。
如引文末段所指出,我建議不要把「精通C++」作為一個一年目標,應該要把學習語言作為一個持續(xù)的過程,同時要把語言運用在具體的應用場合中。
---------------------------------------------------
再討論C++與游戲開發(fā)。
看到有不少答案討論到有關C++是否游戲開發(fā)者所必須的技術(shù)。我認為,這并不是完全必須的,但許多游戲開發(fā)項目需要到C++。以下列舉一些過往曾流行的游戲平臺/類型:
應否選擇C++
哪些程序適宜使用C++?
C++并非萬能丹,我按經(jīng)驗舉出一些C++的適用時機。
- C++適合構(gòu)造程序中需求較穩(wěn)定的部分,需求變化較大的部分可使用腳本語言;
- 程序須盡量發(fā)揮硬件的最高性能,且性能瓶頸在于CPU和內(nèi)存;
- 程序須頻繁地與操作系統(tǒng)或硬件溝通;
- 程序必須使用C++框架/庫,如大部分游戲引擎(如Unreal/Source)及中間件(如Havok/FMOD),雖然有些C++庫提供其他語言的綁定,但通常原生的API性能最好、最新;
- 項目中某個目標平臺只提供C++編譯器的支持。
按應用領域來說,C++適用于開發(fā)服務器軟件、桌面應用、游戲、實時系統(tǒng)、高性能計算、嵌入式系統(tǒng)等。
很大程度上,游戲──或說游戲引擎,都是C++非常適合的應用時機。
一些人認為,游戲開發(fā)者使用現(xiàn)成的引擎,就不需要使用C++了。過往,業(yè)界有一個普遍常識,就是用C++開發(fā)游戲引擎,而游戲引擎提供腳本引擎供編寫游戲邏輯代碼。但這個觀點被Unreal Engine 4的決策改變,UE4放棄了維護多年且被大量使用的UnrealScript腳本語言,而改用原生C++作為游戲邏輯編程的語言。此決策背后有多個原因,但這里只想舉出這例子展示C++在游戲開發(fā)中的用途及潮流,具體原因分析就不詳細展開了。
除了自行研發(fā)游戲引擎需要使用C++,我們可以看到,大部分游戲引擎都提供了其C++原代碼(Unity算是例外),這讓我們可以
最后,「還需學習什么」是一個很難簡單回答的問題,因為游戲開發(fā)涉及的知識面很廣。建議可參考本人譯作。
【毛星云的回答(248票)】:
強烈反對 @kubisoft 功利性太強的高票答案!
這是在把一個能成為業(yè)界top 1%的頂級游戲開發(fā)技術(shù)大師的黑馬,往能傻乎乎地受你們壓榨的IT民工的火坑里推,你造嗎?
這讓我想起了喬幫主關于“賣糖水”的那句經(jīng)典話語,而我們的版本是:
你是愿意就這樣學點皮毛混口飯吃隨波逐流,還是成為真正的游戲開發(fā)業(yè)界頂尖技術(shù)大牛,推動業(yè)界的發(fā)展,去改變世界?
關于上面這句話的兩個抉擇,我們來做個選擇題。
A. 如果你是想從事游戲行業(yè)當個二流的民工打打雜一輩子就這樣過去,請去看@kubisoft兄有些對現(xiàn)實妥協(xié)之前排名第一的答案。(不帶人身攻擊的,只是對事不對人而已呢) 這種太依賴IDE和游戲引擎所謂速成方式,到最后只能是二流的民工,打雜的,混飯吃的。知道其然,不知道其所以然。遇到真正的專業(yè)性問題就卡殼了,比如如何優(yōu)化渲染質(zhì)量之類的問題。或者開發(fā)的項目就是那種2D的小兒科,或者山寨跟風趕進度趕上市的快餐游戲,而不是畫質(zhì)精美,設計精良,堪稱經(jīng)典,為國產(chǎn)游戲長臉,推動全球游戲業(yè)界發(fā)展的革命性大作。
B. 如果你是志向高遠,想制作出改變世界的革命性游戲,或者推動游戲產(chǎn)業(yè)的發(fā)展,成為游戲開發(fā)業(yè)界top 1%的技術(shù)領軍人物。請熟練C++,請修煉好內(nèi)功。@王選易 兄 @徐奕成 兄的答案是極好的。且正如萌萌的V大 @vczh 所言,就算你的志向是開發(fā)crysis這樣的游戲,其實也只需要用到C++的一小部分就夠了。C++各種范式是發(fā)明來解決所有問題的,游戲只是其中的冰山一角,你沒必要精通,沒必要學會C++的所有部分。我們這里所說的,是了解原理,學C++只是其中的一小部分,與其說去不斷的學C++的更多高級特性,更好的學習方向是熟練利用C++配合DirectX或者OpenGL來制作Windows小游戲,對數(shù)據(jù)結(jié)構(gòu)設計模式有一定的認識,且能夠準確針對問題選擇你的數(shù)據(jù)結(jié)構(gòu),研習計算機圖形學blablabla的。
(PS:不要輕易用“精通C++“這個狂妄的詞眼,后文有一些關于這個梗的解釋)
正如我之前在自己博客里面所轉(zhuǎn)載的文章《編程巨星的唯一秘訣》中說的:
“對所做的事情的理解越深,你就會做的越好?!?/b>
既然題主都提到要走熟練C++,以后開發(fā)游戲這最正統(tǒng)的技術(shù)道路了,他內(nèi)心渴望的應該是志向高遠,做個強者,而不是去當IT民工打雜做技術(shù)含量不高的事情。
即我是不能同意更多 @Aaron Luo 兄的觀點。
”題主還是學生,別用壓榨it民工的想法來教導!題主可以從cocos2dx和unity3d開始學游戲開發(fā),但是,如果想一直做編程,請別忘了必須同時修煉c++, 因為它可以給你認識到真正的編程,讓你懂得更多計算機編程思想,以后就算不寫c++也可以迅速了解別的語言,別的工具的~而不會變成僅僅依靠IDE工具,隨便抄抄別人代碼,完成山寨程序的It民工?!?/p>
@Floristt 兄在評論區(qū)說:那些不懂原理只是挑一個工具熟練掌握使用或許在當前游戲市場火熱的背景下也能混得不錯,但是感覺很快會遇到職業(yè)瓶頸。這對自身而言就是一種風險。如果一項技能你學三個月就能耍通常意味著可以輕易找到一個人代替你。
@徐奕成 兄說: 你學會這些可以讓你比較容易找到一個工作,但是幾年之后會碰到你的職業(yè)瓶頸,要么繼續(xù)學底層,要么轉(zhuǎn)行。否則公司會毫不猶豫地找人來替代你。其實有一句話我很贊同:“程序員如果不學好底層,將毫無作為。C++讓你走向程序員這條路,編譯原理和匯編語言等讓你走得更好,數(shù)學英語讓你走得更遠?!?/p>
大方向的話,就如@王選易 兄所言,如果你是圖形程序員,那么最好的項目就是,自己做一個游戲引擎,如果你是Gameplay Programmer,那么最好的項目就是,自己做一個游戲項目。
另外, @IMAGICE 兄在評論區(qū)說到,“還是那個問題,是選擇偏向游戲(文藝方向,獨立開發(fā)),還是想做好技術(shù)(引擎開發(fā),技術(shù)研究,打工,這個可能是大部分人的歸路)。”
是時候引出游戲開發(fā)領域的兩大流派了,即 @伍一峰 兄在回答中提出的氣宗與劍宗。
獨立開發(fā)者和小團隊因為時間和精力的限制,大多是以實現(xiàn)為目的,這也是情有可言,這就不難解釋 @kubisoft 兄所推崇的以快速實現(xiàn)為目的,依賴工具、引擎和不求甚解的劍宗流派有不少人的追捧。(文藝方向另談)
每個人切入這個行業(yè)的方法不盡相同,能選擇最適合自己的入門方式就是最好。但是入門后如果想有更好和更長遠的發(fā)展,必須開始崇尚氣宗一派,了解內(nèi)部技術(shù)細節(jié),修煉好內(nèi)功。不要流于形式,浮于表面,依賴工具,而是要深鉆進去,了解得越深越透徹越好。最好是能自己了解游戲引擎的底層原理,甚至是寫出自己的游戲引擎來,這樣才是更高的境界(當然這只是極少部分的頂尖高手能達到的境界)。
總之,劍宗一派適合入門,這樣有趣,有成就感,能快速得到成果,但容易遇到職業(yè)瓶頸,后勁不足。氣宗一派注重內(nèi)功,了解原理,作為稀缺的高水平人才資源,能有更多選擇的權(quán)力,有更長遠的發(fā)展。而且不難理解游戲開發(fā)領域是先有了氣宗才有了劍宗,且了解原理,內(nèi)功深厚的氣宗境界更高一籌。
能找到自己的合適的方式就是最好。并不是否定從引擎出發(fā)入門這條便捷之路,其實我的建議,若決定走修煉技術(shù)為主的氣宗一派,先學點C++,然后配合著C++學一些底層API(DirectX或OpenGL),能寫一些比較炫酷的三維游戲場景,或者說自己實現(xiàn)一個小型的軟引擎,再去真正地接觸引擎,利用引擎做一點有趣的demo或者完整的游戲,閱讀一些優(yōu)秀開源引擎的源碼(比如Ogre,irrilicht,Unreal Engine4 ,cryEngine),甚至自己實現(xiàn)引擎或者做游戲項目,這是重視技術(shù)的氣宗流派比較科學的內(nèi)功修習方式。
我們都知道,氣宗和劍宗的爭執(zhí)永遠不會停歇,就像這個回答下的評論區(qū),永遠不是一邊倒,而是氣宗劍宗的支持者平分秋色,各有千秋。
我很欣慰的是,這個答案寫出來之后,一天之內(nèi)就已經(jīng)超過了當時排名第一的、已經(jīng)在答案中被我@了無數(shù)次的kubisoft兄有些對現(xiàn)實妥協(xié),倚老賣老(不帶人身攻擊呢,只是對事不對人)的答案。這證明大家的眼睛是雪亮的,內(nèi)心還是不甘心的,還是希望做個明白人,做個強者,知其然并知其所以然,并且希望自己有能力站在更高的山峰,去完成更大的事業(yè)。
(PS:這段貌似才算是比較理性的分析,回答一開始寫的有些小憤青了,但的確是肺腑之言。)
----------------------------------------------------------------------------------------------------------------------------------------
既然提到了小憤青,就另外附一點我在2013-03-25寫的一篇年代久遠帶些小憤青的拙作中的一些觀點:
“【
事實如此,現(xiàn)在市面上所有畫質(zhì)精美的單機游戲作品(鬼泣5,上古卷軸5,刺客信條3,仙劍奇?zhèn)b傳5前傳,古劍奇譚等等……),所有的大型網(wǎng)絡游戲(Dota2,英雄聯(lián)盟,魔獸世界,龍之谷,劍靈等等等……),所有高性能的三維游戲引擎(虛幻3,Unity3D,Cry Engine3等等……),以及一些高性能的2D游戲引擎(Cocos2d-x等等),都是用C++來開發(fā)的。
其實游戲引擎并沒有那么神秘,說白了也就是那么回事,用類封裝好功能的C++代碼而已。C++寫出來的游戲引擎自然能跨平臺。Unreal Engine3、Unity3D、Cocos2d-x等游戲引擎就是絕好的例子。
學好C++,你可以親手寫出Unity3D,親手寫出 Cocos2d-X,讓大家都叫你大神,大家都用你寫的游戲引擎做游戲,等著你什么時候心情好了更新一下給引擎加更多功能;而不是只會盲目跟風,今天大家說Unity3D火,就都去學Unity3D,明天大家說Cocos2d-x熱門,就來學學Cocos2d-x。你學游戲引擎,學的只是人家某引擎作者某C++大神按心情來定的函數(shù)調(diào)用方式,學的只是如何調(diào)用一些別人寫好的一些類,一些API函數(shù)。這樣在別人規(guī)定給你的一些rule中固步自封,大家覺得有技術(shù)含量么?
我們是時候該該想一想了,為什么現(xiàn)在全球范圍內(nèi)優(yōu)秀的三維引擎,就是沒有我們國產(chǎn)引擎的影子。
所以,無論是哪個平臺,Windows也好,iOS也好,Android也罷,如果你真正想在游戲開發(fā)領域有所作為,混出個名堂,請學C++,請學計算機圖形學,請了解計算機圖形API(OpenGL或者DirectX),而不是在跟風某種“熱門”的游戲引擎的大潮中隨波逐流,在某種移動平臺的游戲開發(fā)中迷信某某引擎,樂不思蜀,固步自封。
咳,扯遠了,而且有些小憤青了,我并沒有歧視其他編程語言的意思。淺墨只是想表達,無論是哪個平臺(Windows,Play Station,Xbox,Android,iOS, WindowsPhone, WUII),在三維或者高性能游戲開發(fā)領域,確實就是C++的天下。
【Visual C++】游戲開發(fā)四十九 淺墨DirectX教程十七 三維天空的實現(xiàn)
----------------------------------------------------------------------------------------------------------------------------------------
2014-6-2更新部分。
答評論區(qū) @李柯 兄的一段話。關于站在巨人肩膀上的一些思考。
首先對于這部分, 在這篇回答的評論區(qū),@invalid s兄的文字是相當?shù)纳羁膛c一針見血,推薦大家讀一讀。
1.我們并不是說支持完全去從頭造輪子,而是你理解的越深,就可以收放自如,做個有選擇權(quán)的強者。當沒有合適你的輪子的時候,當遇到技術(shù)瓶頸的時候,你自己完全可以制造個更好的,前所未有的輪子,而不是懵在那邊,等待你所謂的巨人們心情好后的施舍,造一個合適的輪子給你用,或者因為長久以來的太依賴工具而喪失了本來的能力。
我大家所希望的,是能做一個真正的明白人,心中有墨水,心中有底氣,然后無所畏懼,遇到什么瓶頸都不虛。
我們站在巨人的肩膀上的同時,不僅僅是靠業(yè)界巨人們寫出來的庫去實現(xiàn)自己的東西,而是可以理解與吸收巨人們的思維、技術(shù)和實現(xiàn)方法。當達到一定境界后,我們可以當下一個巨人,推動業(yè)界革命。這大概就是大牛與民工,強者與弱雞,最外在的區(qū)別與表現(xiàn)形式。
太依賴所謂的巨人們的肩膀,太依賴工具,如同井底之蛙,日復一日地調(diào)用讓你崇拜的大神們寫出來的類庫,以為只要能做到這樣就天下無敵了,以為就是軟件行業(yè)的全部了——這大概就是目前,我們國內(nèi)軟件行業(yè)的誤區(qū)所在吧——依賴工具,浮于表面。
2.能理解內(nèi)部實現(xiàn)細節(jié)肯定是推崇的,這個看個人,或遲或早,但是越早越好。
我寫這個答案只是希望題主以及看到這個回答的朋友們能有更長遠的眼界,立意更高遠,能有更寬的視野,能知道更大的世界,而不是一輩子就這樣炒炒現(xiàn)飯調(diào)用調(diào)用別人寫的函數(shù)窩囊地就過去了。
人的一生精力有限,作為一個聰明人,作為一個明白人,入門的時候什么方式越快越好,但是入門之后呢,如果希望自己有更好更大的發(fā)展,大方向千萬不要錯,不要過分依賴拘泥于工具,浮于表面,一定要跳出那個圈子,從井里爬出來。
即,如果希望自己變得更強,不人云亦云隨波逐流,最好的方式或許就是自己去理解細節(jié),也并不是咬文嚼字地要自己真正花大工夫花精力去做一款引擎,這個量力而行。
人的一生精力有限,沒有哪條路哪種方法適用于所有人,但一個人只要能專注于自己認為值得事情,能自得其樂,那也是值得尊敬的。
回答 IMAGICE兄的評論:
3.直接用輪子,并真正做出非常贊的作品出來,那也是值得尊敬的。當今游戲引擎的發(fā)展,為我們提供了前所未有的便利,我們可以合理的利用他,但千萬不能太迷信太依賴他。
但如果已經(jīng)在某個領域花了10年甚至更長的時間,還沒能有所突破,那就得反省自己,是不是方法問題了,是不是方向問題了,是不是之前研習的時候,或進度太慢,還是走了很多彎路。我們都清楚,并不是每個人都能有很好的技術(shù)天賦與底子,當然也不是每個做游戲的人都要去理解和實現(xiàn)底層,要量力而行,要有所側(cè)重,要找到自己最合適的角度。我們只是從長遠來看提倡將知識挖深,讓自己打開眼界,不做井底之蛙,不隨波逐流,讓自己因為站得高看得遠,而有更多更廣選擇的權(quán)利。
技術(shù)與創(chuàng)意,并不矛盾。人生在世,有所為,有所不為,游戲開發(fā)亦如此。
----------------------------------------------------------------------------------------------------------------------------------------
以下算是一些關于C++的附加思考。
【關于“精通C++”這個字眼,請不要濫用】
引用@徐奕成 兄的一段話。
徐兄現(xiàn)在大三,從初一開始學習C++,對這些有一定的了解,也有一定的發(fā)言權(quán)。但是他從來不敢說他精通了C++。因為徐兄的主管, 15歲開始學習C語言,現(xiàn)在學習C++已經(jīng)超過20年。但是他對于技術(shù)非常的謙遜,抱著學習的心態(tài)去學習技術(shù),也沒在我們面前提過他精通C++。即使他已經(jīng)是國內(nèi)行業(yè)的領軍人物。
引用 @漸修竹 兄的一段話。
“我也做了兩年c++了,也不敢說精通,我們老大做了至少8年,也沒敢說精通,我認識的很多大神,也都沒敢說精通。事實上我認識的很多大神都很謙虛,我跟他們學到了很多,大家的簡歷上也都寫著熟悉c++之類的字眼。”
即對于博大精深的C++,業(yè)界的大牛們窮其一生去研習都不敢言能精通它。就算是天天去鉆研C++,一年也只能學個皮毛而已。
C++的精通細節(jié)與思考,可參看萌萌的V大 @vczh 的這篇回答:怎么樣才算是精通 C++?
至于快速入門,強烈推薦 Essential C++,其為C++業(yè)界入門必讀《C++ Primer》的作者剝?nèi)シ彪s,只講C++核心的一本書。
而后續(xù)的一些,可以參考這個豆列中的書單:學習C++語言
----------------------------------------------------------------------------------------------------------------------------------------
在結(jié)束回答之前,感謝 @洪逸群兄在回答中的at,間接地邀請,讓我知道有這個討論存在:)
總之,最后的最后,還是那個抉擇:
你是愿意就這樣學點皮毛混口飯吃隨波逐流,還是成為真正的游戲開發(fā)業(yè)界頂尖技術(shù)大牛,推動業(yè)界的發(fā)展,去改變世界?
在二十幾歲這段人生可塑性最強的時光里,我們應該是滿懷信心,志向高遠,想讓自己與這個急功近利、日漸扭曲世界有所不同的吧。
【kubisoft的回答(135票)】:
題主本來問得很糊涂,不知道到底是問游戲開發(fā)呢,還是如何學習c++。再說一遍結(jié)論吧,游戲開發(fā)和c++的學習是兩個方向,做游戲開發(fā)現(xiàn)在基本上不需要學習c++。以前做游戲開發(fā)不得不用c++但是現(xiàn)在已經(jīng)越來越少,以后還會更少,所以花大力氣去學c++對以后做游戲開發(fā)沒有多大幫助。
有人提到了java, 其實java又不是用來做游戲的,也從來不算腳本語言。
在此將c++和c#、javascript之類的腳本語言做一些簡單的對比吧,我的c++水平很低,遺漏之處難免,歡迎指正。
內(nèi)存管理: c++的代碼容易產(chǎn)生隱藏的野指針等不容易發(fā)覺的內(nèi)存管理問題,而且不一定會爆,調(diào)試有點困難。有人覺得這是水平不高的表現(xiàn),心想,只要成對申請/釋放內(nèi)存就可以了嘛!其實,我以前也是這么想的,后來發(fā)現(xiàn)不是這樣...... 實際項目會非常復雜,很多時候到底誰應該擁有這個對象、誰應該負責申請誰應該負責釋放很難界定,而使用c++就必須做出這樣的界定,導致有的算法必須繞彎子,寫不少冗余代碼專門管理內(nèi)存。
回調(diào)的時候用的閉包:這一點,用objective c就比c++方便很多了,回調(diào)的代碼可以跟調(diào)用的代碼緊挨在一起書寫,而用c++的時候不得不在類里面另開方法,寫起來很蛋疼,名字難起還在其次,參數(shù)傳輸完全要靠成員變量或者void*, 然后強制類型轉(zhuǎn)換。這樣也能寫,但是可讀性就差了很多,維護困難。
unity給c#提供了協(xié)程,用起來跟線程差不多但是不用考慮加鎖解鎖等問題,真心方便。
幾個腳本語言大多有map, filter等等函數(shù)式編程的特性,考慮問題更加整體,代碼量會小很多,也更難出錯。
--------------------------
呵呵居然冒出一個高票長答案,嚇我一跳啊。不喜歡跟別人辯論,說下去沒完沒了啦,只是看到“倚老賣老”之類的人身攻擊的字樣還是很不開心吧。這也就算了,居然我被說成“壓榨IT民工”,這個真讓人傷心啊。我忍住,無視。后面寫的東西,還是給旁觀者看的吧,希望能多幫到一些人。
游戲不僅是技術(shù),要發(fā)現(xiàn)更大的世界的話要開闊視野的話就不要沉迷于c++的技術(shù)細節(jié)啊。要做出有創(chuàng)意的與眾不同的游戲,也是要靠快速實現(xiàn)游戲邏輯然后快速迭代,多跟策劃溝通啊。如何快呢?就要在能夠避開c++的地方盡量避開啊。
c++還是很有用的,比如cocos2d-x目前還是很依賴c++;效率不夠的地方也必須用c++來改寫,以進行優(yōu)化。不過以后隨著硬件性能的提升,c++的應用范圍會萎縮很多,只專注c++的程序員很容易被孤立的,空間會越來越小。
----------
關于批評我c++水平的部分不予答復。關于后面一部分,工程越大越體現(xiàn)出腳本的優(yōu)勢,c++的代碼結(jié)構(gòu)太容易混亂了。
c++更面向機器,更考慮運行效率,為了運行效率不得不犧牲可讀性,大部分腳本在這方面就強得多,犧牲了運行效率換取了可讀性。
至于java, java的開發(fā)效率同樣是被人罵得要死的,而且很少有人打算用java做游戲吧,哪個引擎支持?
-------------------------以下是原答案--------------------
瀉藥。
想做游戲開發(fā)根本就不需要精通c++,根本就是南轅北轍。
你應該挑一個引擎熟悉起來,3d就用unity,2d就用cocos2d。unity支持c#和javascript,這兩門語言你可以任意學,只要能做出自己想要的游戲;cocos2d也是支持javascript和lua,能避開c++就避開,c++的運行效率高而開發(fā)效率極低,學起來很累用起來更累,你要是專心學好了c++,作為老板我還真不敢要呢,精通c++可能意味著過于重視運行效率而開發(fā)效率低,視野窄,業(yè)務溝通困難,工資要的很高很高也喜歡埋頭鉆研,但我要的東西就是很久出不來!
別聽他們的,我是工作十幾年做游戲帶項目也都超過十年的人了,c++ objective c java javascript flash c# unreal unity cocos2d ruby on rails都用過,他們自己也只是學生,答題時還是自己想象的成分居多!
---------------
題主想好了是要學好c++還是學做游戲,還是要做游戲引擎。
做游戲引擎可以參考另一個問題,手機黨不方便引用了,大體上是“游戲公司開發(fā)自研引擎還有意義么?”
以前做游戲是只能用c++的,以前基本上不管做什么都必須精通c/c++。現(xiàn)在不是,現(xiàn)在大部分領域都有更合適的語言可以選擇,做起來效率更高。
腳本不只是做gameplay,所有部分都可以用腳本去做,包括各種畫面特效。特效其實大部分是美工的活,程序員去認真考慮如何集成進來,如何在合適的地方調(diào)用,而不是寫代碼去取代美工。粒子特效,模型,貼圖,你不用腳本你用c++,除了多寫不少代碼、多去自己管理內(nèi)存調(diào)試野指針之外又能得到什么呢?渲染,那是shader,也不是c++。那么AI,是否只能用c++了呢?當然不是,否則epic搞那個unrealscript干嘛?
【王選易的回答(58票)】:
本來都不想更新了,但是其他人回答的都太不靠譜了,其他人都是在說怎么當以個游戲邏輯開發(fā)人員,但是你作為一個游戲引擎開發(fā)人員,你不會C++能行嗎?
游戲開發(fā)不止有一個開發(fā)游戲這一領域的。
為什么不認真讀題!!
-----------------Update-----------------
先回答你的第一個問題,一年是不能精通C++的,但是能熟悉C++的,并且用C++做出一些Demo甚至一些游戲。但其實題主不是想問多長時間能學會游戲開發(fā)中的C++吧?樓主想問的是如何進入游戲開發(fā)這個圈子,所以我要反對一下 @王迅 的短答案了。
不管怎么說,還是要歡迎你來到游戲編程的世界,游戲編程是編程中最小眾的領域。你身邊的同學可能有許多的人都會各種前臺開發(fā),后臺開發(fā)或者ACM算法,但是做過游戲的人可以說用一個手掌就能數(shù)過來了。
但是很巧合的是,我是個大三的學生,而且我現(xiàn)在做游戲開發(fā),那么我的經(jīng)驗對你來說有些價值。
然后我再嘗試著回答第二個問題。游戲開發(fā)還需要學些什么?
首先,題主要做的是學好C++,為什么這么說呢?因為不管是現(xiàn)在的圖形引擎(如OpenGL)還是游戲制作引擎(如Cocos2d-x)都是把C++作為主力語言的。
那么,我就先推薦幾本C++的入門書籍吧:
數(shù)據(jù)結(jié)構(gòu)與算法分析 (豆瓣)
樓主可以按照順序依次看下來,由于都是我看過的書,我可以完全保證這些書的質(zhì)量!
接下來,樓主可以去 Problems | LeetCode OJ,Programming problems and Competitions :: HackerRank 這些網(wǎng)站刷一些算法題,畢竟光說不練肯定是不行的 =_=。
接著,擺在題主面前的是兩條不同的發(fā)展路線
由于Gameplay主要集中于游戲邏輯的編寫,在這一塊,我的經(jīng)驗是最好從使用一個游戲引擎開始,考慮到你的C++和程序員背景,推薦你使用Cocos2d-x這個游戲引擎,下面是這個引擎的網(wǎng)址。
Cocos2d-x: World’s #1 Open Source Game Development Platform
游戲邏輯部分,你需要理解游戲中的場景管理,資源管理,狀態(tài)機,AI和網(wǎng)絡這些模塊的編寫。具體的操作可以查看我的這個答案:
學Cocos2d-x,需要掌握多少C++知識?大概學多久可以做出一個游戲?
另一種是Graphics Programmer,或者說是Engine Programmer,他們是給程序員寫程序的程序員(有點繞口啊=O=)。這部分你需要學習的是OpenGL和ORGE等等
首先,你要學習的是OpenGL,首先我們要看的當然是這個紅寶書了!OpenGL編程指南(原書第7版) (豆瓣)
然后,就是讀一些OGRE的源碼了,國內(nèi)的許多“自研引擎”就是通過ORGE做出來的,所以,作為一個Graphics Programmer讀這個引擎的源碼是非常必要的
最后呢?我們不管是當那種程序員,我們最終都是要做出項目的。
如果你是圖形程序員,那么最好的項目就是,自己做一個游戲引擎
如果你是Gameplay Programmer,那么最好的項目j就是,自己做一個游戲項目
比如說我最近做個一個Demo類型的游戲項目:MrNerverDie/Four · GitHub
那么,題主你準備好加入游戲程序員的行列了嗎?=w=
【伍一峰的回答(30票)】:
謝謝邀請:)
這個問題有點像劍宗和氣宗。
游戲開發(fā)就是耍劍,耍劍耍得好看了,觀眾就會賞錢。
學習氣宗,雖然能讓你握劍更加有力,耍上一天一夜也不喘氣,還能夾帶一些紫氣,但對于耍劍來說,無關好不好看。精通了C++,然后呢?和游戲一點關系都沒有。因為耍劍不單講氣,最重要是講藝。
因此,自然是劍宗更加有效更加貼切。游戲開發(fā)里面有很多field specific的知識和技能,雖相似,但和軟件開發(fā)仍然不能一概而論。更別以為學好游戲開發(fā)的知識容易,其實路途同樣艱難,只是難的地方不一樣。
那么游戲開發(fā)來說,劍宗和氣宗是不是就一定不兼容呢?也不是。有時候,你需要一些特別的機制或者特別的效果,前人可能沒有實現(xiàn)過,又無法從美術(shù)方面下手或者修改設計,就需要你有扎實的編程基礎來實現(xiàn)它。像游戲引擎就是這樣,想要更漂亮的畫面、更好的運行效率、更方便的工作流程,才會推動引擎發(fā)展。但游戲都沒做過,又怎知道現(xiàn)有技術(shù)不能支撐你所想所要呢?精通C++又解決了什么問題呢?
舉個例子,今年IGF學生組的最佳游戲,The Risk of Rain,我一看,那么精致的畫面、出色的手感、完善的機制,絕對是不簡單啊,一看開發(fā)者,竟是華盛頓大學機械專業(yè)和商學專業(yè)的兩位年輕人開發(fā)的,用的還是GameMaker。
從此我豁然開朗,游戲開發(fā)就是耍劍,耍得好看才有飯吃,哪怕你華山掌門人。
------------------Update 1------------------
這個問題能引起那么多不同意見,很有意思。
重新瀏覽了一遍大家的答案,主要有兩種見解。
一方是正好是我說的劍宗,主張一開始就以游戲開發(fā)相關知識為主要學習方向;
另一方是氣宗,主張一開始以計算機底層知識為主要學習方向。
而C++則是這一題目里兩方主張的矛盾的外在表現(xiàn)。
正如我答案的主體部分,我個人比較偏向劍宗。
一個原因是我沒有進過AAA的大公司,以往兩次實習都是在獨立游戲公司,他們的氛圍都是以快速實現(xiàn)為主要目的。
所以我也耳濡目染,將實現(xiàn)視為游戲開發(fā)當中最重要的東西。
因此我較為主張初學游戲開發(fā)的話,也以實現(xiàn)為目的,比方說,選一款引擎,不斷地制作游戲。在這一個過程當中,我們會不斷地接觸到新的知識:
一開始,我們在Update里面寫代碼,我們接觸到了Game Loop,
我們創(chuàng)建角色圖像,接觸到Sprite的概念,
我們想用鍵盤控制角色移動,我們接觸到了Input System,
我們想讓角色跳躍,接觸到了Physics Engine的概念,等等等等...
現(xiàn)在我們對Game Loop有了了解,對Physics Engine有了了解,知道它們在游戲中的作用,那么對我們學習這些領域,是有莫大好處的。
正如最近關于很火的“設計模式”問答,現(xiàn)在的觀點主要是“你得遇到問題了,才真正懂得某一個模式的好處”。我覺得關于游戲開發(fā)的學習,也是這樣的。
當然,我不會說哪位在座哪位老師的意見是錯的,因為游戲開發(fā)本身就是一個新生學科,甚至連學科也稱不上,自然沒有對的和錯的路。
【徐奕成的回答(22票)】:
我覺得可以過來再更新一次了。
/*****************************************以下內(nèi)容可以跳過*****************************************/
我說一下我做游戲的歷程吧,二年級的時候(我出生于1991.11)我開始接觸電腦,當時對電腦的畫圖工具很癡迷,為什么畫圖工具能夠做出這么好看的東西。所以我對這些所見即所得的東西非常著迷,因為我覺得很容易就開發(fā)出來一個東西炫耀。
后來四年級時候,我的父母有接觸一個游戲叫《傳奇》,我在他們沒在家的時候偷偷創(chuàng)建了一個賬號,體驗了十五分鐘(沒錯小學生就是我),覺得游戲真的很吸引人,我是父母在我從小禁止玩游戲的,所以我沒有接觸過任何游戲,包括紅白機,這應該也是很多人的童年。在那時候,我的夢想就是未來能夠做游戲設計師,做一個全世界的人都喜歡的游戲。
慢慢CCTV某一個頻道有一個欄目是一個教授開始了解有一樣東西叫做powerpoint 2000.我開始拉一些圖片進來,做了一個小游戲,你沒看錯,是ppt做了一個小游戲,是類似大逃殺的游戲。點一下進一個地點,有了最原始的交互。
從初一的時候,我知道了有一個東西叫做VB,我也嘗試用VB寫程序。同時開始學習一個編程語言叫C,那時候我果斷拋棄了C,因為VB真的很容易做出一個窗口,然后寫一個helloworld拿出去炫耀。
興趣是最好的老師,我爸媽說學好這些東西就可以做游戲了。我就開始認認真真學C語言,當時效率也很高,我現(xiàn)在一直覺得我在吃老本。。學C的基本概念,用控制臺做一個打飛機游戲,做一個RPG游戲,類似于colossal_cave_adventure。
再到了高中,開始用VC++6來開發(fā)一些win32小游戲,我覺得把游戲做好是一種使命,那時候也知道了國內(nèi)著名的工作室:西山居1995 完美時空 2004 琳瑯天上2004.
我的心愿就是加入他們,成為真正的游戲開發(fā)者。
后來到大學,我學計算機圖形學,數(shù)據(jù)結(jié)構(gòu),自學編譯原理,匯編語言。才發(fā)現(xiàn)原本單純的夢想發(fā)現(xiàn)是不可實現(xiàn)的,我不可能做出每個人都喜歡的游戲,就開始學習游戲引擎制作。如果你希望能夠從事引擎開發(fā),我推薦葉勁峰 @Milo Yip 大神的《游戲引擎架構(gòu)》一書。
直到現(xiàn)在,我如愿以償,成為了居士,開發(fā)游戲引擎。這不是一年兩年能決定的,如果你要做程序,真的要多積累了。
/*****************************************以下內(nèi)容可以跳過*****************************************/
從始至終,我是抱著一種使命來學習,來努力,來做游戲的。當時面試的時候,面試官問我,你為什么要做游戲,我說:“我一生就為了做游戲,生活能夠過得去就行。”我現(xiàn)在也覺得,我如果不做游戲,我還能做什么(我現(xiàn)在很局限了,眼界很窄)。
我最近學校的課程是要用Objective-C開發(fā)游戲,我從來沒有學過oc語言,但是我并不覺得他特別的難,相反,我覺得他很容易上手開發(fā)iOS應用,因為有C++的積累,我可能不知道具體的語法或者用法還有API,但是我可以通過C++來融會貫通。
C++是一種潛移默化的東西,當你了解他之后,你學什么都會容易,覺得簡單。
所以,C++是重中之重!??!
吐槽完畢。。只有20個贊,第一次這么認真回答的說。 T_T
/*****************************************這是之前的回答*****************************************/
我不請自來了,因為我發(fā)現(xiàn)在這里面回答的人都在回答:“我想做游戲開發(fā),難嗎?”,而不是回答“我想從事游戲開發(fā),一年內(nèi)能精通C++嗎?”。無視題主的提問,實在忍不住。
對于題主的提問,我比較贊同 @王選易 的答案 ,也許大家都是技術(shù)人員并且也在大學中學習游戲開發(fā)。
首先我回答題主的問題,作為大二即將升大三的學生,由于你大一大二忙于社團活動。以致于你可能錯過了大學中打基礎的黃金時期,大三的一個學年里面,除去你的課程時間,能夠繼續(xù)深入學習C++的時間也許并不多。所以,一年內(nèi)你說可以精通C++,我覺得不可能。
我現(xiàn)在大三,從初一開始學習C++,對這些有一定的了解,也有一定的發(fā)言權(quán)。但是我從來不敢說我精通了C++。因為我的主管,他是15歲開始學習C語言,現(xiàn)在學習C++已經(jīng)超過20年。但是他對于技術(shù)非常的謙遜,抱著學習的心態(tài)去學習技術(shù),也沒在我們面前提過他精通C++。即使他已經(jīng)是國內(nèi)行業(yè)的領軍人物。
說一下精通C++這個吧,其實精通這個詞真的很大爭議,至少在許多的社區(qū)都有人對這兩個字吵的不亦樂乎,那么我來和你說一下熟悉的概念吧:
我覺得熟悉C++,至少要能夠做到這些:
1、你完整閱讀過C++ Primer 第五版之后的書,這本書可謂是C++程序員入門必讀的書。(為什么我推薦第五版之后,因為第五版之后包涵的內(nèi)容是C++11標準的內(nèi)容,你現(xiàn)在重拾編程語言,那么推薦你看新的書)
2、你能夠?qū)γ嫦驅(qū)ο缶幊逃忻鞔_的概念。因為現(xiàn)在許多程序員用著面向?qū)ο笳Z言,卻做著面向過程的事情。
3、能夠利用C++配合DirectX或者OpenGL來制作Windows小游戲。
4、對數(shù)據(jù)結(jié)構(gòu)有一定的認識,能夠準確針對問題選擇你的數(shù)據(jù)結(jié)構(gòu)。
5、其他內(nèi)容一下子沒想到這么多,等以后更新。
至于精通,精通C++不僅僅是C++的語法,還有編譯的原理,那么又涉及到編譯原理,還有計算機的組成原理。調(diào)試的時候,當你用release的調(diào)試,你又需要匯編語言的知識,又涉及到匯編語言。再后來你需要設計比較大型的程序,你要對數(shù)據(jù)結(jié)構(gòu),和設計模式有一定的認識。
再回答下一個問題:你希望從事游戲開發(fā)工作,做游戲其實不僅僅是看著最近火熱,而是你要從一開始就對有游戲有接近瘋狂的熱愛,把做好一款游戲當做你的使命,你才有動力繼續(xù)學習。因為程序?qū)W習起來非常枯燥。
至于你最后的問題:
你需要學習其他什么,我覺得其實你需要做游戲,不一定是C++,你可以選擇另一個語言比如Objective-C開發(fā)iOS的游戲,或者學習C#,可以開發(fā)wp8或者xBox的游戲。
如果你單純是做游戲,語言并不是問題,問題是你對其他知識的了解程度和對游戲行業(yè)的熱愛,為了工作而工作可能并不會讓你充滿滿足感與激情。
其他的知識:
計算機圖形學
數(shù)據(jù)結(jié)構(gòu)
編譯原理
匯編語言
英語
數(shù)學
至于苦逼軟件的作者的回答,我反對,并且我認為這不是合適的答案。
不是所有的人會為你“工作十幾年游戲項目超過十年而買單。”
---------------------以下逐個寫下來得罪人---------------------
“想做游戲開發(fā)根本不需要精通C++,根本就是南轅北轍?!?/p>
》游戲開發(fā)不需要精通C++,甚至說不需要會C++,但是你至少要熟悉任何一門開發(fā)語言,并且充分了解數(shù)據(jù)結(jié)構(gòu)。這根本不是南轅北轍,而是取向問題。
“挑一個引擎熟悉起來”
》這是我看到最不負責任的回答,這位同學問的是未來的路,現(xiàn)在讓一個學生直接選一個引擎,沒有錯,這樣可以讓他更容易找到小公司,但是會使用,不懂一個引擎的原理,在日新月異的今天,公司換了一個引擎,要重新去學習,如果掌握最基礎的東西,那么無論任何引擎,都可以迅速上手。
“游戲開發(fā)就是耍劍,耍得好看才有飯吃”
》游戲開發(fā)實質(zhì)就是程序員不僅要練劍,也要練氣。
ps:以上純屬個人觀點。
【vczh的回答(17票)】:
@kubisoft 說得對,想做游戲開發(fā)根本就不需要精通c++,根本就是南轅北轍。不過理由我跟他不一樣。就算你的志向是開發(fā)crysis這樣的游戲,其實也只需要用到C++的一小部分就夠了。C++各種范式是發(fā)明來解決所有問題的,游戲只是其中的冰山一角,你沒必要精通,沒必要學會C++的所有部分。
可以參考我的這個回答
【知乎用戶的回答(11票)】:
/* update */
儼然成了站隊帖了。
一句話,想做獨立游戲,請看頂樓幾位;想以游戲開發(fā)作為一份職業(yè),請看我的和 @王選易的答案。
ps,題主問的是怎么學C++,那么多人在那空樹個靶子亂打是幾個意思?
////////////////////////////////////////////////////
/* update*/
被點了好多反對+沒有幫助么o(╯□╰)o
之前手機上的,回答了題主第一個問題,現(xiàn)在試著回答下第二個問題。建議題主修改下問題,把精通改成掌握,免得問題被偏向題主不愿看到的方向,「精通C++」一直都是一個很無聊的槽點,吐槽的人和被吐槽的人都很無聊。
翻譯一下,可能這樣問比較合適:
如何用一年的時間在C++天賦上加點?
如果說閱讀一遍《C++ Primer》是根節(jié)點的話,接下來的天賦點只有這樣兩種類型:
1. 繼續(xù)閱讀C++相關書籍
整明白《C++ Primer》,對C++有一個感性的認識之后,你可以去看侯捷翻譯/寫的幾本書比如Effective系列、《STL源碼剖析》,甚至對于沒什么人用的MFC,你也可以看下《MFC九(shen)淺(ru)一(qian)深(chu)》,看下上個世紀的業(yè)界的C++程序員都是怎么樣來用C++這門語言的。然后,可以看看《Inside C++ Object Model》,深入理解下C++。然后,對C++已經(jīng)有了一個理性的認識之后,就可以再拿回來《C++ Primer》,順便再翻翻《Thinking In C++》,查查C++標準什么的,仔細琢磨琢磨自己究竟能用C++干什么。至于模板元、FP什么的,題主看完這些書自然會知道自己有沒有興趣接觸的。
2. 做項目
題主說想從事游戲開發(fā)等工作,那我就大膽揣測一下,題主并不是想做一名獨立開發(fā)者,而是打算以死程作為職業(yè)生涯的第一份職業(yè)。
這樣,做項目的話就需要多一點針對性。想要有快速產(chǎn)出結(jié)果的項目,你可以先用D3D寫個小玩具,隨便復刻一下你記憶中的FC游戲即可。想要接觸OOP,那就找?guī)讉€小伙伴,想辦法參加個軟件比賽,做個代碼量至少上萬的項目,語言不僅限于C++。這樣你才能不會覺得書上那些OOP啊泛型啊都是扯的有的沒的。做項目的時候?qū)懘a寫累了,翻翻《設計模式》之類的書。沒錯,我沒把讀《設計模式》算作「閱讀C++相關書籍」。
////////////////////////////////////////////////////
不能精通。
【Aaronluo的回答(8票)】:
反對目前第一@Kubisoft的說法,題主還是學生,別用壓榨it民工的想法來教導!題主可以從cocos2dx和unity3d開始學游戲開發(fā),但是,如果想一直做編程,請別忘了必須同時修煉c++, 因為它可以給你認識到真正的編程,讓你懂得更多計算機編程思想,以后就算不寫c++也可以迅速了解別的語言,別的工具的~而不會變成僅僅依靠IDE工具,隨便抄抄別人代碼,完成山寨程序的It民工
【W(wǎng)uJohnny的回答(6票)】:
我覺得學習c語言會更合適一些??梢员荛_c++的語法陷阱,又能夠快速地書寫程序了解指針,內(nèi)存管理,io以及字符串的操作真諦。
通過6個月左右的c語言學習后,可以考慮學習一些面向?qū)ο蟮恼Z言和lisp語系的語言,例如python和lua。這大概需要3個月左右的時間。這期間可以閱讀一些優(yōu)秀的代碼,我推薦學習的源碼有兩個,一個是lua的源碼,一個是vim的源碼。這兩者都能提高你對計算機底層系統(tǒng)對內(nèi)存管理,以及字符串處理的理解。并且對函數(shù)指針有一個深刻的認識。
最后3個月可以試試采用c和lua結(jié)合的方式去實現(xiàn)一個簡單功能的程序。
恭喜你,畢業(yè)了!你也許還不懂圖形渲染,不那么理解gpu,不懂得網(wǎng)絡通訊,多線程,操作系統(tǒng)和其他計算機科學知識。只是初略對cpu,內(nèi)存和文件存儲有所了解,但這已經(jīng)不妨礙你成為一名合格的程序員甚至游戲程序員。由于你的選擇,你避開了c++學習過程中的諸多陷阱,直接用一門簡單的系統(tǒng)級語言c快速地理解了計算機程序的真諦。這比你學會使用c++更重要,也為你今后的發(fā)展鋪下了堅實的基礎。
【JinHan的回答(2票)】:
1年肯定無法“精通”,但是如果認真學能讓你基本了解這玩意是個怎么回事,而且最關鍵的,能夠幫助你進入游戲的行業(yè)。
上面各種大神的回答,居然milo大神都炸出來了,雖然都很有道理但是我覺得答案依然因人而異。
這個東西沒有什么答案,而更加取決于你想做什么。
你想成為一個程序員,還是更想成為一個游戲開發(fā)者,游戲設計師或者,或是只是喜歡游戲而想呆在游戲的圈子里。。。
游戲是一個很大的產(chǎn)業(yè),每個環(huán)節(jié)都是可以做到最大最強從而改變世界的,而且每個環(huán)節(jié)都是密不可分沒有什么孰優(yōu)孰劣的。
上面不少回答角度是從資深程序員的角度來說的,但我個人認為開發(fā)一個好的游戲編程技術(shù)的重要性其實并不是最最重要的。美工,設定,故事背景,營銷和項目管理方面都是非常重要的環(huán)節(jié),相比之下程序的重要性有的時候并沒有想象的那么重要。 這也是為什么很多人認為不懂編程也能做游戲的原因。有的游戲比如卡牌游戲,甚至不需要任何程序。
并且另一方面,對于玩家來說,他們只知道這個游戲是不是好玩,愛不愛玩,對于用的什么引擎,
你c++寫的多厲害根本都是沒有直接影響的。比如說minecraft這樣的游戲也沒有用到高大上的引擎,dota這樣風靡世界的游戲當初也是用的魔獸爭霸編輯器那個自帶的腳本編輯器完成的。
另外涉及到游戲引擎的方面,也并不是如某些人所說,直接用別人的引擎的人就沒有任何技術(shù)含量的。
第一,為自己的游戲開發(fā)專用的游戲引擎其實也并沒有那么困難,只是涉及到的知識和需要的編程技術(shù)基礎比較高,而且通常沒有絕對的必要性,所以做的人不多,就好像你想蓋房子會自己去造吊車嗎。所以以上說國內(nèi)游戲開發(fā)不好是因為沒有好的吊車其實是不對的。
第二,往往大家把游戲引擎和好的游戲畫面聯(lián)系在一起,但其實好的游戲畫面并不由引擎決定,就好像photoshop是一個創(chuàng)建圖片的工具,但是有的人能用ps創(chuàng)造出驚人的作品,而有的人只能胡亂的涂鴉,同樣的工具而最后產(chǎn)生的效果也可能是完全不同的?,F(xiàn)在無論什么游戲引擎大部分都是基于當前已有的dx或者opengl圖形渲染技術(shù),就算某個引擎能夠同時渲染更多的多邊形,也不能代表其畫面效果好,因為這些其實是取決于使用引擎的藝術(shù)家和技術(shù)美工的。當然如果一個游戲引擎的編輯工具非常的aritst friendly,對于畫面的提升幫助是很大的。(于是問題便從開發(fā)游戲引擎變成了開發(fā)游戲引擎編輯工具)
第三,如何巧妙的利用游戲引擎也是一個非常有技術(shù)的事情,比如dota用的魔獸地圖編輯器,弱到連讓一個單位眩暈固定的秒數(shù)的功能都沒有,所有的眩暈都是要靠創(chuàng)建一個隱藏的單位向敵人丟出一個隱藏的風暴之錘來實現(xiàn)的,即便如此,別人還是做出了一個非常成功的游戲。這樣巧妙的利用一個引擎的各種功能,從而達到自己的設計目的,也是非常有技術(shù)含量的一件事情。在我眼里他們這些游戲程序員的工作并沒有這些引擎程序員的工作低級,歧視他們的技術(shù)含量是可笑的。
另一方面,技術(shù)大部分的時候是因為需求而生的,比如我的游戲需要一個特殊的效果從而能夠過表現(xiàn)某種藝術(shù)效果,但目前的市面上的引擎沒有這樣的功能(比如我想要我的游戲里任何東西都和果凍一樣,并且有物理的效果), 那么這個時候熟練C++編程能力就變得非常的重要,因為涉及到修改原引擎功能的二次開發(fā)往往是使用c++的,并且對于各種優(yōu)化的要求相當?shù)母摺#ó斎蝗绻霾坏?,那么巧妙的修改設計方案避開這是永遠存在的解決的辦法,當然結(jié)果也是這將使得游戲變得平庸)
但是總的來說,花一年時間盡可能深入的學習c++是十分必要的,即使你今后不使用c++作為自己的編程工具。因為c++是目前大部分編程語言的基礎,了解這些細節(jié)對于今后快速掌握另一種語言也是非常有益的,我c++水平不是大神,但我也能做到在從來沒有看過任何java/c#的書籍的情況下看懂大段的java/C#代碼并且自己寫出一些常用的功能。
如果真的想從事游戲行業(yè),在學習c++之外更重要的是,你需要盡早開始著手做一個你想做的游戲,無論多差先做出原形來,無論用什么樣的辦法多落后的技術(shù),在中間你還會學到無數(shù)編程之外的東西。編程這個東西,一旦編程技術(shù)達到一定的水平,剩下的在編程語言之外的思想才是更重要的,就好像有的人寫作的詞匯特別的美,語法特別的對,但是內(nèi)容空洞無力的話也是沒有任何價值的。
【趙丙峰的回答(2票)】:
如果“精通”的含義是了解C++所有的方方面面,甚至編譯器實現(xiàn)細節(jié)。那么肯定不會有這樣人的。并不是你不能成為這樣的人,而是完全沒有必要。這個意義上講,我從來不推薦閱讀《深入C++對象模型》這樣的書。這并不能使你建立真正的面向?qū)ο蟮母拍?,反而容易誤導你這樣才是實現(xiàn)面向?qū)ο蟾拍畹奈ㄒ环椒ǎ赡苁亲钣行У囊环N而已)。
如果把“精通”定義為可以熟練地使用C++來構(gòu)造具有擴展性的框架或者應用,滿足時間和容量上的要求。上面回答問題的有不少人應該可以達到。
在如果把“精通”定義為使用基本的C++構(gòu)造來克服程序?qū)崿F(xiàn)中的種種必然或者偶然的復雜性,那么精通C++所需要理解的知識點并不是很多。最基本的,準確理解RAII概念并且可以有效使用之以及理解基于異常的錯誤管理是成為一個合格C++程序員的必要條件。樓上流出的幾乎所有的書都會涉及這兩個概念,但是深入介紹并且融會貫通的沒有。當Google的的C++規(guī)范還沒當作圣經(jīng)膜拜的時候,可以理解大多數(shù)的C++程序員并不合格。
并不是這些程序員不夠努力。C++程序員是最努力的程序員之一,因為C++的書太多了。C++的面也太廣了。這樣導致的一個后果就是大量的時間被浪費了,同時形成了一個無法精通C++的“神話”。
除非你是語言律師,你無需“精通”C++;
除非你的編譯器的實現(xiàn)者,你無需“精通”C++;
除非你是編譯器的測試者,你無需“精通”C++;
除非你是語言規(guī)范的修訂這,你無需“精通”C++;
計算機世界最強大的武器就是抽象。你要精通的是使用C++的構(gòu)造來模擬并且建立抽象。這里面涉及的更多是接口設計問題。
涉及到接口,不能不提到類型。我們都知道C++是靜態(tài)強類型的語言。但是這個強類型是不完全的。你能知道C++標準庫里的很多代碼都是為了修正這個不完全的強類型系統(tǒng)的輔助代碼嗎?C++的面向?qū)ο笾杏幸粋€概念叫做多態(tài)。據(jù)說是在運行時決定以指針或者引用調(diào)用的函數(shù)具體是那個,但是你知道所有這些都在編譯時就決定了嗎?理解類型系統(tǒng),并且熟悉其功用是進一步的要求。有了這個基礎,算法和容器分離的STL設計是自然而然的結(jié)果。
可組合性是組件的更高要求。這個深入了,你得到的是類似Monad的東西。C++的未來就是這個方向,因為這使得C++代碼可以極好地橫向擴展。
能依次掌握,理解,并且運用上述概念,并且能把這些概念映射到C++之中,雖然不能說是精通C++,也可以說是稀缺的C++程序員。
這樣的程序員,有多少,要多少!
【HuayongXu的回答(1票)】:
首先說,不能,精通一門語言要由內(nèi)而外,你必須知道你寫的代碼到底在機器中是怎樣去運行的,在內(nèi)存中是怎樣的狀態(tài),生命周期怎么樣,這樣你寫出來的代碼才是高效可用的,而不僅僅是能跑通沒bug。會用一門語言寫代碼僅僅是初級階段,而精通是需要對代碼架構(gòu)和問題長期的積累,不可能簡單的一年。
另外,你的目標應該在游戲開發(fā)上,這個不知道和你必須精通c++有什么關系?,F(xiàn)在的大公司開發(fā)游戲,一般都有專門的游戲引擎,甚至有專門的游戲開發(fā)語言,你精通c++也可能只是游戲開發(fā)的基礎,游戲中最難的應該是游戲的設計。
【shuangyang的回答(1票)】:
我也是軟件工程畢業(yè)的,我覺得,課本里的真重要,特別是操作系統(tǒng)和計算機原理,數(shù)據(jù)結(jié)構(gòu)和算法,這幾門課被選做考研項可不是白選的,基礎不好,做什么都白搭,肺腑之言。其他要用什么,對應的看看文檔也就會了。
【W(wǎng)izardZhang的回答(1票)】:
四個月就能熟練C++ 真的 但是精通C++ 真的很難
我們老師經(jīng)常跟我們說 連ppt這么簡單的東西都是不可能精通的
更別提C++這么傻大笨粗的東西了
還有 以后去面試的時候 千萬別說自己精通C++
C++有一些很偏的語法規(guī)則 鬧不好面試官就會故意考你這些。。
---------------------------------------
然后游戲方向要看你喜歡寫游戲還是游戲引擎
或者你實習的那個公司讓你寫什么
游戲引擎角度來講 學好C++沒問題 除此之外還要有一些圖形學和底層的知識
游戲的話 沒人用C++吧 開發(fā)成本高 周期長 需要的人才又不容易找
等你用C++寫個游戲出來 編譯一遍debug一遍 競爭對手估計都開發(fā)出5個了= =
【王照順的回答(3票)】:
上面都是大神,作為一個即將大四的學生,我說一下自己的觀點,什么事情都要講究一個興趣,興趣來了寫代碼和寫詩一樣快樂,上面說的劍宗和氣宗比較有意思,個人覺得不管學什么都應該由淺入深,底層要學好沒有錯,如果一上來就不管三七二十一讓你去了解opengl的知識,估計學了個把月,然后你會問,這玩意能干嘛?估計你就萎了,編程生涯over。。恩,應該是這樣,先簡單了解一下游戲制作過程,比如說先熟悉一款游戲引擎,如cocos2d-x,然后簡單開發(fā)一款小游戲,恩,然后大概知道游戲制作是怎么個回事,當然,這時候你可能只是處于調(diào)用一下人家api的情況,不過沒關系,當你發(fā)現(xiàn)你自己寫的游戲能在手機上跑了,興趣來了,多寫幾款類型不同的游戲,恩,大概像那么回事了,然后開始不滿足寫游戲了,這時候你可能會想了解一下引擎的原理了,然后開始找資料,學opengl等各種知識,個人覺得不管學什么都要循序漸進,由淺入深,這樣子才不會學什么都停留在表面,就好比如果你單單學一個cocos2dx如何使用,說白了哪天公司換個游戲引擎讓你去寫游戲,你發(fā)現(xiàn)又要重頭學起,到時候就心有余而力不足了。
順便說一句,樓上有些人過于激動了,大神們指點一下可以,不過指指點點就不好了。
【陳清揚的回答(1票)】:
Peter Norvig已經(jīng)寫過長文闡述了:
十年學會程序設計。
作者 Peter Norvig 是計算機科學家,Google 的研究總監(jiān)。在本文中,Peter Norvig會告訴你:為什么急功近利地學習軟件開發(fā)技術(shù)是沒效果滴?
為啥都想速成?
隨便逛一下書店,你會看到《7天學會Java》等諸如此類的N天甚至N小時學習Visual Basic、Windows、Internet的書。我用亞馬遜網(wǎng)站的搜索功能,出版年份選1992年以后,書名關鍵詞是:“天”、“自學”、“教你”,查到248個結(jié)果,前78個是計算機類圖書,第79個是《30天學孟加拉語》。我用“天”換成“小時”,結(jié)果更驚人,有多達253本書,前77本是計算機圖書,第78是《24小時自學語法句式》。在前200名中,96%是計算機的書。
結(jié)論就是:要么人們急于學習電腦,要么計算機比其他東西學起來要異常簡單。沒有任何書是關于幾天學習貝多芬或量子物理的,甚至連犬類裝扮都沒有。費雷森(Felleisen)等人在其著作《如何設計程序》中同意這個趨勢,其中提到:“壞設計很簡單,笨蛋才用21天學,盡管他們還是真傻。”
讓我們看看《三日學會C++》這個書名意味著什么:
研究人員(Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973))得出結(jié)論:想要在諸多領域達到職業(yè)水平需要十年,比如國際象棋,作曲,電報操作,繪畫,彈鋼琴,游泳,網(wǎng)球以及神經(jīng)心理學和拓撲學的研究。關鍵是精心練習,只是一遍一遍地重復是不夠的,必須挑戰(zhàn)恰好超越你能限的事情,嘗試并思考你的表現(xiàn),并自我矯正。周而復始。這并無捷徑!
4歲的音樂奇才莫扎特用了13年才能創(chuàng)作世界級的音樂。另外,披頭士樂隊似乎在1964年的埃德·蘇利文( Ed Sullivan show)演出中一炮而紅,但是他們自從1957年就在利物浦和漢堡的酒吧演出,在取得廣泛關注后,第一部重量級作品《佩珀軍士》(Sgt. Peppers)是在1967年發(fā)行。馬爾科姆·格拉德威爾(Malcolm Gladwell)撰文描述了一項針對柏林音樂學院學生的研究,他們被分為尖子,中等和不足三類,并被問到他們練琴的情況:
所有三組中的人,開始學琴的年齡大概相差無幾,五歲左右。在剛開始的幾年,所有人練習量也差不多,一周兩三個小時。自八歲開始,實質(zhì)性變化就有了。那些精英學生開始比其他人練習更多:九歲的時候一周六個小時,十二歲的時候一周八個小時,十四歲的時候一周十六個小時,一直到二十歲的時候一周要超過三十小時。截止到二十歲,在他們的生涯里已經(jīng)有總計一萬小時練琴。僅僅表現(xiàn)可以的那部分學生加起來是八千小時,那些未來的音樂老師有四千小時。
所以,更確切地說,一萬小時,而非十年,是個神奇之數(shù)。
薩繆爾·約翰遜(Samuel Johnson, 1709-1784)認為還需更長時間:“卓越乃一生之追求,而非其它”。
喬叟(Chaucer, 1340-1400)抱怨道"the lyf so short, the craft so long to lerne." (生之有限,學也無涯)。
希波克拉底(Hippocrates, c. 400BC)因這句話被世人所知:"ars longa, vita brevis"(譯注:拉丁語,意為“藝無盡,生有涯”),更長的版本是 "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile",翻譯成英文就是 "Life is short, (the) craft long, opportunity fleeting, experiment treacherous, judgment difficult." (生有涯,藝無盡,機遇瞬逝,踐行誤導,決斷不易)。
我的編程成功秘笈是:
所有上述這些,很難通過書本的學習來達到。我頭一個孩子出生時,我讀了所有的“如何做”(How To)系列的書籍,卻依然對育嬰毫無頭緒。30個月后,我第二個孩子出生,我還需要溫習一下那些書嗎?絕對不!相反,我完全可以參照個人經(jīng)驗,而結(jié)果相當有效。這更讓我確信:我的經(jīng)驗勝過那些專家們寫的上千頁文字。
弗雷德·布魯克斯(Fred Brooks)在《沒有銀彈》(No Silver Bullet)一書給出了尋找頂級設計師的三條建議:
此處假定有部分人已經(jīng)有成為偉大設計師的潛質(zhì),你所需的就是要誘導他們。艾倫·佩里斯(Alan Perlis)一針見血地指出:"假如人人都可以學雕刻,那就得教米開朗基羅如何不去干雕刻。對于偉大程序員,也是如此?!?/p>
所以,簡單地買一本Java書,你或許能找到些有用的東西,但絕不會讓你在24小時內(nèi)甚至24天抑或24月內(nèi),成為行家里手。
【漸修竹的回答(0票)】:
我也做了兩年c++了,也不敢說精通,我們老大做了至少8年,也沒敢說精通,我認識的很多大神,也都沒敢說精通。事實上我認識的很多大神都很謙虛,我跟他們學到了很多,大家的簡歷上也都寫著熟悉c++之類的字眼。上次公司招聘,來了個小伙子,工作兩年,簡歷上寫了精通c++,結(jié)果連公司的筆試都沒通過。請原諒我答不對題,我只是單純的看精通這個詞不太舒服。。。
【canneljiang的回答(0票)】:
關鍵是如何理解“精通”
我從大三開始,平均每天用一小時自己編碼,到大三結(jié)束要找暑期實習時,編碼水平比大部分同屆同學高,于是順利拿到實習機會以及以后也順利拿到offer
現(xiàn)在出來工作幾年,雖然水平比畢業(yè)時高很多,但也依然覺得很多東西不會,很多人比自己強
最后,我覺得對于大學生,如果有同學向你請教編碼問題,有同學請你幫他做編程的作業(yè),那也可以證明這個人比較強
原文地址:知乎