想從事遊戲開發,1 年內能精通 C++ 嗎,還需要學習什麼? | 知乎問答精選

 

A-A+

想從事遊戲開發,1 年內能精通 C++ 嗎,還需要學習什麼?

2018年08月27日 知乎問答精選 暫無評論 閱讀 15 ℃ 次

【MiloYip的回答(383票)】:

本人大約從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++。以下列舉一些過往曾流行的遊戲平台/類型:

  1. PC單機遊戲(Windows)
  2. PC網絡遊戲(Windows、Linux)
  3. 移動平台遊戲(J2ME、Symbian、Palm……)
  4. 家用遊戲機遊戲(PS1/2/3/4、XBox、Wii……)
  5. 掌上遊戲機遊戲(GB、GBA、NDS、PSP……)
  6. 網頁遊戲(HTML、Flash)
  7. 智能移動設備遊戲(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算是例外),這讓我們可以

  1. 方便調試遊戲
  2. 深度剖析、優化遊戲的性能
  3. 為引擎擴展新功能
  4. 修改現有引擎以適應項目所需

在專業的遊戲開發中,這些都是很常見的工作任務。所以,即使並非自研引擎,並使用腳本語言開發遊戲邏輯,也有很多機會需要使用C++。

最後,「還需學習什麼」是一個很難簡單回答的問題,因為遊戲開發涉及的知識面很廣。建議可參考本人譯作。

【毛星雲的回答(248票)】:

強烈反對 @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,間接地邀請,讓我知道有這個討論存在:)

總之,最後的最後,還是那個抉擇:

你是願意就這樣學點皮毛混口飯吃隨波逐流,還是成為真正的遊戲開發業界頂尖技術大牛,推動業界的發展,去改變世界?

在二十幾歲這段人生可塑性最強的時光裡,我們應該是滿懷信心,志向高遠,想讓自己與這個急功近利、日漸扭曲世界有所不同的吧。

【kubisoft的回答(135票)】:

題主本來問得很糊塗,不知道到底是問遊戲開發呢,還是如何學習c++。再說一遍結論吧,遊戲開發和c++的學習是兩個方向,做遊戲開發現在基本上不需要學習c++。以前做遊戲開發不得不用c++但是現在已經越來越少,以後還會更少,所以花大力氣去學c++對以後做遊戲開發沒有多大幫助。

有人提到了java, 其實java又不是用來做遊戲的,也從來不算腳本語言。

在此將c++和c#、javascript之類的腳本語言做一些簡單的對比吧,我的c++水平很低,遺漏之處難免,歡迎指正。

內存管理: c++的代碼容易產生隱藏的野指針等不容易發覺的內存管理問題,而且不一定會爆,調試有點困難。有人覺得這是水平不高的表現,心想,只要成對申請/釋放內存就可以了嘛!其實,我以前也是這麼想的,後來發現不是這樣...... 實際項目會非常複雜,很多時候到底誰應該擁有這個對象、誰應該負責申請誰應該負責釋放很難界定,而使用c++就必須做出這樣的界定,導致有的算法必須繞彎子,寫不少冗余代碼專門管理內存。

回調的時候用的閉包:這一點,用objective c就比c++方便很多了,回調的代碼可以跟調用的代碼緊挨在一起書寫,而用c++的時候不得不在類裡面另開方法,寫起來很蛋疼,名字難起還在其次,參數傳輸完全要靠成員變量或者void*, 然後強制類型轉換。這樣也能寫,但是可讀性就差了很多,維護困難。

unity給c#提供了協程,用起來跟線程差不多但是不用考慮加鎖解鎖等問題,真心方便。

幾個腳本語言大多有map, filter等等函數式編程的特性,考慮問題更加整體,代碼量會小很多,也更難出錯。

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

呵呵居然冒出一個高票長答案,嚇我一跳啊。不喜歡跟別人辯論,說下去沒完沒了啦,只是看到「倚老賣老」之類的人身攻擊的字樣還是很不開心吧。這也就算了,居然我被說成「壓搾IT民工」,這個真讓人傷心啊。我忍住,無視。後面寫的東西,還是給旁觀者看的吧,希望能多幫到一些人。

遊戲不僅是技術,要發現更大的世界的話要開闊視野的話就不要沉迷於c++的技術細節啊。要做出有創意的與眾不同的遊戲,也是要靠快速實現遊戲邏輯然後快速迭代,多跟策劃溝通啊。如何快呢?就要在能夠避開c++的地方盡量避開啊。

