學習unity的一些經驗和見解

2021-07-04 08:41:57 字數 3132 閱讀 1792

個人認為unity相比於其他引擎易用性較好的原因主要有:

基於元件(component)的關卡設計更符合直覺

unity通過將系統或使用者的指令碼抽象為可重用的元件(component)並附著在遊戲物件上來控制遊戲的行為。相較於傳統的基於指令碼的開發方式,關卡設計師可以更靈活、更快速地搭建介面和關卡,有一種「搭積木」的感覺。雖然這種設計犧牲了一部分擴充套件性(例如難以實現巢狀prefab),但對初學者來講是非常友好的。

虛幻引擎4.7版本的更新也效仿unity,向元件化的方向靠攏,使關卡結構更容易理解和維護。

使用mono作為指令碼執行的平台

c#/mono相比c++和其他指令碼語言,有更好的穩定性和抽象能力,有容易使用的.net框架和易於移植的各類開源庫,相對完善的語言服務(如gc和反射)也使開發複雜邏輯容易許多。雖然降低了門檻的同時也讓低質量的**更容易產生,但不管對於初學者還是老鳥來說,我覺得都是利大於弊的。

引擎本身的功能相對簡單 + 豐富的asset store外掛程式

和虛幻等超級引擎相比,unity提供的功能算是非常基礎的,元件數量和各元件可配置的內容都不多,所以在學習的時候更容易產生比較直觀的感受,不至於迷失在細節當中。另一方面,asset store模式的成功造就了大量功能強大的第三方外掛程式,填補了unity開發中的各種空白,進一步降低了開發門檻。

而難於精通方面,我覺得主要原因在於:

對綜合能力要求高

首先,不僅對unity,對任何遊戲引擎或者對遊戲開發本身來說,想要精通都是很難的一件事。因為遊戲客戶端開發本身是一項綜合性非常強的活動,整合的技術非常多,例如:

而對於將這些技術粘合在一起的unity工程師來說,雖然不需要精通方方面面,但將團隊成員的工作高效率高質量地結合在一起,也是非常考驗其能力的,只有長期地,全方面地參與整個開發過程並了解團隊成員的工作方式,才能逐漸成長為一名優秀的unity工程師。

舉例來說,unity工程師需要:

有些做unity的工程師可能只是搭建關卡,寫一些控制指令碼,而優秀的unity工程師的價值往往在於其能夠承擔更多的團隊職責。所以說想要精通這些,真的需要付出很多的時間和努力才行。

難在細節

任何事想精通,細節都是非常重要的,比如:

指令碼執行

渲染

團隊協作

這些都是unity開發中會不斷面對的問題,如果不能從始至終中控制住這些細節,積累起來往往會使團隊效率底下,難以產出高質量的應用。

所以我覺得unity難以精通之處就在於對細節知識的把握,以及在整合團隊價值的過程中如何做到揚長避短。unity開發團隊中常常不是所有人都會這個引擎有很深刻的認識,大家術業有專攻,有人搭場景,有人做後端,對自己不熟悉的領域,難免有錯誤的認知和實踐。我們尚可以通過時間和努力精通細節,然而到頭來真正缺少的,其實是團隊成員間的信任所帶來的溝通成本的降低。

【更新】

回答一些朋友的疑問。

關於資料**

細節問題很難有系統的資料**,而像assetbundle dynamic batch這種幾乎找不到答案的問題只能自己慢慢摸索。在此列舉幾個最主要的知識**。

官方手冊。例如搜尋unity optimization可以找到官方在gpu,cpu和mobile方面的幾篇優化手冊。官方資料常常包含最核心也最容易被忽略的原則,深入理解往往會有新的收穫。

官方部落格。部落格上不時會有一些技術類文章,如關於il2cpp和序列化機制的知識幾乎只能看那幾篇部落格。technology

unity的mono fork:unity-technologies/mono · github

