這是我在《Unity游戲優(yōu)化 (第2版)》看的瘟栖,記錄一下~
內(nèi)存效率是性能優(yōu)化的一個(gè)重要元素
有啥問題呢趋急?
不必要的內(nèi)存分配由于過高的垃圾回收(消耗CPU時(shí)間)將導(dǎo)致糟糕的用戶體驗(yàn)
內(nèi)存泄漏將導(dǎo)致崩潰
1.Mono平臺
Mono是個(gè)開源項(xiàng)目崩侠,基于API、 規(guī)范和微軟的.Net Framework的工具構(gòu)建了自己的類庫平臺
本質(zhì)上钉寝,是.Net類庫的開源重置蔬芥,在幾乎不訪問原始源碼的情況下完成,和微軟的原始類庫完全兼容
Mono項(xiàng)目的目標(biāo)是通過框架提供跨平臺開發(fā)冒签,也就是說用一種編程語言編寫的代碼運(yùn)行在很多不同的硬件平臺上
Mono也支持很多不同的編程語言
也就是說:可以編譯成.Net的通用中間語言(Common Intermediate Language在抛,CIL)的任何語言都能與Mono平臺集成
Unity并不是構(gòu)建在Mono平臺之上的,只是作為一個(gè)組成的部分萧恕。
Unity底層運(yùn)行C++處理渲染刚梭、動(dòng)畫、資源管理等
Mono的用處大部分是實(shí)現(xiàn)玩法邏輯提供高級腳本語言
為啥用高級腳本語言呢票唆?
其通過自動(dòng)垃圾回收抽象并分離了復(fù)雜的內(nèi)存管理朴读,并提供各種安全管理內(nèi)存的特性,這些都以犧牲運(yùn)行時(shí)的開銷為代價(jià)走趋,簡化了編程的行為
這樣的語言 通常稱為:托管語言衅金,其特點(diǎn)是:托管代碼
是微軟創(chuàng)造的一個(gè)術(shù)語,指必須在公共語言運(yùn)行時(shí)(Common Language Runtime簿煌,CLR)運(yùn)行的源碼氮唯,和通過目標(biāo)操作系統(tǒng)編譯與運(yùn)行的代碼不同。
托管的意思是:指依賴于獨(dú)立運(yùn)行時(shí)環(huán)境來執(zhí)行姨伟,且由自動(dòng)垃圾回收進(jìn)行監(jiān)控的代碼
其缺點(diǎn)就是運(yùn)行時(shí)消耗通常比本地代碼要更大
2.內(nèi)存域
Unity引擎中的內(nèi)存空間本質(zhì)上可以劃分為3個(gè)不同的內(nèi)存域惩琉,每個(gè)域存儲不同的數(shù)據(jù)類型,關(guān)注不同的任務(wù)集
a.托管域
是Mono平臺工作的地方
寫的任何MonoBehaviour腳本和自定義的C#類在運(yùn)行時(shí)都會在此域?qū)嵗瘜ο?br>
任何C#代碼都會很明確與此域交互
內(nèi)存空間也會自動(dòng)被垃圾回收管理
b.本地域
Unity有一些底層的本地代碼功能夺荒,它由C++編寫瞒渠,并根據(jù)目標(biāo)平臺編譯到不同的應(yīng)用程序中
這里關(guān)心的是內(nèi)部內(nèi)存空間的分配,為各種子系統(tǒng)(渲染管線技扼、物理系統(tǒng)伍玖、用戶輸入)分配資源數(shù)據(jù)(紋理、音頻文件剿吻、 網(wǎng)格)和內(nèi)存空間
還包括 GameObject 和 Compoent 等重要游戲?qū)ο蟮牟糠直镜孛枋銮瞎浚员愫瓦@些內(nèi)部系統(tǒng)交互
也是大多數(shù)內(nèi)建Unity類(Transofrom等)保存期數(shù)據(jù)的地方
如果外部像訪問這里,會訪問 在本地域中的對象描述的包裝器
指令會由Unity進(jìn)入它的本地代碼,在那里生成結(jié)果仔燕,然后復(fù)制回托管域
也就是 本地-托管橋
跨越這個(gè)橋通常需要內(nèi)存進(jìn)行上下文切換,會為游戲帶來相當(dāng)嚴(yán)重的潛在性能問題
c.外部庫
比如DirectX和OpgenGL庫魔招,還有項(xiàng)目中很多自定義庫和插件
在C#代碼引用這些類庫將導(dǎo)致類似的內(nèi)存上下文切換和后續(xù)成本