c++還是很有用的,比如cocos2d-x目前還是很依賴c++;效率不夠的地方也必須用c++來改寫,以進行優化。不過以後隨著硬件性能的提升,c++的應用範圍會萎縮很多,只專注c++的程序員很容易被孤立的,空間會越來越小。

----------

關於批評我c++水平的部分不予答覆。關於後面一部分,工程越大越體現出腳本的優勢,c++的代碼結構太容易混亂了。

c++更面向機器,更考慮運行效率,為了運行效率不得不犧牲可讀性,大部分腳本在這方面就強得多,犧牲了運行效率換取了可讀性。

至於java, java的開發效率同樣是被人罵得要死的,而且很少有人打算用java做遊戲吧,哪個引擎支持?

-------------------------以下是原答案--------------------

瀉藥。

想做遊戲開髮根本就不需要精通c++,根本就是南轅北轍。

你應該挑一個引擎熟悉起來,3d就用unity,2d就用cocos2d。unity支持c#和javascript,這兩門語言你可以任意學,只要能做出自己想要的遊戲;cocos2d也是支持javascript和lua,能避開c++就避開,c++的運行效率高而開發效率極低,學起來很累用起來更累,你要是專心學好了c++,作為老闆我還真不敢要呢,精通c++可能意味著過於重視運行效率而開發效率低,視野窄,業務溝通困難,工資要的很高很高也喜歡埋頭鑽研,但我要的東西就是很久出不來!

別聽他們的,我是工作十幾年做遊戲帶項目也都超過十年的人了,c++ objective c java javascript flash c# unreal unity cocos2d ruby on rails都用過,他們自己也只是學生,答題時還是自己想像的成分居多!

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

題主想好了是要學好c++還是學做遊戲,還是要做遊戲引擎。

做遊戲引擎可以參考另一個問題,手機黨不方便引用了,大體上是「遊戲公司開發自研引擎還有意義麼?」

以前做遊戲是只能用c++的,以前基本上不管做什麼都必須精通c/c++。現在不是,現在大部分領域都有更合適的語言可以選擇,做起來效率更高。

腳本不只是做gameplay,所有部分都可以用腳本去做,包括各種畫面特效。特效其實大部分是美工的活,程序員去認真考慮如何集成進來,如何在合適的地方調用,而不是寫代碼去取代美工。粒子特效,模型,貼圖,你不用腳本你用c++,除了多寫不少代碼、多去自己管理內存調試野指針之外又能得到什麼呢?渲染,那是shader,也不是c++。那麼AI,是否只能用c++了呢?當然不是,否則epic搞那個unrealscript幹嘛?

【王選易的回答(58票)】:

本來都不想更新了,但是其他人回答的都太不靠譜了,其他人都是在說怎麼當以個遊戲邏輯開發人員,但是你作為一個遊戲引擎開發人員,你不會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=

【伍一峰的回答(30票)】:

謝謝邀請:)

樓上如 @kubisoft 和 @大餅 前輩都答得很好。

這個問題有點像劍宗和氣宗。

遊戲開發就是耍劍,耍劍耍得好看了,觀眾就會賞錢。

學習氣宗,雖然能讓你握劍更加有力,耍上一天一夜也不喘氣,還能夾帶一些紫氣,但對於耍劍來說,無關好不好看。精通了C++,然後呢?和遊戲一點關係都沒有。因為耍劍不單講氣,最重要是講藝。

因此,自然是劍宗更加有效更加貼切。遊戲開發裡面有很多field specific的知識和技能,雖相似,但和軟件開發仍然不能一概而論。更別以為學好遊戲開發的知識容易,其實路途同樣艱難,只是難的地方不一樣。

那麼遊戲開發來說,劍宗和氣宗是不是就一定不兼容呢?也不是。有時候,你需要一些特別的機制或者特別的效果,前人可能沒有實現過,又無法從美術方面下手或者修改設計,就需要你有紮實的編程基礎來實現它。像遊戲引擎就是這樣,想要更漂亮的畫面、更好的運行效率、更方便的工作流程,才會推動引擎發展。但遊戲都沒做過,又怎知道現有技術不能支撐你所想所要呢?精通C++又解決了什麼問題呢?

舉個例子,今年IGF學生組的最佳遊戲,The Risk of Rain,我一看,那麼精緻的畫面、出色的手感、完善的機制,絕對是不簡單啊,一看開發者,竟是華盛頓大學機械專業和商學專業的兩位年輕人開發的,用的還是GameMaker。

從此我豁然開朗,遊戲開發就是耍劍,耍得好看才有飯吃,哪怕你華山掌門人。

