Unity的对象复用
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
對(duì)象復(fù)用是 用空間換時(shí)間的一種典型的做法,對(duì)于Unity來說雖然引擎內(nèi)部有GameObject的對(duì)象池,但是
這只是Native層的,到了Managed層還是可以繼續(xù)優(yōu)化的。通過Profiler能夠發(fā)現(xiàn)實(shí)例化GameObject 還是比較消耗CPU的。
Unity中對(duì)象池主要有3種,
1.普通的C# class的對(duì)象池
2.GameObject 的對(duì)象池
3.byte[] 的內(nèi)存池
?
先說結(jié)論:
1.普通的C# class的對(duì)象池和byte[]的內(nèi)存池,復(fù)用后性能提升很大很大很大。其中包括了GC。
2.GameObject 的提升就比較低了,大約只提升了50%。CPU消耗中約40%是發(fā)生在Alloc的內(nèi)部操作以及復(fù)用的一些控制,另外60%消耗在GameObjet.SetActive上,這60%可根據(jù)實(shí)際情況定向優(yōu)化掉。
?
普通的C# class的對(duì)象池 和 byte[] 內(nèi)存池比較簡單,不過為了盡可能避免泄露,最好?IDisposable 和using結(jié)合起來使用,可做到多線程支持。byte[]可以用分段來處理,適當(dāng)?shù)脑黾右恍┤哂?#xff0c;盡可能減少粒度。
?
Unity的大部分組件(如Rigidbody Collider)只能掛載在GameObject之上,這意味著無論什么樣的客戶端框架,都避免不了MonoBehavior腳本的交互,這一點(diǎn)就意味著Start OnDestroy等生命周期控制的語義就變了。這樣的話GameObject的對(duì)象池就復(fù)雜多了。為了解決這個(gè)問題,就要制定一些規(guī)范來約束MonoBehavior的行為。
?
為了避免泄露和加強(qiáng)健壯性,除了制定一些規(guī)范,還要做一些容錯(cuò),如類似于GC行為的 Collect 或 Resources.UnLoadUnUsedAsset 的操作。在適當(dāng)?shù)臅r(shí)機(jī)檢測(cè)一下使用量。這個(gè)在GameObject對(duì)象池中尤為重要。
?
轉(zhuǎn)載于:https://my.oschina.net/kkkkkkkkkkkkk/blog/3047745
總結(jié)
以上是生活随笔為你收集整理的Unity的对象复用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【代码规范】prettier
- 下一篇: 访问数组元素