騰訊/網易/完美/字節 游戲客戶端/游戲引擎(2020暑期實習崗) 綜合筆/面經


前言

  在寫筆/面經之前還是先說一下最近招聘的感受

  先說明一下我自己整個的應聘的時間跨度是從3月中旬到4月中旬,我是從3月9號陸續開始投遞簡歷,直到四月初沒正式確定前還在投遞新簡歷,除了騰訊/網易/完美/字節外還投遞了不少游戲和非游戲互聯網企業,也包括華為和大疆等企業,大大小小包括了十幾家。畢竟是人生第一次找工作的過程,以前從來沒有自己筆試和面試過,所以並不清楚自己能去哪里。但除了這四個企業之外的其他企業都筆試面試地比較晚或是沒有給我面試機會。(對於找實習的學生應聘時間問題,我問過很多前輩,大抵上是認為不要過早也不要太晚,盡量中前期開始投遞提前批或一批 [特別招聘計划除外]。一是考慮自己的筆面試的復習情況不可能很早就准備完善,二是越早投遞,企業HC越多,相對越容易)

  今年實習和春招的情況很特殊,所以各類企業要么沒有暑期實習,要么變相不招人,再比如有的企業這種要么只招立馬能去長期實習,要么拖得比較久。百年一遇的情況大家也都明白,但游戲行業今年還算景氣,也是很不容易,但轉正情況就另外一說了。

  另外,AI崗今年愈發艱難了,大廠尤是,周圍不少同學,師兄找實習還是非常困難的,當然並非是找不到(拿過AI競賽獎項、一區或頂會的近幾年會有很大優勢)。所以后來的研究生還是要注意考慮這些問題,如果自身能力不夠過硬,或是找的團隊科研能力不夠強,請慎重考慮選AI方向,不要被自媒體和各類說辭帶偏了自己的意向。(希望大家能讀研時能找到自己真正感興趣或是真正能幫助自己的方向)

  需要說明的是我沒有做錄音,具體哪家公司提到了什么已經記不太清了,所以我筆/面經都是按點說的,沒有按照網上常見的面經排版。而且每個人面試的問題其實還要看面試官和具體情況,說不定你提到了什么東西,面試官就按照這一點繼續深挖了,也或許面試官認為你的簡歷不錯,問的問題偏向你的項目中的具體問題展開。


 

筆經(客戶端+引擎)

  游戲客戶端這個方向不論客戶端還是引擎,大體上前置的基礎筆試題都是以C++基礎,STL為主,偶爾參雜一些數據結構和算法,整體而言對OS、數據庫、網絡、編譯原理等等其他知識要求不高,甚至幾乎不考。這部分分值一般不高。

  重頭戲一般是編程題,簡答題,大分值都在這邊。

  編程題:基本算是ACM入門+進階級別,例如基礎的模擬題、搜索題、數學題、並查集等;稍難一些就是DP相關,以及部分變種題,比如有一次我碰到了一個樹狀DP,當場甚至沒想出來。某些企業會結合游戲相關給你出一些比如渲染物先后排序問題和骨骼運動等算法題(網易雷火引擎實習 4小時),這類題一般都是要求你看懂題然后進行模擬,代碼可能相對長一點(如果你本身就會相關的骨骼動畫、四元數和透明度計算算法等等,那你看懂題會很順利)。

  簡答題:這些題往往會結合游戲背景給你出一些簡單的游戲架構設計題,或是功能設計題,某些不考編程題的企業會在這部分放入算法題讓你寫偽代碼和思路。比如設計rouguelike游戲的隨機地圖(固定場景內生成多個隨機可達的房間,要求出入口盡可能遠),設計簡易的游戲組隊系統等等。

  PS:多嘴一句,對於不少人而言,筆試很可能只是參考,如果你的簡歷很好,那你即便筆試0分也是可以收到面試的。當然前提是你的簡歷夠出色,以至於HR和面試官對你感興趣。相反,即便你筆試滿分,如果崗位需求過高,HC不夠了,或者部門對你的簡歷沒有興趣,也會直接把你篩掉。(我之前投阿里的計算機圖形學,筆試題滿分,照樣沒有人找我面試)因此,對於很多私企而言,筆試只是一種手段,不要太過在意。

 


 