------------------Update 1------------------

這個問題能引起那麼多不同意見,很有意思。

重新瀏覽了一遍大家的答案,主要有兩種見解。

一方是正好是我說的劍宗,主張一開始就以遊戲開發相關知識為主要學習方向;

另一方是氣宗,主張一開始以計算機底層知識為主要學習方向。

而C++則是這一題目裡兩方主張的矛盾的外在表現。

正如我答案的主體部分,我個人比較偏向劍宗。

一個原因是我沒有進過AAA的大公司,以往兩次實習都是在獨立遊戲公司,他們的氛圍都是以快速實現為主要目的。

所以我也耳濡目染,將實現視為遊戲開發當中最重要的東西。

因此我較為主張初學遊戲開發的話,也以實現為目的,比方說,選一款引擎,不斷地製作遊戲。在這一個過程當中,我們會不斷地接觸到新的知識:

一開始,我們在Update裡面寫代碼,我們接觸到了Game Loop,

我們創建角色圖像,接觸到Sprite的概念,

我們想用鍵盤控制角色移動,我們接觸到了Input System,

我們想讓角色跳躍,接觸到了Physics Engine的概念,等等等等...

現在我們對Game Loop有了瞭解,對Physics Engine有了瞭解,知道它們在遊戲中的作用,那麼對我們學習這些領域,是有莫大好處的。

正如最近關於很火的「設計模式」問答,現在的觀點主要是「你得遇到問題了,才真正懂得某一個模式的好處」。我覺得關於遊戲開發的學習,也是這樣的。

當然,我不會說哪位在座哪位老師的意見是錯的,因為遊戲開發本身就是一個新生學科,甚至連學科也稱不上,自然沒有對的和錯的路。

【徐奕成的回答(22票)】:

我覺得可以過來再更新一次了。

/*****************************************以下內容可以跳過*****************************************/

