unity3D做專案處理卡頓問題

2021-06-25 20:55:22 字數 2366 閱讀 5574

unity3d做專案有三個地方處理不好遊戲整體就會出現卡頓的問題。

1.ngui直接開啟介面卡

2.角色放技能的時候卡

尤其是放群體攻擊技能時, 因為每個人身上都要產生乙個技能特效。技能都是用粒子特效做的,雖然unity中粒子特效也是乙個gameobject.但是 particle system這個元件太特殊了。                   instantiate以後會自動的執行指令碼的初始化工作,particle system元件肯定也是個指令碼,雖然我們看不到它實現的方式,但是instantiate以後它定會先執行awake()和onenable()一類初始化的方法。

所以美術在做粒子特效的時候要注意3點

1.同屏的粒子數量一定要控制在200以內,每個粒子的發射數量不要超過50個。不然在iphone4或者一些比較爛的android手機上就會有問題

2.儘量減少粒子的面積,面積越大就會越卡。

3.粒子最好不要用alfa test(但是有的特效又不能不用,這個看美術吧) 、如下圖所示,粒子的貼圖用黑底的這種,然後用particles/additive 這種shader,貼圖必須要2的冪次方,這樣渲染的效率會高很多。個人建議 粒子特效的貼圖在64左右,千萬不要太大。。

1.粒子特效的gameobject例項化完畢。

2.確保粒子所用到的貼圖載入記憶體

3.讓粒子進行一次預熱(目前預熱功能只能在迴圈的粒子特效裡面使用,所以不迴圈的粒子特效是不能用的)

純文字檢視

複製**

1

2

3

4

//例項化粒子特效。

gameobject newgo=gameobject.instantiate(go)asgameobject;

//把它的狀態設定成隱藏

newgo.setactive(false);

因為例項化粒子特效以後,實際上粒子的指令碼就已經完成了初始化的工作,也就是awake()和onenable()方法。然後設定setactive(false)僅僅是把粒子特效隱藏起來。

3.載入模型的時候卡

一般在戰鬥場景,突然出現一大堆怪的時候, 螢幕會卡一下。角色的骨骼數量一定要少於30根,你可以用profiler 裡面看看,當你例項化乙個動畫模型的時候時間都卡在載入動畫這塊。如下圖所示,在qualitysettings裡面,一般手遊我們都選擇good 選項,下面有一些別的選項,能關就關了,垂直同步也一定就關了。

如果要想遊戲執行時不卡,我們必須要進行預載入,意思就是放技能或者出現怪物的時候,程式只需要setactivie(true) 就可以了。但是你又不能預載入的東西太多,因為預載入和記憶體就像一把天枰,一旦預載入過多了你的遊戲記憶體可能就爆了。

所以我覺得用unity3d開發遊戲,你必須要用快取池。啥意思呢?

1. instantiate 乙個動畫模型,這時候unity會先判斷模型身上的資源是否在記憶體裡,如果記憶體沒有加入記憶體。

2.gameobject例項化完畢後,會同步執行它身上所有指令碼的初始化工作,這裡執行的不止是我們自己寫的指令碼,u3d自身的元件指令碼也會初始化,比如動畫這塊很卡的地方就是animation這個元件。

3.destroy(gameobject), 它不會把模型所用的貼圖資源釋放掉,但是它會把遊戲物件和指令碼釋放掉。 啥意思呢?就是如果你再次instantiate的時候,它不會再去載入模型所用到的貼圖,但是它要執行指令碼的初始化工作。我們不知道u3d內部元件指令碼是如何初始化的,但是就自己寫的指令碼而言,它必然要同步執行awake()和onenable()這兩個方法,如果這裡有耗時操作,那麼必然會卡一下。

所以一些使用頻繁的模型,不用的時候不要把它直接destory掉,而是setactive(false)。 這樣當你再次使用的時候只需要setactivie(true) 這樣對應這個遊戲物件來說 它只會執行onenable()這乙個方法,所以載入速度是最快的。

所以我們用快取池也是,在loading進入戰鬥場景的時候,把頻繁用到的模型,特效,全部instantiate進去 setactivie(false) 放入快取池,當程式用到的時候在去池子裡面拿,這樣你就不會發現卡了。

快取池你可以自己去寫,不過網路上已經有一些快取池的工具了。比如 poolmanager,這裡我有做的詳細的例子,

他是乙個例子工程,寫的很清晰。改一改就可以直接拿來用了,很方便。。

Unity3D串列埠處理

最近公司用u3d開發乙個應用,需要用到串列埠,便研究了兩天串列埠程式設計,c 用serialport類實現串列埠程式設計,便開始使用serialport類編寫 後來發現乙個問題,unity不支援datareceived的方法。遇到這個問題很是棘手啊,後來在網上搜了一下,發現這個問題確實存在,解決的方...

unity3d 關於MouseLook的問題

今天碰到乙個有關於unity引擎自帶的第一人稱視角中自帶的mouselook的指令碼的問題,任我怎麼修改rotationaxes中的列舉變數他都執行的單一的判斷操作。例如 指令碼一開始有public rotationaxes axes rotationaxes.mou andy 那麼引擎就不斷的捕獲...

Unity3D處理Emoji問題

public class uiinputfield inputfield patterns.add u2702 u27b0 onvalidateinput myonvalidateinput private char myonvalidateinput string text,int charind...