,關於gc和aot方面是第一手的資料。比如gc的配置,enumerable類的實現如何導致linq容易觸發aot異常,以及泛型compareexchange中存在的jit hack導致c#事件和一些執行緒同步操作觸發aot異常等等。另外gc方面也可以參考ivmai/bdwgc · github

,有詳細的機制解釋。

ui的源**:unity-technologies / ui

,修改優化後可以直接整合到遊戲中,很方便。

隨unity安裝的pdb除錯檔案。unity的安裝目錄下其實是有editor和player當中所有c++原始碼的pdb檔案的,而且居然都是private pdb。需要探查unity內部資料結構和過程實現的時候,通過windbg配合這些pdb檔案除錯unity程序可以獲得很多最底層的資訊。當然,如果公司買了unity的原始碼就不必這樣麻煩了。

關於優化策略

不只是unity,優化程式最重要的原則就是先測量。而且在沒有豐富經驗和自信的情況下,不要自己寫測量**,而要依賴unity自己profiler和profiler api。這裡只說一些unity特有的內容。

使用profiler時,切忌猜測。一定要弄清各種資料的精確涵義,如self %,self ms,gc alloc等,如果弄不清楚,優化常常是南轅北轍。另外診斷cpu spike時,一定要開啟deep profile,否則只能看到誤導性很強的表面資料。找到真正的hot line才能著手優化改善效能。

當hot line在自己的**中時,可以嘗試將cpu密集的操作分派到後台執行緒,然後在需要與unity api互動時排程回來。粒度較好的操作可以嘗試用coroutine分派到其他幀分別執行。大量gc alloc造成的spike需要重新設計記憶體分配策略,小物件(目前版本是小於1kb)較多的時候也可以嘗試預先擴大託管堆(如分配很多小於1kb的緩衝區,然後再釋放),這樣可以加速後續記憶體分配。因為boehm gc的堆擴充套件策略是時間線性而非空間線性的,所以每次擴大後的容量都是翻倍的,需要注意。

而當hot line在unity api中時,常常是自己的錯誤實踐造成的,需要重新審視設計。一方面要減少昂貴api的呼叫次數,一方面要降低unity內部處理資料的規模。例如場景載入緩慢時,可能需要簡化場景本身,然後在場景啟動後再手動、增量地載入場景中的其他內容。

gpu方面,如果沒有複雜的特效,瓶頸常常在draw call和fill rate上。draw call需要batch,能共享的材質一定要共享。fill rate的問題通常在高解析度的2d遊戲中比較明顯,profiler中的transparency渲染佔比很大時就應該著手優化。gpu優化策略上unity相比其他引擎並沒有很多特異的方面,準確測量的基礎上通常能找到比較通用的解決方法。

CSRF XSS Cookies 的一些見解

csrf 攻擊 在瀏覽器中插入了 惡意鏈結 並在使用者訪問之時讓使用者訪問,達到使用使用者的cooikes達到連線指定伺服器客戶的的驗證資訊,並進行一些簡單的操作。比如 防禦 最簡單的,可以通過驗證cookies進行一些防禦。例如在使用者操作驗證中,判斷是否又cookies傳過來,如果沒有則是惡意鏈...

指標的一些見解

在c c 最牛皮也是最令人頭疼的就是指標了,記得那時是乙個炎熱的下午,老師吐出了那兩個讓我畢生難忘的字 指標 然後太熱了睡著了 還記得當時,老師就提醒我們指標是c強大的重要部分,但同時如果處理不好,問題也很大。但其實吧,學習指標的壓力也不是那麼大的。自行補圖 typename pointname 如...

學習python的一些心得和經驗

最近有不少朋友問學習python如何下手,是不是報個培訓班學習?下面先簡單的介紹一下python。python是一種物件導向 直譯式計算機程式語言,由guido van rossum於1989年底發明,第乙個公開發行版發行於1991年。python語法簡捷而清晰,具有豐富和強大的類庫。它常被暱稱為膠...