面經(客戶端+引擎)

  面經的部分,具體問題我不分一面二面三面,因為各企業對不同階段的面試要求不同,比如有的企業不管哪一面,都會很詳細地問你C++基礎,圖形技術,游戲技術等等,但大部分企業是前面一部分面試偏重C++基礎,簡歷印象面試,了解情況等等,后部分偏重對你簡歷中提到的項目,或者是實際工作時,可能會遇到的引擎或項目技術相關的問題進行提問。 

 

   1.   面試過程(四個)

  騰訊

  提前批沒有筆試,開始我面的是引擎崗.

  第一個部門一面對我印象比較好,二面問了一個算法題和場景題(我后面會提到),答得不好,過了幾天雖然到HR面了,但還沒面HR就被從HR面的狀態換成初試了(我問了其他HR,回復我是部門內部調整,給我換了部門,但是我估計是HC不夠了).

  第二個部門也是引擎,但是可能招滿了,壓根沒看應聘信息,半個月了都沒有面我,狀態都是初試的狀態,於是我讓HR把這個部門的投遞撤掉了。后面換成客戶端開發重新進大池子等部門撈我…(…心酸)

  第三個部門游戲項目組的面試官第二天跟我約了一面,這次的部門效率感人…(可能要到截止日期了)。

  一面面完對我印象不錯,當天改狀態,下一個工作日二面。

  二面問我自己的課題項目項目問了一個小時,非常之具體,包括改進問題,為什么不做各自改進等等都問得很清楚,二面貌似也是當天改狀態HR面,然后約了第二天早上面HR,三天后OC。

 

      網易雷火

  引擎崗,網易的時間線很長,因為沒有提前批,只有一批次,所以我是三月就投了簡歷,三月底才收到筆試通知。

  筆試大概4道編程題4小時A掉前3道,最后一道思路有點問題。四月初面試,陸續一面二面三面。

  一面一開始就擺出好幾道選擇填空讓我當場做,一道道看,然后后面基本的C++底層,多態,然后面試官開始往深了挖我的C++內存結構(前面基礎題我其實很多沒答上來,dx也沒寫過,旋轉矩陣逆推也沒推出來...可能是面試官覺得我內存結構這一邊答得比較有意思讓我過了…)。

  二面(一面當天下午),面試官一看就是閱游戲無數,開頭就跟我聊玩過什么游戲什么的,聊家常(因為網易雷火郵件招聘系統貌似出了點問題,好幾個人沒收到面試通知,包括我,后面是HR打電話通知我面試的),然后開始聊我這邊的項目,問我對游戲技術,引擎的了解什么的。

  三面估計是部門主管,一開口就是老領導了…跟我聊了國內游戲發展現狀,然后教育了我可以用我的方向來做游戲里面的一些東西,聊了很久…最后快結束的時候,突然開始面我數學算法題(后面說)和C++底層,問C++內存結構的,最后還問了我offer情況。

  再過了幾天就HR了,和騰訊同一天面(晚騰訊一個半小時…),HR這里問的比較不一樣的地方是問我遇到過最大的困難和難題是什么,怎么解決的,以及問了我其他的offer的情況。三天后OC(比騰訊晚一個半小時,這倆企業真准時…)

 

  完美

  提前批,我投的客戶端,不過我稍微提下…我是面試后才知道完美世界是20年暑期實習和21屆校招一起招的,意思就是你投的實習面的就是校招,過了明年就是他們的人了…(Hmmm…我該怎么說,這事情是不是該提前在招聘的時候說一下)。

  筆試比較正常,大概一個半小時,有選擇和填空,編程題很簡單,4道題,A掉3.875道。

  一面很注重基礎,老樣子C++基礎,STL,不一樣的是這個部門的面試官會讓你手寫渲染代碼(比如phong模型),我寫得不好…當時沒復習,一臉懵逼,於是蒙蔽地說了一下我印象中的模型計算。

  二面除了面少部分C++底層,主要是問我的項目和ACM競賽的經歷,遇到過什么算法的難題,怎么解決,該怎么在競賽上進步等等。還有一點不一樣的是,二面面試官會把企業工作編程的時候實際遇到的各種調bug,團隊協作問題拿出來問我會怎么從代碼上進行解決。二面面試官很有意思,實力很強,會幫你把你說錯的地方或者算法講漏的地方,甚至以前遇到的難題解決思路的漏洞都給你找出來,然后比較委婉地告訴你。應該是我遇到的印象最好的面試官了。大概是過了幾天就給了HRoc(比較早)。

 

  字節跳動

  引擎崗,說實話,字節游戲這邊是新部門,去年才開始發力自研游戲,所以每個人見解不一樣吧,工資給的雖然高,但還是需要多考慮一下。

  筆試都是編程,4道題,前三道A掉,最后一道10% case水過…。過幾天就提示筆試過了,准備面試,但字節面試周期賊長,一面結束下周再面,二面結束,也是下周才HR面給OC。

  一面考察C++基礎和底層,但不會很深,然后給兩道簡單的搜索算法題給我敲,第一題先敲完之后,可能面試官覺得我敲得太慢了,第二題就直接口述思路,都是DFS結束,第一題稍微利用到了棧。

  二面面試考查范圍比較大一點,但都不深,后面考我前序遍歷非遞歸手寫,開始搞成了中序遍歷 (中序更復雜一點),寫完才意識到要寫前序…反正順利寫出來了,測試也過了。其中有個小插曲是我回答sizeof的時候沒有注意”\078”這種八進制轉義字符的問題,答錯了…好尷尬…。但幸運的是,過了一周收到HROC了。

 

    具體的問題我就在下面分類列舉了,沒有按企業來分,因為時間跨度太長,有一些問題哪些企業問到了我也不太記得了,甚至有些細節題我可能也忘了。我盡量回憶出比較關鍵的題目和所屬企業。

  

  2.   C++基礎、STL和底層部分

  1. const的作用(完美一面)
  2. static的作用(完美一面及其他),全局常量和變量如何使得整個程序可見(完美二面)
  3. new和malloc的區別,以及new的優點,能說多少說多少(完美一面)
  4. this指針
  5. inline函數和宏的區別,inline是否是在任何時候都展開代碼(完美一面)
  6. extern “C”的作用(字節二面)
  7. 多態的底層實現,緊接着可能會問虛函數的內存布局,包含虛函數的對象本身的內存大小問題,多繼承問題等(幾乎所有企業都面到了)
  8. 虛函數的默認參數問題,以及為什么會這樣,默認參數具體存在哪個C++分區等?(雷火一、三面)
  9. 虛析構函數的作用(多數企業都問過)
  10. C++的引用是怎么實現的,為什么要這樣?(雷火三面)
  11. C++ STL中存在的陷阱,你碰到過哪些?(騰訊引擎一面)
  12. C++ 11的新特性有哪些(騰訊引擎一面)
  13. C++11智能指針(騰訊、完美面到了,其中完美一面要求手寫實現一個shared_ptr)
  14. C++在什么情況下會發生拷貝?(莉莉絲一面)
  15. C++內存分區有哪些(企業面C++底層都會隱含涉及到這一點,完美一面直接問了)
  16. sizeof和strlen的區別,以及字符串的sizoef計算中\0和八進制轉義字符問題,例如sizeof(“123\04567”)。引申有十六進制轉義字符問題(字節二面)
  17. C++右值引用的作用,右值是什么等等(騰訊客戶端一面,從另一個問題挖出來的問題)
  18. STL中vector的實現原理,map的實現原理(有序和無序)(大部分企業都面到了)
  19. C++所有的構造函數包括哪些?(騰訊客戶端)
  20. 用內存拷貝的方式直接拷貝vector本身會發生什么?會存在什么陷阱?(騰訊引擎)
  21. 深拷貝、淺拷貝的區別

 

  3.   數據結構

  1. hash表的構造、插入,查詢和刪除具體各有哪些方式?(雷火三面,莉莉絲,其中要注意刪除的實現)
  2. map中紅黑樹的實現?以及對紅黑樹的了解? 無序map和有序map的差別、優缺點?自定義數據結構怎么使用map?(莉莉絲一面)
  3. 接着第2題,如果給定很多用戶,其中key值可能包含地區、單位等兩到三個。如果讓你來設計,你會采用紅黑樹這種方式還是hash表這種方式來進行存儲查詢,為什么?(莉莉絲一面)

 

  4.   圖形圖像、數學基礎、引擎相關

  1. 齊次變換矩陣逆推,知道M(4*4的矩陣),求M=RST中的R、S、T三個矩陣具體是多少?(雷火一面)
  2. 光的反射計算公式?(雷火一面)
  3. 一張1024*2048的圖片大小是多大?(字節二面)
  4. 是否寫過引擎?對游戲引擎的了解?一個游戲引擎應該有什么樣的功能,在游戲開發過程中承擔什么樣的責任?(不少引擎崗面試都問到了類似問題,因為我沒有實際寫過引擎,所以大部分沒有和我聊過於具體的技術)
  5. 抗鋸齒的方法?多重采樣的實現?怎么找邊緣(雷火二面)
  6. 知道哪些幾何相關的算法?網格處理在游戲領域的運用具體可以做哪些事情?(騰訊引擎二面,雷火三面,雷火這里聊得很詳細)
  7. 渲染管線的過程(騰訊引擎,字節,雷火)
  8. 渲染流水線中進行裁剪的地方有哪些?視錐體裁剪、背面剔除具體是怎么做的?背面剔除的實現方法?提前剔除應該怎么做?(雷火三面,答得不好,被教育要多看看相關的基礎知識)
  9. 怎樣做提前深度剔除?(雷火三面)
  10. 分離軸算法的計算過程?凸多邊形如何利用分離軸進行判交,需要多少個軸?(莉莉絲)
  11. 了解PBR么?有什么實現方法?(騰訊引擎一面)
  12. 局部光照模型有哪些?全局光照方程要怎么計算?(騰訊引擎一面)
  13. OpenGL的可編程管線流程?幾何shader的作用,為什么一開始就從應用程序輸入到幾何shader,而是頂點shader?還知道哪些shader?(完美一面)
  14. 了解哪些后處理技術?
  15. OpenGL ES了解多少?

 

  5.   算法和編程相關(包括思路題和手撕代碼題)

  1. (a^n) % 10,怎么實現,a和n都可以很大。(雷火三面,最快的是O(1),如果不知道可以網上找一下題解)
  2. 一個二維空間,x和y軸都是10000以內的正整數,其中有2n個隨機頂點,求一個圓C。使得圓C內有n個頂點,圓外n個頂點,注意圓周上不能有點。(騰訊引擎二面,注意要盡可能地快,且保證算法收斂,並且不受浮點數誤差影響)
  3. 場景題,一個地形網格(三維地形,有高有低,其中xy方向上為固定尺寸,每個網格都是一個1*1的單位正方形)。有一個camera在某一個位置,如何優化/簡化網格,實現快速地形渲染,並保證渲染后屏幕像素誤差不超過一個像素。(騰訊引擎二面)
  4. 有一個不包含重復數字的數組,比如A=[2,3,5,7], 有一個數字x,比如x=7,編程求解有多少組該數組中數字的和為x,並輸出這些數組,數組中的數字可以重復使用,例如上例中,{2, 2, 3}, {2, 5} {7}這三組數據將被輸出(字節一面)
  5. 有一個二維字符數組map,有一個單詞word,查找map中是否存在word單詞,類似成語接龍,該單詞可以呈上下左右的接龍形式。例如有一個單詞zoo,字符數組如下(字節一面):

