Unity Tips 若干

http://blog.csdn.net/yuxikuo_1/article/details/50620336
轉載自:http://www.gopedu.com/group/3/thread/232?type=all&sort=desc
Asset Bundle工做流程及人物換裝實例 – 劉剛html

Unity內部的資源有兩種(斯斯有兩種?):瀏覽器

Resources:有10年曆史,儘可能用Asset Bundle
Asset Bundle:暱稱AB,現今Unity處理資源的中心安全

AB選項的差別性能優化

透過Web Player下載Asset Bundle的Cache須要收費,在iOS,Android的Cache不需收費。—>手持遊戲卯起來用!!!ide

瀏覽器自己也有Cache,爲什麼要用Unity的Cache?工具

由於存在Cache裏面是解壓狀態,下次調用不需再解壓一次,大省CPU時間。
Unity會管理Cache大小,壓縮檔案解壓後會丟掉。性能

Browser就只能存壓縮狀態的Asset Bundle,並且位置每種Browser都不一樣。–>有付錢有差AssetBundle.CreateFromMemory:大多數用在對內容做加解密,沒法Cache,也就是每次執行都要下載一次,Script也可加密優化

AssetBundle.CreateFromFileui

AssetBundle.Load與Application.Load的差別,Application.Load只能Load StreamAsset裏面的東西。
每開一個www用來下載AssetBundle,就要用掉8MB的Buffer,因此www下載完要做如下動做來清掉那8M:加密

WWW.Dispose
AssetBundle.Unload(false)
Resources.UnloadUnusedAsset

AssetBundle能夠做Dependency!!!
BuildPipeline.PushAssetDependencies,把資源推動去
BuildPipelinePopAssetDependencies,把資源彈出來

假設Push如下資源:A,B,C,透過Push&Pop,能夠產生3個Packege,C依賴B,A,B依賴A,A獨立的Asset Bundles,徹底不會重複包資源!
在一個Prefab裏面會有Mesh,Material,Shader,Texture,Script,都應該分開包,Load的時候再按照順序Load回來,再配合上Cache機制,已經下載過的Asset Bundle就不需再下載一遍,能夠達到資源、頻寬的最佳使用–>不過這個資源相依的邏輯必需要設計清楚,不然會很亂

官方的實務建議是每一個Asset Bundle在1M左右,過小下載次數會過多,太大下載時間太久。

能夠把Script放在ScriptObject裏面,再透過Asset Bundle載回來,如此就不需必定要將Script放在第一包。

官方Demo案例,透過Dependency的使用可將131MB大小縮成8.2M!
角色紙娃娃的處理方式,能夠參考Unity提供的Character Customization範例,看裏面如何拆分Asset Bundle。

地圖處理方式,能夠把地圖拆成多個子場景,在主角移動時即時下載,即時顯示。
Asset Bundle有CRC機制,若是下載有問題會自行從新下載

Code安全性
iOS平臺封閉,不需擔憂(JB就再說)
其餘平臺可用Asset Bundle + 把Code做成.NET Assembly + AssetBundle.CreateFromMemory加解密來做

Web不適用於把code包成Native DLL的形式
大規模場景的資源拆解和動態載入-張鑫

進入場景所有載入,耗時,玩家根本沒走到
Unity場景只有支援4096X4096,單位公尺,沒辦法做更大的場景

拆分有兩種:

地形資源拆分
地表拆分

推薦拆分工具:Terrain Composer,最大能夠拆8×8,每塊大小2000×2000,也就是16000×16000,也就是16kmX16km

若是地形早就已經編好一堆了,該怎麼辦?自行拆
地形資源怎麼拆?先生成空的NxN的Terrain

Terrain Data:把Data放到對應分塊–>大工程
Light map:用Free Image來拆light map的.exr檔案,Free Image有提供C++ Native DLL
LOD:從新把每一塊Terrain做Terrain.SetNeighbors

地表資料怎麼拆?

根據地形分塊來拆
用以前提到AssetBundle Depedency的方式打包

一包在1M左右
拆好了, 如何顯示?

AssetBundle太大,在進場景就先Load
攝影機移動時,載入以攝影機爲中心那一個的九宮格,其餘的就釋放掉,確保記憶體使用量,兼顧效率。

避免頻繁的Instantiate,Destroy,形成拉機(?)回收機制太頻繁(平均要10幾ms),可用Object Pool。
避免開多個www同時下載,耗記憶體,www是使用Thread,會加大系統負擔。

Coroutine也不要開太多,官方建議一個Coroutine循序下載多個Resource
載入時間比較:

Shader,Material:載入時間最久,主要在Parse內容進GPU,建議先載進來,反正不佔記憶體。這也是Demo案例1xFPS到5xFPS的關鍵。–>第一次提到
Texture,Particle

Mecanim,Audio
Object Pool範例請參考AngryBot裏面的×××

