unity優(yōu)化全攻略(不定期更新)

1.Camera ClearFlags 千萬別選 DontClear

2.代碼中空的Update也是消耗性能的 應(yīng)當(dāng)清理掉

3.在Update使用的東西,能緩存的盡量緩存,不要在Update出現(xiàn)諸如GetComponent的東西

4.能夠復(fù)用的東西使用類型池
實(shí)例化和銷毀一個對象通常比停用和重新激活它要昂貴得多,如果對象包含啟動代碼,例如在Awake()或Start()函數(shù)中對GetComponent()的調(diào)用,則尤其如此。

5.Transform , Transform.position是一個訪問器,頻繁使用是有消耗的,如果需要使用建議緩存

6.vector3和vector3的平方根操作影響性能很大,建議將vector3.magnitude 替換成vector3.sqrMagnitude

7.Camera.main 這看起來是一個變量,其實(shí)也是一個訪問器,內(nèi)部涉及到find,所以也應(yīng)該緩存

8.只有不運(yùn)行的代碼才是好代碼,在攝像機(jī)看不到的地方,我們可以不執(zhí)行顯示相關(guān)或者其他不影響游戲的代碼.
比如:

private Renderer myRenderer;

void Start()
{
    myRenderer = GetComponent<Renderer>();
}

void Update()
{
    UpdateTransformPosition();

    if (myRenderer.isVisible)
    {
        UpateAnimations();
    }
}

或者使用OnBecameInvisible()和OnBecameVisible()

9.如果可以盡量使用struct 這種數(shù)值類型代替class

10. 數(shù)組結(jié)構(gòu)的重用,建議建立一個 成員list,作為那些需要臨時創(chuàng)建list的函數(shù)內(nèi)部使用,這樣可以有效減少GC.

11.C#中的所有方法引用都是引用類型,因此在堆上分配。通過將方法引用作為參數(shù)傳遞,都會臨時分配內(nèi)存。不管傳遞的方法是匿名方法還是預(yù)定義方法,都會進(jìn)行這種分配。

其次,將匿名方法轉(zhuǎn)換為閉包將大大增加將閉包傳遞給接收閉包的方法所需的內(nèi)存量。

閉包過程就是 引用匿名函數(shù)外部變量的過程.

12.避免裝箱和拆箱,就是,數(shù)值類型轉(zhuǎn)換為引用類型,引用類型轉(zhuǎn)換為數(shù)值類型

13.字典和枚舉.
通常,我們的 new Dictionary<Enum, object>();其實(shí)是有問題的, enmu會被裝箱和拆箱
在使用add,tryGetValue,remove 等等.
所以我們這么寫可以避免裝箱和拆箱操作

   public  enum MyEnum { a, b, c };

    public class MyEnumComparer : IEqualityComparer<MyEnum>
    {

        public bool Equals(MyEnum x, MyEnum y)
        {

            return x == y;

        }

        public int GetHashCode(MyEnum x)
        {

            return (int)x;

        }

    }

        MyEnumComparer mycomper = new MyEnumComparer();
        var myDictionary = new Dictionary<MyEnum, object>(mycomper);

14.訪問unity自帶數(shù)組結(jié)構(gòu)時,需要提前提出,避免重復(fù),因?yàn)槟悴恢肋@個類型到底是不是一個訪問器還是什么.安全起見全部提出.
比如

//mesh.vertices將會不斷的創(chuàng)建新的副本
for(int i = 0; i < mesh.vertices.Length; i++)

{

//修改成這樣就好很多.
var vertices = mesh.vertices;
for(int i = 0; i < vertices.Length; i++)

{


15.對于數(shù)組類型的返回時,盡量返回零長數(shù)組而不是null,避免之后有余數(shù)值為空造成的各種影響.

16.需要攜程等待一幀,最好使用 yield return null 代替 yield return 0, 因?yàn)?時數(shù)值類型會有裝箱操作.

17.結(jié)構(gòu)體內(nèi)如果包含引用類型,GC會檢查整個機(jī)構(gòu)體,所以,盡量的,結(jié)構(gòu)體內(nèi)不要包含引用類型.

18.函數(shù)返回的類型最好使用數(shù)值類型.

19. 在使用一些需要傳入字符串操作的時候其實(shí)可以先將字符串轉(zhuǎn)換為ID

//優(yōu)化前
material.SetColor("_MainColor",Color.White);
animator.SetTrigger("attack")

//優(yōu)化后,重復(fù)使用
static readonly int material_Color = Shader.PropertyToID("_Color")
static readonly int anima_Attack= Animator.StringToHash("attack")

material.SetColor(material_Color ,Color.White);
animator.SetTrigger(anima_Attack)

20. 字符串比較

//性能羸弱的方式 1
string.Equals("a","a");

//性能羸弱的方式 2
String.Compare("a","a") == 0

//性能優(yōu)越
myString.Equal(otherString,StringComparison.Ordinal)

//StringComparison的其他枚舉定義
public enum StringComparison{
CurrentCulture,
CurrentCultureIgnoreCase,
InvariantCulture,
InvariantCultureIgnoreCase,
Ordinal,
OrdinalIgnoreCase
}
//CurrentCulture 使用區(qū)域敏感排序規(guī)則和當(dāng)前區(qū)域比較字符串。
//CurrentCultureIgnoreCase 使用區(qū)域敏感排序規(guī)則、當(dāng)前區(qū)域來比較字符串,同時忽略被比較字符串的大小寫。
//InvariantCulture 使用區(qū)域敏感排序規(guī)則和固定區(qū)域比較字符串。
//InvariantCultureIgnoreCase 使用區(qū)域敏感排序規(guī)則、固定區(qū)域來比較字符串,同時忽略被比較字符串的大小寫。

//Ordinal 使用序號排序規(guī)則比較字符串。

//OrdinalIgnoreCase 使用序號排序規(guī)則并忽略被比較字符串的大小寫,對字符串進(jìn)行比較。

21.將 vector3.zero 之類全部做成一個 const 或者 static readonly 將會大大提升效率

22.遍歷的時候,將count提出,可以減小訪問,起到優(yōu)化的作用

23.內(nèi)存緊密排布的結(jié)構(gòu),比如數(shù)組用for來遍歷比較好,但是內(nèi)存散亂的用,foreach比較好

24.在使用RenderTexture的時候,如果你需要頻繁的創(chuàng)建,那最好用GetTemporary 釋放的時候ReleaseTemporary,unity內(nèi)部會為我們維護(hù)一個內(nèi)存池, 別忘了釋放,不然內(nèi)存無限疊加.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容