總體來說,內存的優化在於貼圖和網格
assetbundle採用unity5自帶的,減少每一份的內存
合併貼圖TexturePacking,共用材質球 ,拆分貼圖png採用etc
手動合併網格或者自帶合併網格
總結
資源內存佔用:
一、紋理
(1) 紋理格式 使用ETC1代替RGBA32,佔用內存變低,ETC1不支持alpha,所以把圖片拆成2個
(2) 紋理尺寸 越低越好 不超過1024*1024
(3) 關閉mipmap
(4) 關閉 圖片讀寫操作 Read & Write
(5) 儘量使用2的n次冪大小的貼圖,否則GfxDriver裏會有2份貼圖;
二、網格
(1) Normal、Color和Tangent,注意裏面的屬性,如果100個裏面有99個沒有color屬性,1個有color會導致所有都會加上color屬
性
(2)儘量控制模型的面數,小於1500會比較合適;
(3)不同設備使用不同的模型面數;
(4)儘量保持在30根骨骼內;
(5)一個網格不要超過3個material;
引擎模塊自身佔用:
保證assetbundle被清乾淨
託管堆內存佔用:
高頻率地 New Class/Container/Array
Log輸出
代碼優化:
儘量避免代碼中的任何字符串連接,因爲這會給GC帶來太多垃圾;
用簡單的“for”循環代替“foreach”循環;
爲所有遊戲內的動態物體使用內存對象池,可以減少系統開銷和內存碎片,複用對象實例,構建自己的內存管理模式,減少
Instantiate和Destory;
儘量不使用LINQ命令,因爲它們一般會分配中間緩器,而這很容易生成垃圾內存;
將引用本地緩存到元件中會減少每次在一個遊戲對象中使用 “GetComponent” 獲取一個元件引用的需求;
減少角色控制器移動命令的調用。移動角色控制器會同步發生,每次調用都會耗損較大的性能;
最小化碰撞檢測請求(例如ray casts和sphere checks),儘量從每次檢查中獲得更多信息;
AI邏輯通常會生成大量物理查詢,建議讓AI更新循環設置低於圖像更新循環,以減少CPU負荷;
要儘量減少Unity回調函數,哪怕是空函數也不要留着;(例如空的Update、FixedUpdate函數)
儘量少使用FindObjectsOfType函數,這個函數非常慢,儘量少用且一定不要在Update裏調用;
千萬一定要控制mono堆內存的大小;