現場Demo拆分後的場景,畫面精細度很好,地圖超過4096×4096,飛機一邊飛一邊動態下載AssetBundle後顯示地形,FPS在50以上,在主流手機上也順暢。
使用Unity引擎開發3D網頁遊戲 – 劉剛

改Loading Unity顯示的Logo,unityObject.embedUnity,設定parameter for 3.4
UnityObject2(params),改params for 4.X

要彈出新視窗,OpenUrl不行,ExternalEval不行,要用html的iFrame/div,也可用rokbox,

Unity對DB,用WWWForm做Post,用WWW做GET–>直接讀寫DB有點瞎

Web遊戲內容保護:

code加密:把Code包成Asset Bundle後,存成TextAsset,再包成AssetBundle(For Cache!),取用時要用Reflection取用,極難用。
code混淆:推薦做法,Web平臺要官方幫忙,Android能夠本身做,iOS據說不用做

資源加密:最須要的是Texture,可加密後存成TextAsset,記得再包成AssetBundle才能用Cache。
記憶體Leak,4.1.2的Profile能夠看到全部GameObject的狀態,請多用Profiler

動態載入,用ScriptableObject定義場景描述檔,記錄Dependency,然後根據這些資料來載場景內容。
Coroutine在Unity不是Multi Thread,多用仍是會拖Main Thread,請慎用。

在一個新場景或新關卡,把Material與Shader先Load出來,放到一個空的GameObject裏面,然後Diactive,有須要在放到正確的地方。–>第二次提到
AssetBundle打包顆粒度,Debug能夠包越小越好,Release建議1MB
封住右鍵功能,防止使用者更換Unity Player版本。

從放遊戲的Web Server上取其餘URL的資源,要設定CrossDomain.xml
若是不用Asset Bundle,自行做壓縮解壓縮,必定要在載下來的時候立刻解壓縮,並且用AssetBundle.CreateFromMemory,耗時。–>AssetBundle的確是要Load才須要解壓…

Material,Shader先打包吧!–>這應該算第三次提到吧?由於很重要因此要講三次??
Unity的網路解決方案

很是好睡zzzzz

Photon Server:C#界面,底層用C++實做,可負荷30K同時在線,Load Balance機制,有FPS範例,用TCP與RUDP,只能用Windows。
SmartFox Server,Java實做,可用Windows/Linux,沒有Load Balance,提供多種監控與管理界面。
用RakNet本身做

Unity引擎的性能優化 – 張鑫

Mobile優化
300~2000個Polygon

Skinned Mesh Renderer同時最多一個
Texture數量同時1~3

bone數量<30
Static Object
< 500 poly
標記Static
不要用Animation

地形:Texture數量<4,用Texture融合,可加5fps~10fps

Texture格式

用png, tga
不要超過1024
看起來像就好,能夠用128×128,就不要用256×256

用mipmap
控制UV範圍在(0, 1)–>原來還能夠超過?
Mesh簡化,用MeshLab,但只能簡化靜態Mesh。用Simplygon,

Mesh簡化,Animation簡化,用Simplygon,要錢,效果好。
不要用System.xml用mono.xml,減小程式碼大小
Forwarding Light原理,要draw的Object數量X光源數,因此光源越少越好。

把Pixel Light設定固定值,美術再多光也只有一個。
粒子在Mobile平臺,是以Block爲單位Render,太多粒子會加高像素填充率,由於粒子沒有深度,因此必定要畫,Mobile平臺的功率不夠就會大大拖效能。
粒子小一點

粒子數量<50
粒子不要有Alpha
粒子不要碰撞

儘可能不使用Mesh Colider,用Box,CapsuleCollider
Animation部分

沒須要不用Animation,不須要每一個東西都會動
沒有縮放,手動或程式做業把Scale Curve去掉,能夠減小33% Blending做業

Mecanim是多緒執行,不會拖Main Thread,一個Game Object上多個Animation clip纔有用,若是隻有一個clip,可考慮只用Animation
用Body Mask告訴Mecanim哪邊不須要計算

Renderer部份

避免Alpha Test,Alpha Blend

Static Batching須要大量的VertexBuffer,若是Vertex過多,要把一堆Vertex搬來搬去,反而拖效能
Dynamic Batching在Polygon < 900會自動做用,若是GameObject的Shader有Position,Normal,UV,每多用一個,900就要減半。

在使用Dynamic Batching時,Vertex只能在CPU做結合,因此Vertex不能太多
若是同一場景中小塊Texture不少,能夠考慮用程式將Texture拼合,要拼合的Texture若是UV超過(0, 1)就很難做。

Mobile平臺的Occlusion Culling適合用PVS and dynamic objects
用for代替foreach,由於foreach會生一堆Iterator

用Struct代替class,快30倍
傳說中8小時必定回信的高級email support

影子的優化,可參考ShadowGun模擬影子的實做接下來Unity的Roadmap會支援新UI(講很久了)與Server。

相關文章
相關標籤/搜索