我說一下我做遊戲的歷程吧,二年級的時候(我出生於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:以上純屬個人觀點。

【vczh的回答(17票)】:

@kubisoft 說得對,想做遊戲開髮根本就不需要精通c++,根本就是南轅北轍。不過理由我跟他不一樣。就算你的志向是開發crysis這樣的遊戲,其實也只需要用到C++的一小部分就夠了。C++各種範式是發明來解決所有問題的,遊戲只是其中的冰山一角,你沒必要精通,沒必要學會C++的所有部分。

怎麼樣才算是精通 C++?

可以參考我的這個回答

【知乎用戶的回答(11票)】:

/* update */

儼然成了站隊帖了。

一句話,想做獨立遊戲,請看頂樓幾位;想以遊戲開發作為一份職業,請看我的和 @王選易的答案。

ps,題主問的是怎麼學C++,那麼多人在那空樹個靶子亂打是幾個意思?

////////////////////////////////////////////////////

/* update*/

被點了好多反對+沒有幫助麼o(╯□╰)o

之前手機上的,回答了題主第一個問題,現在試著回答下第二個問題。建議題主修改下問題,把精通改成掌握,免得問題被偏向題主不願看到的方向,「精通C++」一直都是一個很無聊的槽點,吐槽的人和被吐槽的人都很無聊。

翻譯一下,可能這樣問比較合適:

如何用一年的時間在C++天賦上加點?

如果說閱讀一遍《C++ Primer》是根節點的話,接下來的天賦點只有這樣兩種類型:

1. 繼續閱讀C++相關書籍

整明白《C++ Primer》,對C++有一個感性的認識之後,你可以去看侯捷翻譯/寫的幾本書比如Effective系列、《STL源碼剖析》,甚至對於沒什麼人用的MFC,你也可以看下《MFC九(shen)淺(ru)一(qian)深(chu)》,看下上個世紀的業界的C++程序員都是怎麼樣來用C++這門語言的。然後,可以看看《Inside C++ Object Model》,深入理解下C++。然後,對C++已經有了一個理性的認識之後,就可以再拿回來《C++ Primer》,順便再翻翻《Thinking In C++》,查查C++標準什麼的,仔細琢磨琢磨自己究竟能用C++幹什麼。至於模板元、FP什麼的,題主看完這些書自然會知道自己有沒有興趣接觸的。

2. 做項目

題主說想從事遊戲開發等工作,那我就大膽揣測一下,題主並不是想做一名獨立開發者,而是打算以死程作為職業生涯的第一份職業。

這樣,做項目的話就需要多一點針對性。想要有快速產出結果的項目,你可以先用D3D寫個小玩具,隨便復刻一下你記憶中的FC遊戲即可。想要接觸OOP,那就找幾個小夥伴,想辦法參加個軟件比賽,做個代碼量至少上萬的項目,語言不僅限於C++。這樣你才能不會覺得書上那些OOP啊泛型啊都是扯的有的沒的。做項目的時候寫代碼寫累了,翻翻《設計模式》之類的書。沒錯,我沒把讀《設計模式》算作「閱讀C++相關書籍」。

////////////////////////////////////////////////////

不能精通。

【Aaronluo的回答(8票)】:

反對目前第一@Kubisoft的說法,題主還是學生,別用壓搾it民工的想法來教導!題主可以從cocos2dx和unity3d開始學遊戲開發,但是,如果想一直做編程,請別忘了必須同時修煉c++, 因為它可以給你認識到真正的編程,讓你懂得更多計算機編程思想,以後就算不寫c++也可以迅速瞭解別的語言,別的工具的~而不會變成僅僅依靠IDE工具,隨便抄抄別人代碼,完成山寨程序的It民工

【WuJohnny的回答(6票)】:

我覺得學習c語言會更合適一些。可以避開c++的語法陷阱,又能夠快速地書寫程序瞭解指針,內存管理,io以及字符串的操作真諦。

通過6個月左右的c語言學習後,可以考慮學習一些面向對象的語言和lisp語系的語言,例如python和lua。這大概需要3個月左右的時間。這期間可以閱讀一些優秀的代碼,我推薦學習的源碼有兩個,一個是lua的源碼,一個是vim的源碼。這兩者都能提高你對計算機底層系統對內存管理,以及字符串處理的理解。並且對函數指針有一個深刻的認識。

最後3個月可以試試採用c和lua結合的方式去實現一個簡單功能的程序。

恭喜你,畢業了!你也許還不懂圖形渲染,不那麼理解gpu,不懂得網絡通訊,多線程,操作系統和其他計算機科學知識。只是初略對cpu,內存和文件存儲有所瞭解,但這已經不妨礙你成為一名合格的程序員甚至遊戲程序員。由於你的選擇,你避開了c++學習過程中的諸多陷阱,直接用一門簡單的系統級語言c快速地理解了計算機程序的真諦。這比你學會使用c++更重要,也為你今後的發展鋪下了堅實的基礎。

【JinHan的回答(2票)】:

1年肯定無法「精通」,但是如果認真學能讓你基本瞭解這玩意是個怎麼回事,而且最關鍵的,能夠幫助你進入遊戲的行業。

上面各種大神的回答,居然milo大神都炸出來了,雖然都很有道理但是我覺得答案依然因人而異。

這個東西沒有什麼答案,而更加取決於你想做什麼。

你想成為一個程序員,還是更想成為一個遊戲開發者,遊戲設計師或者,或是只是喜歡遊戲而想呆在遊戲的圈子裡。。。

遊戲是一個很大的產業,每個環節都是可以做到最大最強從而改變世界的,而且每個環節都是密不可分沒有什麼孰優孰劣的。

上面不少回答角度是從資深程序員的角度來說的,但我個人認為開發一個好的遊戲編程技術的重要性其實並不是最最重要的。美工,設定,故事背景,營銷和項目管理方面都是非常重要的環節,相比之下程序的重要性有的時候並沒有想像的那麼重要。 這也是為什麼很多人認為不懂編程也能做遊戲的原因。有的遊戲比如卡牌遊戲,甚至不需要任何程序。

並且另一方面,對於玩家來說,他們只知道這個遊戲是不是好玩,愛不愛玩,對於用的什麼引擎,

你c++寫的多厲害根本都是沒有直接影響的。比如說minecraft這樣的遊戲也沒有用到高大上的引擎,dota這樣風靡世界的遊戲當初也是用的魔獸爭霸編輯器那個自帶的腳本編輯器完成的。

另外涉及到遊戲引擎的方面,也並不是如某些人所說,直接用別人的引擎的人就沒有任何技術含量的。

第一,為自己的遊戲開發專用的遊戲引擎其實也並沒有那麼困難,只是涉及到的知識和需要的編程技術基礎比較高,而且通常沒有絕對的必要性,所以做的人不多,就好像你想蓋房子會自己去造吊車嗎。所以以上說國內遊戲開發不好是因為沒有好的吊車其實是不對的。

第二,往往大家把遊戲引擎和好的遊戲畫面聯繫在一起,但其實好的遊戲畫面並不由引擎決定,就好像photoshop是一個創建圖片的工具,但是有的人能用ps創造出驚人的作品,而有的人只能胡亂的塗鴉,同樣的工具而最後產生的效果也可能是完全不同的。現在無論什麼遊戲引擎大部分都是基於當前已有的dx或者opengl圖形渲染技術,就算某個引擎能夠同時渲染更多的多邊形,也不能代表其畫面效果好,因為這些其實是取決於使用引擎的藝術家和技術美工的。當然如果一個遊戲引擎的編輯工具非常的aritst friendly,對於畫面的提升幫助是很大的。(於是問題便從開發遊戲引擎變成了開發遊戲引擎編輯工具)

第三,如何巧妙的利用遊戲引擎也是一個非常有技術的事情,比如dota用的魔獸地圖編輯器,弱到連讓一個單位眩暈固定的秒數的功能都沒有,所有的眩暈都是要靠創建一個隱藏的單位向敵人丟出一個隱藏的風暴之錘來實現的,即便如此,別人還是做出了一個非常成功的遊戲。這樣巧妙的利用一個引擎的各種功能,從而達到自己的設計目的,也是非常有技術含量的一件事情。在我眼裡他們這些遊戲程序員的工作並沒有這些引擎程序員的工作低級,歧視他們的技術含量是可笑的。

另一方面,技術大部分的時候是因為需求而生的,比如我的遊戲需要一個特殊的效果從而能夠過表現某種藝術效果,但目前的市面上的引擎沒有這樣的功能(比如我想要我的遊戲裡任何東西都和果凍一樣,並且有物理的效果), 那麼這個時候熟練C++編程能力就變得非常的重要,因為涉及到修改原引擎功能的二次開發往往是使用c++的,並且對於各種優化的要求相當的高。(當然如果做不到,那麼巧妙的修改設計方案避開這是永遠存在的解決的辦法,當然結果也是這將使得遊戲變得平庸)

但是總的來說,花一年時間盡可能深入的學習c++是十分必要的,即使你今後不使用c++作為自己的編程工具。因為c++是目前大部分編程語言的基礎,瞭解這些細節對於今後快速掌握另一種語言也是非常有益的,我c++水平不是大神,但我也能做到在從來沒有看過任何java/c#的書籍的情況下看懂大段的java/C#代碼並且自己寫出一些常用的功能。

如果真的想從事遊戲行業,在學習c++之外更重要的是,你需要盡早開始著手做一個你想做的遊戲,無論多差先做出原形來,無論用什麼樣的辦法多落後的技術,在中間你還會學到無數編程之外的東西。編程這個東西,一旦編程技術達到一定的水平,剩下的在編程語言之外的思想才是更重要的,就好像有的人寫作的詞彙特別的美,語法特別的對,但是內容空洞無力的話也是沒有任何價值的。

【趙丙峰的回答(2票)】:

如果「精通」的含義是瞭解C++所有的方方面面,甚至編譯器實現細節。那麼肯定不會有這樣人的。並不是你不能成為這樣的人,而是完全沒有必要。這個意義上講,我從來不推薦閱讀《深入C++對像模型》這樣的書。這並不能使你建立真正的面向對象的概念,反而容易誤導你這樣才是實現面向對像概念的唯一方法(可能是最有效的一種而已)。

如果把「精通」定義為可以熟練地使用C++來構造具有擴展性的框架或者應用,滿足時間和容量上的要求。上面回答問題的有不少人應該可以達到。

在如果把「精通」定義為使用基本的C++構造來克服程序實現中的種種必然或者偶然的複雜性,那麼精通C++所需要理解的知識點並不是很多。最基本的,準確理解RAII概念並且可以有效使用之以及理解基於異常的錯誤管理是成為一個合格C++程序員的必要條件。樓上流出的幾乎所有的書都會涉及這兩個概念,但是深入介紹並且融會貫通的沒有。當Google的的C++規範還沒當作聖經膜拜的時候,可以理解大多數的C++程序員並不合格。

並不是這些程序員不夠努力。C++程序員是最努力的程序員之一,因為C++的書太多了。C++的面也太廣了。這樣導致的一個後果就是大量的時間被浪費了,同時形成了一個無法精通C++的「神話」。

除非你是語言律師,你無需「精通」C++;

除非你的編譯器的實現者,你無需「精通」C++;

除非你是編譯器的測試者,你無需「精通」C++;

除非你是語言規範的修訂這,你無需「精通」C++;

計算機世界最強大的武器就是抽像。你要精通的是使用C++的構造來模擬並且建立抽像。這裡面涉及的更多是接口設計問題。

涉及到接口,不能不提到類型。我們都知道C++是靜態強類型的語言。但是這個強類型是不完全的。你能知道C++標準庫裡的很多代碼都是為了修正這個不完全的強類型系統的輔助代碼嗎?C++的面向對像中有一個概念叫做多態。據說是在運行時決定以指針或者引用調用的函數具體是那個,但是你知道所有這些都在編譯時就決定了嗎?理解類型系統,並且熟悉其功用是進一步的要求。有了這個基礎,算法和容器分離的STL設計是自然而然的結果。

可組合性是組件的更高要求。這個深入了,你得到的是類似Monad的東西。C++的未來就是這個方向,因為這使得C++代碼可以極好地橫向擴展。

能依次掌握,理解,並且運用上述概念,並且能把這些概念映射到C++之中,雖然不能說是精通C++,也可以說是稀缺的C++程序員。

這樣的程序員,有多少,要多少!

【HuayongXu的回答(1票)】:

首先說,不能,精通一門語言要由內而外,你必須知道你寫的代碼到底在機器中是怎樣去運行的,在內存中是怎樣的狀態,生命週期怎麼樣,這樣你寫出來的代碼才是高效可用的,而不僅僅是能跑通沒bug。會用一門語言寫代碼僅僅是初級階段,而精通是需要對代碼架構和問題長期的積累,不可能簡單的一年。

另外,你的目標應該在遊戲開發上,這個不知道和你必須精通c++有什麼關係。現在的大公司開發遊戲,一般都有專門的遊戲引擎,甚至有專門的遊戲開發語言,你精通c++也可能只是遊戲開發的基礎,遊戲中最難的應該是遊戲的設計。

【shuangyang的回答(1票)】:

我也是軟件工程畢業的,我覺得,課本裡的真重要,特別是操作系統和計算機原理,數據結構和算法,這幾門課被選做考研項可不是白選的,基礎不好,做什麼都白搭,肺腑之言。其他要用什麼,對應的看看文檔也就會了。

【WizardZhang的回答(1票)】:

四個月就能熟練C++ 真的 但是精通C++ 真的很難

我們老師經常跟我們說 連ppt這麼簡單的東西都是不可能精通的

更別提C++這麼傻大笨粗的東西了

還有 以後去面試的時候 千萬別說自己精通C++

C++有一些很偏的語法規則 鬧不好面試官就會故意考你這些。。

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

然後遊戲方向要看你喜歡寫遊戲還是遊戲引擎

或者你實習的那個公司讓你寫什麼

遊戲引擎角度來講 學好C++沒問題 除此之外還要有一些圖形學和底層的知識

遊戲的話 沒人用C++吧 開發成本高 週期長 需要的人才又不容易找

等你用C++寫個遊戲出來 編譯一遍debug一遍 競爭對手估計都開發出5個了= =

【王照順的回答(3票)】:

上面都是大神,作為一個即將大四的學生,我說一下自己的觀點,什麼事情都要講究一個興趣,興趣來了寫代碼和寫詩一樣快樂,上面說的劍宗和氣宗比較有意思,個人覺得不管學什麼都應該由淺入深,底層要學好沒有錯,如果一上來就不管三七二十一讓你去瞭解opengl的知識,估計學了個把月,然後你會問,這玩意能幹嘛?估計你就萎了,編程生涯over。。嗯,應該是這樣,先簡單瞭解一下遊戲製作過程,比如說先熟悉一款遊戲引擎,如cocos2d-x,然後簡單開發一款小遊戲,嗯,然後大概知道遊戲製作是怎麼個回事,當然,這時候你可能只是處於調用一下人家api的情況,不過沒關係,當你發現你自己寫的遊戲能在手機上跑了,興趣來了,多寫幾款類型不同的遊戲,嗯,大概像那麼回事了,然後開始不滿足寫遊戲了,這時候你可能會想瞭解一下引擎的原理了,然後開始找資料,學opengl等各種知識,個人覺得不管學什麼都要循序漸進,由淺入深,這樣子才不會學什麼都停留在表面,就好比如果你單單學一個cocos2dx如何使用,說白了哪天公司換個遊戲引擎讓你去寫遊戲,你發現又要重頭學起,到時候就心有餘而力不足了。

順便說一句,樓上有些人過於激動了,大神們指點一下可以,不過指指點點就不好了。

【陳清揚的回答(1票)】:

Peter Norvig已經寫過長文闡述了:

十年學會程序設計。

作者 Peter Norvig 是計算機科學家,Google 的研究總監。在本文中,Peter Norvig會告訴你:為什麼急功近利地學習軟件開發技術是沒效果滴?

為啥都想速成?

隨便逛一下書店,你會看到《7天學會Java》等諸如此類的N天甚至N小時學習Visual Basic、Windows、Internet的書。我用亞馬遜網站的搜索功能,出版年份選1992年以後,書名關鍵詞是:「天」、「自學」、「教你」,查到248個結果,前78個是計算機類圖書,第79個是《30天學孟加拉語》。我用「天」換成「小時」,結果更驚人,有多達253本書,前77本是計算機圖書,第78是《24小時自學語法句式》。在前200名中,96%是計算機的書。

結論就是:要麼人們急於學習電腦,要麼計算機比其他東西學起來要異常簡單。沒有任何書是關於幾天學習貝多芬或量子物理的,甚至連犬類裝扮都沒有。費雷森(Felleisen)等人在其著作《如何設計程序》中同意這個趨勢,其中提到:「壞設計很簡單,笨蛋才用21天學,儘管他們還是真傻。」

讓我們看看《三日學會C++》這個書名意味著什麼:

  • 學習:三天內你可能沒有時間寫出有意義的程序,或者從中積累經驗。你不可能有時間去跟職業編程者一起去理解在C++環境下的狀況。簡而言之,你沒有充足的時間學很多。所以這本書只能說膚淺的知識。正如亞歷山大·波普(Alexander Pope)所言:一知半解是很危險的。
  • C++:三天內你可能學會C++的句法(如果你已經瞭解其他的語言),但你還不會使用它。打個比方,假如你是個Basic程序員,你可能寫出Basic風格的C++程序,而無法理解C++的真實好處。那要點是什麼?艾倫·佩裡斯(Alan Perlis)曾經說過:「一門不能影響你編程觀點的語言不足學的。」有可能你學了一點點C++(或者諸如Javascript、Flex之類),因為你需要和現成的工具接口以完成手頭的任務。這種情況下,你不是在學習如何編程,只是在學習如何完成任務。
  • 三日:不幸地是,這遠遠不夠,下一部分會詳細講。

如何用十年掌握編程

研究人員(Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973))得出結論:想要在諸多領域達到職業水平需要十年,比如國際象棋,作曲,電報操作,繪畫,彈鋼琴,游泳,網球以及神經心理學和拓撲學的研究。關鍵是精心練習,只是一遍一遍地重複是不夠的,必須挑戰恰好超越你能限的事情,嘗試並思考你的表現,並自我矯正。週而復始。這並無捷徑!

