Unity DOD(ECS) 學習總結
這兩周基本完成了現階段的Unity DOD的學習了,今天開始要真正開始改造我的項目.所以在此之前稍微總結一下,給自己加深個記憶,順便可能也能幫助到有興趣的同學.我不會提及技術細節,只是對現有的學習資料進行一個簡介,給出我認為合理的學習順序,我覺得比起用我自己蹩腳的語言複述教學, 這些才是更有用的東西.
但是一定要注意DOD的各個組件會在2019年的一年時間內才會逐漸穩定發布.如果你手頭就有緊迫上線的項目的話,還是不要急於應用.
首先,你可能一臉懵逼的問"DOD"是啥,你不是說要學ECS么. 事實上這正是我覺得有必要總結的一個原因. 當我剛開始研究的時候我還只認識到Unity在強推新的ECS(Entity Component System)即實例組件系統.我把它視為跟我正在用的Entitas類似的ECS框架而已.雖然當時我已經知道Job System和Burst Compiler,但是我並沒有意識到三者之間的聯繫是多麼緊密.
什麼是DOD
Unity實際上在做的大計劃,是一個在程序屆流行了一陣子,最近越來越火的概念DOD (Data Oriented Design) 即 面向數據設計. 他是與我們所熟知的OOD (Object Oriented Design) 即面向對象設計相對的概念. 目前的流行程度甚至於你用youtube一搜就會發現:

https://www.youtube.com/results?search_query=data+oriented+design
在截圖裡第一條搜索結果的Mike Acton大佬,目前正供職於Unity並且正是Unity的DOD改革主導者之一.然後第三條則是大名鼎鼎的吹哥在自己正在設計的新遊戲語言開發直播里講解DOD.雖然我認為還不至於說"OOP已死,DOD永生"這麼極端,不過其紅火程度可見一斑.
Unity的DOD

https://youtu.be/NF6kcNS6U80?t=757
說回Unity, 如圖,這是摘自Unity at GDC 2018上的一幀Slide, 表達了Unity DOD計劃的全貌.其全新的組成部分是從上到下是以下幾個:ECS, Job System, HPC#, Burst Compiler.
ECS
實例組件系統,是編程思想的改變,從基於對象的運作,改變為"流水線式運作"(我自己的比喻).雖然顯然破壞了"程序對現實的模擬"這樣美好的願望,但是卻大大的增強了解耦性,可測性,擴展性.並且天然是以下要描述的幾個組件的好夥伴~
Job System
Job System是Unity對CPU多核編程的應用.通過把工作分散到CPU的各個核心上來大大提升運行效率.而ECS跟他之間的搭配則是由於ECS的System部分天然是以批量處理為核心的,因此只要稍加改動,就可以轉變為批量的分Job交到多核去處理.實現性能的提升.
HPC#
HPC#(High Perform C#)是Unity開發的一個C#子集,通過拋棄對象,指針,等高級特性,從語言層面加速性能. 截圖裡沒有直接列出這個,但是NativeContainer是HPC#的一環. 而由於ECS本身的去對象化,可見又是天然的好夥伴.
Burst Compiler
這又是Unity自己開發的,一個全新的快速編譯器,最重要的是由於不用考慮通用性,僅僅針對Unity,針對遊戲,再配合HPC#, 使得性能有了更大的提升.由於牽扯到編譯器層面,這個部分我的理解是最薄弱的,如有錯誤敬請指正.
合體
於是當四個部分一起合力時我們會得到什麼樣的結果呢:參見剛剛過去的Unite LA 2018的演示:https://www.youtube.com/watch?v=O5F30NEJvrU

