小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Unity3D研究院之利用緩存池解決Instantiate慢的問(wèn)題(七十三) | 雨松MOMO程序研究院

 勤奮不止 2018-01-31


1.NGUI直接打開(kāi)界面卡,建議看看我之前寫(xiě)的這一篇文章 http://www./archives/2799 (本文就不贅述了)

2.角色放技能的時(shí)候卡

尤其是放群體攻擊技能時(shí), 因?yàn)槊總€(gè)人身上都要產(chǎn)生一個(gè)技能特效。技能都是用粒子特效做的,雖然Unity中粒子特效也是一個(gè)GameObject.但是 Particle System這個(gè)組件太特殊了。Instantiate以后會(huì)自動(dòng)的執(zhí)行腳本的初始化工作,Particle System組件肯定也是個(gè)腳本,雖然我們看不到它實(shí)現(xiàn)的方式,但是Instantiate以后它定會(huì)先執(zhí)行Awake()和OnEnable()一類(lèi)初始化的方法。

經(jīng)過(guò)我的測(cè)試發(fā)現(xiàn),粒子特效真正慢的地方在于Play()的時(shí)候,Play內(nèi)部肯定是啟了協(xié)同一類(lèi)的方法。因?yàn)楦鶕?jù)粒子特效的原理,粒子特效其實(shí)就是個(gè)腳本,當(dāng)播放的時(shí)候它會(huì)自動(dòng)創(chuàng)建Mesh,從而生成它的運(yùn)動(dòng)軌跡。所以我們一定要控制同屏幕同時(shí)播放的粒子數(shù)量。

所以美術(shù)在做粒子特效的時(shí)候要注意3點(diǎn)

1.同屏的粒子數(shù)量一定要控制在200以?xún)?nèi),每個(gè)粒子的發(fā)射數(shù)量不要超過(guò)50個(gè)。不然在iPhone4或者一些比較爛的Android手機(jī)上就會(huì)有問(wèn)題

2.盡量減少粒子的面積,面積越大就會(huì)越卡。

3.粒子最好不要用Alfa Test(但是有的特效又不能不用,這個(gè)看美術(shù)吧) 、如下圖所示,粒子的貼圖用黑底的這種,然后用Particles/Additive 這種Shader,貼圖必須要2的冪次方,這樣渲染的效率會(huì)高很多。個(gè)人建議 粒子特效的貼圖在64左右,千萬(wàn)不要太大。。

Unity3D研究院之利用緩存池解決Instantiate慢的問(wèn)題(七十三) - 雨松MOMO程序研究院 - 1

 

在回到粒子卡的話(huà)題上,Play()方法我們是控制不了的,所以我們能做的就是在播放Play方法之前讓粒子特效所有的準(zhǔn)備工作都已經(jīng)完成。

1.粒子特效的GameObject實(shí)例化完畢。

2.確保粒子所用到的貼圖載入內(nèi)存

3.讓粒子進(jìn)行一次預(yù)熱(目前預(yù)熱功能只能在循環(huán)的粒子特效里面使用,所以不循環(huán)的粒子特效是不能用的)

1
2
3
4
//實(shí)例化粒子特效。
GameObject newGo = GameObject.Instantiate(go) as GameObject;
//把它的狀態(tài)設(shè)置成隱藏
newGo.SetActive(false);

因?yàn)閷?shí)例化粒子特效以后,實(shí)際上粒子的腳本就已經(jīng)完成了初始化的工作,也就是Awake()和OnEnable()方法。然后設(shè)置SetActive(false)僅僅是把粒子特效隱藏起來(lái)。

上述操作完畢以后,讓游戲中真正要播放粒子特效的時(shí)候,粒子不用在載入它的貼圖,也不用實(shí)例化,僅僅是執(zhí)行一下SetActive(true)。SetActive(true)的時(shí)候就不會(huì)執(zhí)行粒子特效的Awake()方法,但是它會(huì)執(zhí)行OnEnable方法。

3.載入模型的時(shí)候卡

一般在戰(zhàn)斗場(chǎng)景,突然出現(xiàn)一大堆怪的時(shí)候, 屏幕會(huì)卡一下。角色的骨骼數(shù)量一定要少于30根,你可以用Profiler 里面看看,當(dāng)你實(shí)例化一個(gè)動(dòng)畫(huà)模型的時(shí)候時(shí)間都卡在加載動(dòng)畫(huà)這塊。如下圖所示,在QualitySettings里面,一般手游我們都選擇Good 選項(xiàng),下面有一些別的選項(xiàng),能關(guān)就關(guān)了,垂直同步也一定就關(guān)了。

Unity3D研究院之利用緩存池解決Instantiate慢的問(wèn)題(七十三) - 雨松MOMO程序研究院 - 2

如果要想游戲運(yùn)行時(shí)不卡,我們必須要進(jìn)行預(yù)加載,意思就是放技能或者出現(xiàn)怪物的時(shí)候,程序只需要SetActivie(true) 就可以了。但是你又不能預(yù)加載的東西太多,因?yàn)轭A(yù)加載和內(nèi)存就像一把天枰,一旦預(yù)加載過(guò)多了你的游戲內(nèi)存可能就爆了。

所以我覺(jué)得用Unity3D開(kāi)發(fā)游戲,你必須要用緩存池。啥意思呢?

1. Instantiate 一個(gè)動(dòng)畫(huà)模型,這時(shí)候unity會(huì)先判斷模型身上的資源是否在內(nèi)存里,如果內(nèi)存沒(méi)有加入內(nèi)存。

2.GameObject實(shí)例化完畢后,會(huì)同步執(zhí)行它身上所有腳本的初始化工作,這里執(zhí)行的不止是我們自己寫(xiě)的腳本,U3D自身的組件腳本也會(huì)初始化,比如動(dòng)畫(huà)這塊很卡的地方就是Animation這個(gè)組件。

3.Destroy(gameObject), 它不會(huì)把模型所用的貼圖資源釋放掉,但是它會(huì)把游戲?qū)ο蠛湍_本釋放掉。 啥意思呢?就是如果你再次Instantiate的時(shí)候,它不會(huì)再去載入模型所用到的貼圖,但是它要執(zhí)行腳本的初始化工作。我們不知道U3D內(nèi)部組件腳本是如何初始化的,但是就自己寫(xiě)的腳本而言,它必然要同步執(zhí)行Awake()和OnEnable()這兩個(gè)方法,如果這里有耗時(shí)操作,那么必然會(huì)卡一下。

所以一些使用頻繁的模型,不用的時(shí)候不要把它直接Destory掉,而是SetActive(false)。 這樣當(dāng)你再次使用的時(shí)候只需要SetActivie(true) 這樣對(duì)應(yīng)這個(gè)游戲?qū)ο髞?lái)說(shuō) 它只會(huì)執(zhí)行OnEnable()這一個(gè)方法,所以載入速度是最快的。

所以我們用緩存池也是,在Loading進(jìn)入戰(zhàn)斗場(chǎng)景的時(shí)候,把頻繁用到的模型,特效,全部Instantiate進(jìn)去 SetActivie(false) 放入緩存池,當(dāng)程序用到的時(shí)候在去池子里面拿,這樣你就不會(huì)發(fā)現(xiàn)卡了。

緩存池你可以自己去寫(xiě),不過(guò)網(wǎng)絡(luò)上已經(jīng)有一些緩存池的工具了。比如 PoolManager,這里我有做的詳細(xì)的例子,http://www./archives/2974 他是一個(gè)例子工程,寫(xiě)的很清晰。改一改就可以直接拿來(lái)用了,很方便。。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多