4歲的音樂奇才莫扎特用了13年才能創作世界級的音樂。另外,披頭士樂隊似乎在1964年的埃德·蘇利文( Ed Sullivan show)演出中一炮而紅,但是他們自從1957年就在利物浦和漢堡的酒吧演出,在取得廣泛關注後,第一部重量級作品《佩珀軍士》(Sgt. Peppers)是在1967年發行。馬爾科姆·格拉德威爾(Malcolm Gladwell)撰文描述了一項針對柏林音樂學院學生的研究,他們被分為尖子,中等和不足三類,並被問到他們練琴的情況:

所有三組中的人,開始學琴的年齡大概相差無幾,五歲左右。在剛開始的幾年,所有人練習量也差不多,一周兩三個小時。自八歲開始,實質性變化就有了。那些精英學生開始比其他人練習更多:九歲的時候一週六個小時,十二歲的時候一周八個小時,十四歲的時候一周十六個小時,一直到二十歲的時候一周要超過三十小時。截止到二十歲,在他們的生涯裡已經有總計一萬小時練琴。僅僅表現可以的那部分學生加起來是八千小時,那些未來的音樂老師有四千小時。

所以,更確切地說,一萬小時,而非十年,是個神奇之數。

薩繆爾·約翰遜(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." (生有涯,藝無盡,機遇瞬逝,踐行誤導,決斷不易)。

我的編程成功秘笈是:

  • 首先要對編程感興趣,能從編程中得到樂趣。一定要讓它足夠有趣,因為你要保持你的興趣長達十年。
  • 與別的程序員交流;閱讀別人的代碼——這比看任何書或參加培訓課都重要。
  • 實踐。最好的學習乃實踐。俗話說:「編程的至高境界一定要通過充分的實踐才能達到,而個人的能力可通過不懈努力獲得顯著提升。」 (p. 366) 「最有效率的學習需要明確的目標,適當的難度,知識回饋,並容許重複或修正錯誤。」 (p. 20-21) 《實踐認知:每日的思維、數學及文化》(Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life) 在這方面可做參考。
  • 如果你願意,花四年學習大學課程(或者再加上讀研)。這將給你贏得某些工作機會,並給予你在該領域的深層見解。但如果你不喜歡學校的學習,你同樣可以在工作中獲得相似的經驗。無論如何,單靠書本是遠遠不夠的。「學習計算機科學不會讓你成為編程專家,如同學習繪畫和色彩理論不會讓你成為畫家一樣」。這是埃裡克·雷蒙德(Eric Raymond)說的,他是《新黑客字典》(The New Hacker's Dictionary)的作者。我僱用過的最優秀程序員,只有高中文憑。但他開發過許多偉大軟件,有自己的新聞組,通過公司認股賺的錢就讓他買下了自己的夜店。
  • 和其他程序員一起參與工程項目。在某些項目中擔當最優秀程序員,在另一些項目中充當最差勁程序員。充當領頭羊的時候,你要測試你領導一項工程的能力,並用你的視野來激發他人;如果在項目組中墊底,就應該學習其它牛人在做些啥,以及他們不喜歡做的(看他們把哪些活讓給你做)。
  • 繼續別人的工程項目。去理解先前程序員寫的程序。學習如何理解並解決先前程序員沒有考慮到的問題。思考你的程序該如何設計以便讓之後的程序員更容易維護。
  • 至少學6種程序語言。其中包括一種支持類抽像的(Java和C++),一種支持函數抽像的(如Lisp或ML),一種支持語義抽像的(Lisp),一種支援聲明規範的(如Prolog或C++模板),還有一種支援協程的(Icon或Scheme),另外一種支持並發的(Sisal)。
  • 記住,在「計算機科學」裡有「計算機」一詞。理解計算機執行你的代碼的時候花費的時間。比如:從內存中取一個字(考慮有無緩存未命中情形),連續從磁盤讀字,或者在磁盤中定位。
  • 參加語言標準化工作。這可能是有關 ANSI C++ 委員會,也可能是決定你編碼風格是兩格縮進或四格縮進。無論如何,你要知道其他人對語言的喜好程度,有時還要想想他們為什麼喜歡這樣。
  • 知道自己應該在何時脫身於語言標準化。

所有上述這些,很難通過書本的學習來達到。我頭一個孩子出生時,我讀了所有的「如何做」(How To)系列的書籍,卻依然對育嬰毫無頭緒。30個月後,我第二個孩子出生,我還需要溫習一下那些書嗎?絕對不!相反,我完全可以參照個人經驗,而結果相當有效。這更讓我確信:我的經驗勝過那些專家們寫的上千頁文字。

弗雷德·布魯克斯(Fred Brooks)在《沒有銀彈》(No Silver Bullet)一書給出了尋找頂級設計師的三條建議:

  • 盡早系統地識別出頂級設計師。
  • 分配一個人作為其職業規劃的導師。
  • 給予機遇讓成長中的設計師互相磨礪。

此處假定有部分人已經有成為偉大設計師的潛質,你所需的就是要誘導他們。艾倫·佩裡斯(Alan Perlis)一針見血地指出:"假如人人都可以學雕刻,那就得教米開朗基羅如何不去幹雕刻。對於偉大程序員,也是如此。」

所以,簡單地買一本Java書,你或許能找到些有用的東西,但絕不會讓你在24小時內甚至24天抑或24月內,成為行家裡手。

【漸修竹的回答(0票)】:

我也做了兩年c++了,也不敢說精通,我們老大做了至少8年,也沒敢說精通,我認識的很多大神,也都沒敢說精通。事實上我認識的很多大神都很謙虛,我跟他們學到了很多,大家的簡歷上也都寫著熟悉c++之類的字眼。上次公司招聘,來了個小伙子,工作兩年,簡歷上寫了精通c++,結果連公司的筆試都沒通過。請原諒我答不對題,我只是單純的看精通這個詞不太舒服。。。

【canneljiang的回答(0票)】:

關鍵是如何理解「精通」

我從大三開始,平均每天用一小時自己編碼,到大三結束要找暑期實習時,編碼水平比大部分同屆同學高,於是順利拿到實習機會以及以後也順利拿到offer

現在出來工作幾年,雖然水平比畢業時高很多,但也依然覺得很多東西不會,很多人比自己強

最後,我覺得對於大學生,如果有同學向你請教編碼問題,有同學請你幫他做編程的作業,那也可以證明這個人比較強

標籤:-遊戲開發 -遊戲編程 -編程入門


相關資源:





給我留言