w     e    z     o

t      w    o    q

w     w    o    u

s      g    s     s

        6. 前序遍歷的非遞歸實現,寫代碼(字節二面)

        7. 單例模式的實現,寫代碼(雷火三面)

 

  6.    項目、開放題相關

  這里稍微說一下項目的問題,企業看簡歷還是非常看重項目的,如果項目夠好或者夠吸引面試官,很多到了項目面的時候,可能就不會談太多C++和算法題,而是問你自己項目中的很多引申問題以及為什么要采取這樣的技術,不去做那樣的事情等等,這種時候因為都是自己做過的,所以會更容易回答。現在回憶到的游戲或項目較通用的問題如下

 

  1. 團隊組成,項目中負責的是什么?遇到哪些難題?怎么解決的?(這種HR問得比較多)
  2. 如果你接手一組代碼,可能被很多人修改過,組織比較混亂,你需要在很短的時間內把一組代碼整理好,並組織成可讀性更高的代碼,你會怎么做?(完美二面)
  3. 怎樣在保護一段代碼的情況下,為它添加新的功能?(完美二面,設計模式相關)
  4. 有若干的人會用你自己寫的內存池(因為我前面回答的時候提到了內存池的多態寫法),但是其中有一個人寫的代碼沒有釋放資源,長時間會導致客戶端崩掉,你要怎么從代碼的層面修改代碼以發現到底是誰的代碼/哪一段代碼出現了這種沒有釋放資源的問題?盡可能以自動化的方法自動檢查?(完美二面)
  5. 你的項目中有什么現實的需求,可以做到哪些事情?(我的屬於應用研究課題,大部分企業都問到了)
  6. 你用的網格簡化算法具體是怎么實現的?有些特征不保持/形態丟失的情況怎么辦?(騰訊客戶端二面)
  7. 玩過哪些游戲?看的書和論文有哪些?平時是怎么學習的?(大部分企業都問到了)
  8. 你相比其他人在引擎崗上有什么優勢?(因為我沒寫過引擎,所以騰訊引擎一面問了我,我回答是幾何優化,所以二面問了我幾何優化,但是我沒答好,所以即便二面被掛我其實也是知道為啥的,這就是自己挖的坑,2333,不過居然二面也過了就比較神奇了)

 

 


 

