騰訊遊戲客戶端面試-初面
- 寫在前面
- 問題
- 1.值類型和引用類型?
- 2.Unity IL的定義?
- 3.之前處理比較深入的一些問題?
- 4.貼圖常見的壓縮策略?
- 5.Unity生命週期?
- 6.內存區域分配?
- 7.GC機制?
- 8.死鎖的四個必要條件,常見原因?
- 9.TCP和UDP的區別?
- 10.虛函數的意思?
- 11.如何能減小遊戲內的DP?
- 12.渲染管線?
- 13.Defer和Forward的區別?
- 14.簡要說一下Phong 模型,以及知道別的光照模型麼?
- 15.內聯函數的含義?
- 16.直接光照和間接光照的區別?
- 17.Awake的具體執行階段?
- 18.UGUI和NGUI的區別,UGUI的優化方式?
- 19.C#的對象生命週期?
- 20.引擎框架?
- 21.手機GPU架構?
- 22.GPU常見優化算法?
- 總結
寫在前面
已經很久沒有登錄博客了,猶記得上次還是在兩年前,那時候懷揣着對遊戲行業的初心。
兩年,沒錯,我依然還在遊戲行業,雖然加班在做難免,但也時常鼓勵自己不忘初心。
畢業的第一年我去了一家小公司,18年的盛夏,趕上游戲版號的事件,所以試用期滿被裁。之後我去了某頁遊公司做客戶端,知道的朋友大概能理解其中諸多加班,種種苦痛,經歷了一段暗無天日的加班之後,迷茫不已的我有幸去了網易,不過是作爲網易的新職能部門,代碼寫得少,話說得多。所以多多少少心裏那點對於技術的追求在一個角落隱隱生根發芽。
面試的結果對我來說如果通過的話肯定最好,不能過也告訴自己順其自然,隨遇而安。但是卻讓我意識到一定要抓住自己的Free Time去學習,補好基礎,Coding and Thinking more。
寫於來網易後的一年。
問題
1.值類型和引用類型?
值類型的變量直接存儲數據,而引用類型的變量持有的是數據的引用,數據存儲在數據堆中。
值類型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 統稱爲值類型。值類型變量聲明後,不管是否已經賦值,編譯器爲其分配內存。
引用類型(reference type):string 和 class統稱爲引用類型。當聲明一個類時,只在棧中分配一小片內存用於容納一個地址,而此時並沒有爲其分配堆上的內存空間。當使用 new 創建一個類的實例時,分配堆上的空間,並把堆上空間的地址保存到棧上分配的小片空間中。
2.Unity IL的定義?
IL是.NET框架中中間語言(Intermediate Language)的縮寫。使用.NET框架提供的編譯器可以直接將源程序編譯爲.exe或.dll文件,但此時編譯出來的程序代碼並不是CPU能直接執行的機器代碼,而是一種中間語言IL(Intermediate Language)的代碼(來源百度)
3.之前處理比較深入的一些問題?
分別從代碼上,渲染上,和美術溝通上說了三條問題。
4.貼圖常見的壓縮策略?
- 安卓:ETC1,ETC2
- IOS:ASTC,PVRTC
- PC:DXTC,DXTCX
5.Unity生命週期?
階段 | 事務 |
---|---|
Awake | 只會被調用一次,在Start方法之前被調用 |
Start | 只執行一次,在Awake方法執行結束後執行 |
Update | 每一幀執行 |
FixedUpdate | 先執行Update,然後纔去執行lateUpdate |
LateUpdate | / |
OnDestroy | 當前腳本銷燬時調用 |
6.內存區域分配?
- 棧區(stack)— 程序運行時由編譯器自動分配,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。程序結束時由編譯器自動釋放。
- 堆區(heap) — 在內存開闢另一塊存儲區域。一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收。
- 全局區(靜態區)(static)—編譯器編譯時即分配內存。全局變量和靜態變量的存儲是放在一塊的。對於C語言初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。而C++則沒有這個區別 - 程序結束後由系統釋放。
7.GC機制?
給對象添加一個應引用計數器,有一個地方引用他,就加一,當引用失效就減一,任何時刻計數器爲0的對象就是不可能再被使用的。
很少使用,因爲他很難解決對象之間相互引用的問題
8.死鎖的四個必要條件,常見原因?
-
競爭不可搶佔資源引起死鎖
通常系統中擁有的不可搶佔資源,其數量不足以滿足多個進程運行的需要,使得進程在運行過程中,會因爭奪資源而陷入僵局,如磁帶機、打印機等。只有對不可搶佔資源的競爭 纔可能產生死鎖,對可搶佔資源的競爭是不會引起死鎖的。 -
競爭可消耗資源引起死鎖
-
進程推進順序不當引起死鎖
進程在運行過程中,請求和釋放資源的順序不當,也同樣會導致死鎖。例如,併發進程
P1、P2分別保持了資源R1、R2,而進程P1申請資源R2,進程P2申請資源R1時,兩者都會因爲所需資源被佔用而阻塞。
9.TCP和UDP的區別?
TCP:三次握手,第四次揮手。
UDP:實時傳遞,同步,但不安全。
10.虛函數的意思?
面向對象的語言有三大特性:繼承、封裝、多態。虛函數作爲多態的實現方式,重要性毋庸置疑。
多態意指相同的消息給予不同的對象會引發不同的動作(一個接口,多種方法)。其實更簡單地來說,就是“在用父類指針調用函數時,實際調用的是指針指向的實際類型(子類)的成員函數”。多態性使得程序調用的函數是在運行時動態確定的,而不是在編譯時靜態確定的。
11.如何能減小遊戲內的DP?
不要被重複繪製,相同資源放在同一個Layer,動態合批,靜態合批,等等。
12.渲染管線?
13.Defer和Forward的區別?
延遲渲染,正向渲染。可以看出前向渲染和延遲渲染的不同點在於多了一個Gbuffer(緩衝區)。
14.簡要說一下Phong 模型,以及知道別的光照模型麼?
Phong光照模型中的環境光照(Ambient lighting)部分就是模擬全局光照中間接光照的影響(即來自於其他物體的反射光等),這裏只是很簡單的近似,因此結果很粗糙。
Lamert 光照模型
15.內聯函數的含義?
inline是C++語言中的一個關鍵字,可以用於程序中定義內聯函數,inline的引進使內聯函數的定義更加簡單。說到內聯函數,這裏給出比較常見的定義,內聯函數是C++中的一種特殊函數,它可以像普通函數一樣被調用,但是在調用時並不通過函數調用的機制而是通過將函數體直接插入調用處來實現的,這樣可以大大減少由函數調用帶來的開銷,從而提高程序的運行效率。一般來說inline用於定義類的成員函數。
16.直接光照和間接光照的區別?
直接光照:點光源,聚光源,面光源。
間接光照:SH,GI,LightProbe。
17.Awake的具體執行階段?
進程被喚起的時候。
18.UGUI和NGUI的區別,UGUI的優化方式?
19.C#的對象生命週期?
無論是指類型的變量或是類類型的變量,其存儲單元都是在棧中分配的,唯一不同的是類類型的變量實際上存儲的是該類對象的指針,相當於vc6中的CType*,只是在.net平臺的語言中將指針的概念屏蔽掉了。我們都知道棧的一大特點就是LIFO(後進先出),這恰好與作用域的特點相對應(在作用域的嵌套層次中,越深層次的作用域,其變量的優先級越高)。因此,再出了“}”後,無論是值類型還是類類型的變量(對象指針)都會被立即釋放(值得注意的是:該指針所指向的託管堆中的對象並未被釋放,正等待GC的回收)。.NET中的棧空間是不歸GC管理的,GC僅管理託管堆。
20.引擎框架?
簡要回答了引擎中各大部分。
21.手機GPU架構?
TSR/TSDR
22.GPU常見優化算法?
HSR,EarlyZ。
總結
回答上來一半一半吧,但是真得還是要下功夫瞭解一下基礎的。
因爲做得事情多而不精,導致自己也沒有很好的深入探究。
繼續加油咯~