在官方Unity DOD教程里則給出了經典方式同屏18000單位,DOD方式104000單位的近乎6倍的性能提升.當然我們的實際遊戲會基於遊戲內容的不同,以及組件的複雜性未必能有這樣的極端結果,但我想2-3倍的性能提升還是可以預期的.
學習材料
然後就是最主要的目前階段如何學習了. 通過這兩周的學習,我的認識是:目前的學習材料雜亂無章並且容易過期.原因很簡單就是現在都只是在preview階段,很多東西都在快速變更中,尤其API里,對一個需求還會存在多種實現方式,官方希望在試用者們的反饋下最終再確定到其中一種,因此你現在寫的代碼和看的教程很可能會很快無效.甚至18年下半年的大會上出現的一些代碼標籤,都已經和上半年的不一樣了. 官方也顯然沒有精力維護一個系統性的教學.因此我認為我把我現在所學到的材料按照我自己認為合適的學習曲線去歸納一下並且排序列出是非常有必要的.
ECS入門
我建議首先不要考慮Unity, 而是先單純對ECS有一個基本的學習,首推這兩篇文章:
http://blog.lmorchard.com/2013/11/27/entity-component-system/他的圖很形象,脫離代碼,給你一個最基本的認識然後是https://www.richardlord.net/blog/ecs/what-is-an-entity-framework.html結合遊戲引擎的實際需要,更為詳細的介紹.
官網教程
然後回到Unity這邊,官網教程的6個視頻是比較好的入門:
https://unity3d.com/cn/learn/tutorials/topics/scripting/introduction-ecs?playlist=17117但是非常淺,在一個簡介之後,就是我前文說過之後的同屏小飛機數量對比的項目教程,甚至到最後都沒有給出最終版本的源碼=.=,我想跟著寫,但是發現到最後的ECS版本寫不下去,因為相關的System只給出了最具代表性的一個作為例子展示.官方Sample
地址在https://github.com/Unity-Technologies/EntityComponentSystemSamples,基本上是官方目前除了演講視頻外,最主要教學內容了.
拉下來後會看到裡面有七八個例子,直接看的話感覺很散亂,雖然有附文檔,但是我當時硬啃了很久還是比較缺乏頭緒.但是如果配合下面的各個演講視頻看的話,會有奇效.
第三方教程
在第三方教程方面我發現這個哥們Charles Amat的博客里有很多視頻教學,如果你想立即上手而不是先看一大堆理論教學的話,可以直接來看他的博客.但是要注意這裡是純應用角度的,你可能並不會像看官方演講那樣對內部有很深入的了解.並且不保證會隨時根據Unity的變化來更新舊內容.
Unity at GDC 2018
接下來是上半年的Unity at GDC 2018的五場相關演講了,事實上2017年的時候已經有過幾個相關演講,但是其一是因為推介性質為主,其二是由於API的快速變更,我覺得已經不太具有教學意義.
Unity at GDC - Evolving Unity
Unity的CTO, Joachim Ante大佬對UnityDOD戰略的一個總覽,後半段有個簡單例子.
Unity at GDC - Job System & Entity Component System
這場演講口音很重,但是乾貨滿滿. 底下一堆評論在吐槽他念job念成yob 233.不過說真的這場真的給我看sample範例解決了很多疑惑,我還做了一些要點的筆記:
Unity at GDC - A Data Oriented Approach to Using Component Systems
不愧是宣傳DOD多年的大佬出手,是著眼於內存使用層面的一場演講,以Boid示例(Samples示例項目里有,要記得結合著一起看),讓你對內存的新的使用方式有了一個深入的理解.我的筆記:
Unity at GDC - ECS for Small Things
這場演講是關於DOD的一個子項目Unity Tiny分支的演講,目的是製作一個最輕量級的Unity分支內核,正好這個就在幾天前官博上發布了示例項目,示例遊戲只有700k的下載容量,1.6m的完整容量.他主要是面對互動廣告,手錶等端的,對我而言沒有什麼太大的意義.但是由於使用了Pure ECS,並且示例項目中有一整個遊戲的完整代碼和測試代碼(非常重要!)因此很有參考價值.
Unity at GDC - C# to Machine Code
這場的主講是一位30年前從彙編寫起的老爺子,是Unity的Burst Compiler的主要負責人.這一點真的是感動到我了,看看國內程序員30歲後的命運...
不過這一講的內容真的有點難倒我了,不時崩出來的IR(中間碼)感覺在看天書...我想說如果你是純應用層其實可以不看,但是有時間的話讓自己增加一下視野,了解一下Unity的底層挺好的.表示我模模糊糊的學會了一個概念"alias"~大概是指不同指針指向同一個內存位置的性能問題~Unite LA 2018
然後是下半年剛剛過去的Unite LA 2018的Day 2直播視頻,這一天足足9小時的9場演講的內容完全都是Unity DOD相關,可見官方推動的力度. 從內容上來說比起上半年的GDC的5場演講要更為深入.因此全部應當在看完GDC之後再看.
由於全天所有演講是同一個直播視頻的不同段落,因此我這裡只放標題上的一個鏈接了,在評論里有不同演講的時間點鏈接.
這9場演講主要立足於Unity本身對於DOD的應用以及提供的工具,我就不再一一簡介了.去看就好.其中的先後順序也不是很重要.
單元測試
最後說一下單元測試,這個東西在遊戲界爭議很大,我個人是站在一定要有單元測試這一派的,而Unity官方也是提供全面的單元測試的.因此新的UnityDOD如何進行單元測試,主要的學習來源就是Unity的源碼了. 在Package Manager里提供的預覽版Entities里有官方自己的單元測試,這就是首要的很好的測試學習來源.再有就是剛才說的Unity Tiny模式項目也有比較全的單元測試.
還有一個就是剛才說過的Charles Amat的視頻教學了:http://infalliblecode.com/test-unity-ecs/
但要注意的是不建議像他那樣直接繼承官方ECSTestsFixture,而且官方現在版本的test並不發布dll,也繼承不了了.建議把ECSTestsFixture拷出來,理解其內容然後為己所用.社區
對了Unity ECS最新內容的發布自然就在官方論壇的ecs區了,記得關注.
踩坑列表
最後的最後,由於當前預覽版本的不穩定性,實際學習和使用的時候你一定會踩到很多坑.可以記得不時來這裡看一下,說不定就找到解決方案了:
https://gametorrahod.com/unity-ecs-unit-testing-problems-with-ecs-8f31c7a37386
雖然好像是個泰國網站?不過這個哥們的采坑列表寫的很全面感覺也很專業了.
好了,這差不多就是我這兩周看到的全部有用的資源了!寫了一下午,累爆.
推薦閱讀:
TAG:遊戲開發 | 獨立遊戲 | Unity(遊戲引擎) |