后記

  其實我最后還是選了騰訊客戶端,主要的考量是引擎從業人數過少,而且面了這么多次之后,我大概也知道自己對引擎這個崗還是缺乏一些實際的經驗。因為我本身是做數字幾何處理的,因此自己的項目和課題都沒有過多關注渲染,也沒有實際用引擎寫過游戲項目,因此直接上引擎崗會很吃虧。因為就目前的國內游戲行業來說,大部分情況下引擎崗也不需要那么多的較新的網格處理技術,而引擎開發的各個討論區都是以渲染為主。這一點雷火那邊的面試官也和我聊過很久,甚至也直接指出了國內游戲和國外3A的差距,很有意思。但不管怎樣,這不是短期內能解決的。

  但工作是工作,興趣是興趣,估計不管是引擎開發還是客戶端開發,工作許久之后還是會厭倦的。有個已經工作的同學告訴我,如果我像他一樣超長加班到12點,每日如此,工作兩年以上,會很討厭開發的。(我其實很認同這句話,但我也只能盡量不這樣工作,同時盡可能對游戲開發保持一份熱忱)

  如果一定要做一個總結,筆試部分,不管怎樣都逃不過刷題,至少leetcode級別的題目肯定都是要做不少的,這對面試也很有幫助,反復練習,就會得心應手。面試部分,如果臨近面試招聘,還是盡可能地直接看面經總結自己的回答,加上自己的理解,遇到C++底層的問題,偶爾可以嘗試直接用反匯編的方式看看匯編代碼是如何實現的(特別是指針、地址和內存的部分)。如果時間還比較長,還是要盡可能在你做的項目里面活用語法、數據結構,盡可能多地使用C++11-20的新特性,盡可能多地嘗試一些必要的設計模式,慢慢對C++和數據結構、設計模式這些內容有更深的理解會更好。

  另外對C++底層的部分,我有一些個人的理解和看法,不管你會不會某個語法和庫功能細節的底層知識,你考慮問題首先要把自己放在一個語言設計者或是標准庫設計者的位置來思考這個問題,這樣不管你的回答是否正確,至少在面試官眼中,你都是以一個底層設計者的思路在設計,而不只是一個使用者,或許這個時候真正的答案就不太重要了。(當然答錯了還是要反思的,2333)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM