0.如果你做了一個圖集是1024X1024的。此時你的介面上只用了圖集中的一張很小的圖,那麼很抱歉1024X1024這張大圖都需要載入你的記憶體裡面,1024就是4M的記憶體,如果你做了10個1024的圖集,你的介面上剛好都只用了每個圖集裡面的一張小圖,那麼再次抱歉你的記憶體直接飆40M。意思是任何一個4096的圖片,不管是圖集還是texture,他都佔用4*4=16M。
1、頂點效能
一般來說,如果您想在iPhone 3GS或更新的裝置上每幀渲染不超過40,000可見點,
那麼對於一些配備 MBX GPU的舊裝置(比如,原始的 iPhone,如 iPhone 3g和 iPod Touch第1和第2代)來說,你應該保證每幀的渲染頂點在10000以下。
2、光照效能
像素的動態光照將對每個受影響的像素增加顯著的計算開銷,並可能導致物體會被渲染多次。
為了避免這種情況的發生,您應該避免對於任何單個物體都使用多個像素光照,並儘可能地使用方向光。
需要注意的是像素光源是一個渲染模式(Render Mode)設定為重要(Important)的光源。
像素的動態光照將對頂點變換增加顯著的開銷。所以,應該盡量避免任何給定的物體被多個光源同時照亮的情況。
對於靜態物體,採用烘焙光照方法則是更為有效方法。
3、角色
每個角色盡量使用一個Skinned Mesh Renderer,這是因為當角色僅有一個 Skinned Mesh Renderer 時,
Unity 會使用可見度裁剪和包圍體更新的方法來最佳化角色的運動,而這種最佳化只有在角色僅含有一個 Skinned Mesh Renderer時才會啟動。
角色的面數一般不要超過1500,骨骼數量少於30就好,角色Material數量一般1~2個為最佳。
4、靜態物體
對於靜態物體定點數要求少於500,UV的取值範圍不要超過(0,1)區間,這對於紋理的拼合最佳化很有協助。
不要在靜態物體上附加Animation組件,雖然加了對結果沒什麼影響,但是會增加CPU開銷。
5、攝像機
將遠平面設定成合適的距離,遠平面過大會將一些不必要的物體加入渲染,降低效率。
另外我們可以根據不同的物體來設定攝像機的遠裁剪平面。Unity 提供了可以根據不同的 layer 來設定不同的 view distance ,
所以我們可以實現將物體進行分層,大物體層設定的可視距離大些,而小物體層可以設定地小些,
另外,一些開銷比較大的實體(如粒子系統)可以設定得更小些等等。
6、DrawCall
儘可能地減少 Drawcall 的數量。 IOS 裝置上建議不超過 100 。
減少的方法主要有如下幾種: Frustum Culling ,Occlusion Culling , Texture Packing 。 Frustum Culling 是 Unity 內建的,我們需要做的就是尋求一個合適的遠裁剪平面;
Occlusion Culling ,遮擋剔除, Unity 內嵌了 Umbra ,一個非常好 OC 庫。
但 Occlusion Culling 也並不是放之四海而皆準的,有時候進行 OC 反而比不進行還要慢,
建議在 OC 之前先確定自己的情境是否適合利用 OC 來最佳化; Texture Packing ,或者叫 Texture Atlasing ,
是將同種 shader 的紋理進行拼合,根據 Unity 的 static batching 的特性來減少 draw call 。
建議使用,但也有弊端,那就是一定要將情境中距離相近的實體紋理進行拼合,否則,拼合後很可能會增加每幀渲染所需的紋理大小,
加大記憶體頻寬的負擔。這也就是為什麼會出現“ DrawCall 降了,渲染速度也變慢了”的原因。
7.1.粒子系統運行在iPhone上時很慢,怎麼辦。
答:iPhone擁有相對較低的fillrate 。
如果您的粒子效果覆蓋大部分的螢幕,而且是multiple layers的,這樣即使最簡單的shader,也能讓iPhone傻眼。
我們建議把您的粒子效果baking成紋理順序圖表。
然後在運行時可以使用1-2個粒子,通過動畫紋理來顯示它們。這種方式可以取得很好的效果,以最小的代價。
最佳化:
1. 更新不透明貼圖的壓縮格式為ETC 4bit,因為android市場的手機中的GPU有多種,
每家的GPU支援不同的壓縮格式,但他們都相容ETC格式,
2. 對於透明貼圖,我們只能選擇RGBA 16bit 或者RGBA 32bit。
3. 減少FPS,在ProjectSetting-> Quality中的
VSync Count 參數會影響你的FPS,EveryVBlank相當於FPS=60,EverySecondVBlank = 30;
這兩種情況都不符合遊戲的FPS的話,我們需要手動調整FPS,首先關閉垂直同步這個功能,然後在代碼的Awake方法裏手動設定FPS(Application.targetFrameRate = 45;)
降低FPS的好處:
1)省電,減少手機發熱的情況;
2)能都穩定遊戲FPS,減少出現卡頓的情況。
4. 當我們設定了FPS後,再調整下Fixed timestep這個參數,
這個參數在ProjectSetting->Time中,目的是減少物理計算的次數,來提高遊戲效能。
5. 盡量少使用Update LateUpdate FixedUpdate,這樣也可以提升效能和節省電量。
多使用事件(不是SendMessage,使用自己寫的,或者C#中的事件委託)。
6. 待機時,調整遊戲的FPS為1,節省電量。
7. 圖集大小最好不要高於1024,否則遊戲安裝之後、低端機直接崩潰、原因是手機系統版本低於2.2、超過1000的圖集無法讀取、導致。
2.2 以上沒有遇見這個情況。
注意手機的RAM 與 ROM、小於 512M的手機、直接放棄機型適配。
VSCount 垂直同步
unity3d中建立一個情境空的時候,畫面播放速率(FPS總是很低),大概在60~70之間。
一直不太明白是怎麼回事,現在基本上明白了。我在這裡解釋一下原因,如有錯誤,歡迎指正。
在unity3D中當運行情境開啟Profiler的時候,我們會看到VSync 這一項佔了很大的比重。
這個是什麼呢,這個就是垂直同步,稍後再做解釋。
我們可以關閉VSync來提高畫面播放速率,選擇edit->project settings->Quality。
這就關閉了VSync(垂直同步),現在在運行情境看看,畫面播放速率是不是提高很多。
現在來說說什麼是垂直同步,要知道什麼是垂直同步,必須要先明白顯示器的工作原理,
顯示器上的所有映像都是一線一線的掃描上去的,無論是隔行掃描還是漸進式掃描,
顯示器都有兩種同步參數——水平同步和垂直同步。
什麼叫水平同步。什麼叫垂直同步。
垂直和水平是CRT中兩個基本的同步訊號,水平同步訊號決定了CRT畫出一條橫越螢幕線的時間,
垂直同步訊號決定了CRT從螢幕頂部畫到底部,再返回原始位置的時間,
而恰恰是垂直同步代表著CRT顯示器的重新整理率水平。
為什麼關閉垂直同步訊號會影響遊戲中的FPS數值。
如果我們選擇等待垂直同步訊號(也就是我們平時所說的垂直同步開啟),
那麼在遊戲中或許強勁的顯卡迅速的繪製完一屏的映像,但是沒有垂直同步訊號的到達,
顯卡無法繪製下一屏,只有等85單位的訊號到達,才可以繪製。
這樣FPS自然要受到作業系統重新整理率運行值的制約。
而如果我們選擇不等待垂直同步訊號(也就是我們平時所說的關閉垂直同步),那麼遊戲中作完一屏畫面,
顯卡和顯示器無需等待垂直同步訊號就可以開始下一屏映像的繪製,自然可以完全發揮顯卡的實力。
但是不要忘記,正是因為垂直同步的存在,才能使得遊戲進程和顯示器重新整理率同步,使得畫面更加平滑和穩定。
取消了垂直同步訊號,固然可以換來更快的速度,但是在映像的連續性上勢必打折扣。
這也正是很多朋友抱怨關閉垂直後發現畫面不連續的理論原因。
合并材質球unity 3d中每倒入一次模型就多一個材質球,可我的這些模型都是共用一張貼圖的就想共用一個材質球,所以每次都要刪除再附上,很麻煩。怎麼才能合并這些材質球。
採用TexturePacking吧
1、遍曆gameobject,取出material,並根據shader來將material分類
2、調用Unity內建的PackTextures函數來合并每個shader分類中的material所對應的textures(PackTextures函數有缺陷,不過可以將就用)
3、根據合并的大的texture來更新原有模型的texture、material已經uv座標值。
需要注意的是:需要合并的紋理應該是物體在情境中距離相近的,如果物體在情境中的距離較遠,
則不建議合并紋理,因為這樣做很有可能非但起不到最佳化的作用,反而降低了運行效率。
======================分割線==================
角色Material數量
2-3個
骨骼數量
小於30個
面片數量
300-1500
一般角色應該沒有IK結點
這是因為角色的動作大多數都是事先設定好的,並不需要經過IK操作來進行即時計算(Rogdoll除外),所以在模型匯入時,不要將IK結點一起匯入。
2、靜態實體 不要附加Animation Component
在靜態實體上附加Animation組件雖然對結果沒有影響,但卻會增加一定的CPU開銷來調用這一組件,所以盡量去掉該組件。
網格頂點數
小於500
UV值範圍盡量不要超過(0, 1)區間
盡量保證UV值不越界,這對於將來的紋理拼合最佳化很有協助。
3、地形 地形的解析度大小
長寬均盡量小於257。這是因為地形太大,會造成大量頂點資料,給你的記憶體頻寬造成一定的影響,在目前的ios裝置中,記憶體頻寬是非常有限的,需要盡量節省。同時,如果用Unity內建的地形,一定也要使用Occlusion Culling,因為Unity的刷地形工具雖然方便,但卻是framekiller,刷過之後,你會發現drawcall增加的非常多。
混合紋理數量
不要超過4。地形的混合操作是很耗時的,應該盡量避免。能合并的紋理盡量合并。
4、紋理 紋理格式
建議png或tga。不用轉成ios硬體支援的PVRTC格式,因為Unity在發布時會幫你自動轉的。
紋理尺寸
長寬小於1024。同時應該儘可能地小,夠用就好,以保證紋理對記憶體頻寬的影響達到最小。
支援Mipmap
建議產生Mipmap。雖然這種做法會增加一些應用程式的大小,但在遊戲運行時,系統會根據需求應用Mipmap來渲染,從而減少記憶體頻寬。
檢查Alpha值
如果紋理的alpha通道均為1,則用RGB的24位紋理來代替RGBA的32位紋理。(據說Unity內部會進行自動檢測)
5、光源 光源“Important”個數
建議1個,一般為方向光。“Important”個數應該越小越少。個數越多,drawcall越多。
Pixel Light數目
1-2個。
6、粒子特效 螢幕上的最大粒子數