首先介紹下draw call(這個東西越少你的游戲跑的越快):
在游戲中每一個被展示的獨立的部分都被放在了一個特別的包中,我們稱之為“描繪指令”(draw call),然后這個包傳遞到3D部分在屏幕上呈現(xiàn)出來。這就和你希望你的親友收到準備好的圣誕禮物需要包裝好然后穿過城市準時放在他應該出現(xiàn)的地方一樣沒什么不同。你的CPU來完成包裝和傳遞他們的活,同時會消耗很多的帶寬,所以最終分配好這些關鍵性資源很重要。目前,真正可怕的事情是從描繪指令消耗遠景開始,每一個獨立的飛濺到地板上的血跡和一個角色或者一具死尸消耗的字節(jié)是一樣的多的:他們都消耗同樣的描繪指令。除此之外,沒有什么更多的差別。
那么如何降低draw call呢??那么我們就用到Culling(剔除)技術。如果不應用這個技術,電腦是不管3721把場景里所有的東西都送去渲染的??吹靡姷囊蹭秩荆床灰姷谜諛右菜腿ヤ秩?。很傻是吧,那咋辦呢。得告訴電腦,那個你
看得見的渲染,看不見的就算了。于是就有了
1.視錐體剔除(Frustum Culling)這個unity系統(tǒng)自帶了好像,就不用操心了。
2.遮擋剔除(Occlusion Culling)
Unity 3專業(yè)版內(nèi)置了一個強大的Occlusion Culling插件Umbra免費的
遮擋剔除(Occlusion Culling)遮擋剔除是一種什么樣的特性呢, 當一個物體被其他物體遮擋住而不在攝像機的可視范圍內(nèi)時不對其進行渲染。.遮擋剔除在3D圖形計算中并不是自動進行的。因為在絕大多數(shù)情況下離camera最遠的物體首先被渲染,靠近攝像機的物體后渲染并覆蓋先前渲染的物體(這被稱為重復渲染,無效渲染"overdraw").遮擋剔除不同于視錐體剔除.視錐體剔除只是不渲染攝像機視角范圍外的物體而對于被其他物體遮擋但依然在視角范圍內(nèi)的物體則不包括在內(nèi).注意當你使用遮擋剔除時你依然受益于視錐體剔除(Frustum Culling).

左邊的場景使用了遮擋剔除.右邊的場景未使用遮擋剔除.
遮擋剔除的運行將通過在場景中使用一個虛擬的攝像機來創(chuàng)建一個物體潛在可視性狀態(tài)(set)的層級.這些數(shù)據(jù)可以讓每個運行時間內(nèi)的攝像機來確定什么能看見什么看不見。通過這些數(shù)據(jù), Unity將確定只把可以看見的物體送去渲染.這將降低draw calls的數(shù)量并提供游戲的運行效率.
occlusion culling的數(shù)據(jù)由單元(cells)組成.每個單元是整個場景范圍數(shù)值的一部分.更多特定的單元來自一個二叉樹(binary tree). Occlusion Culling使用兩個叉,一個給View Cells (靜態(tài)物體)另一個給Target Cells (移動物體). View Cells map給出了一個定義了靜態(tài)可視物體的索引列表 (精確剔除后的靜態(tài)物體).
非常重要的一點是在創(chuàng)建你的物體時要隨時注意,因為你需要在物體的尺寸和單元的尺寸間取得一個好的平衡.理想情況下, you shouldn't have cells that are too small in comparison with your objects but equally you shouldn't have objects that cover many cells.有時你可以通過將大的物體拆成幾個部分來改進遮擋剔除效果.無論如何你仍然能夠?qū)⑿〉奈矬w合并為一體來降低draw calls,在它們都屬于一些小的組件的時候, occlusion culling將不起作用.確定組件中那個是可視的組件的選集和可視信息被認為是PVS (潛在可視狀態(tài)Potentially Visible Set).
Occlusion Culling設置
為了使用遮擋剔除需要進行相關的手動設置.首先 你關卡中的幾何體必須被分割成明顯的不同尺寸的塊.這也有助于布置關卡中小塊的容易定義的區(qū)域 被其他大物體遮擋(例如墻,建筑物) 這意味著每個單獨的mesh被確定是否渲染取決于occlusion數(shù)據(jù).所以如果你有一個物體包含了房間里的所有家具那么所有的家具要么全渲染,要么全不渲染.是否渲染是基于組件而不是基于每個單獨物體自身的。
在檢視面板(Inspector) 你需要標識(tag) 所有需要應用遮擋剔除的場景物體。最快的方法是是將你需要標示為Static的物體作為一個Empty GameObject的子物體并設置這個Empty GameObject為Static,當option出現(xiàn)的時候選擇affect children.當子物體被tagged as Static你可以取消子物體和Empty GameObject的父子關系.

檢視面板中的Static checkbox
下一步點擊Tools->Occlusion Culling.打開Occlusion Culling檢視面板,在面板中你會發(fā)現(xiàn)幾個數(shù)值被調(diào)整過了。這些數(shù)值前面描述過:-
Occlusion Culling - Object

遮擋剔除檢視面板的object標簽.
Object標簽可以讓你創(chuàng)建Occlusion Areas GameObjects.這些區(qū)域讓你指定什么地方你會使用遮擋剔除.
注意:默認情況下如果你不創(chuàng)建任何遮擋剔除區(qū)域,整個場景都會進行遮擋剔除.
Properties
Quick Select
快速選擇和創(chuàng)建一個Occlusion Area并且快速編輯它.
None
這個是默認值.
Create New
創(chuàng)建一個新的Occlusion Area GameObject.
當你點擊Create New in the Quick Select drop down, Unity將自動創(chuàng)建一個Occlusion Area并且刪除默認區(qū)域(整個場景).現(xiàn)在你可以根據(jù)需要開始調(diào)整Occlusion Area(s).

Occlusion Area檢視面板.
Properties
Size
定義Occlusion Area的尺寸.
Center
選擇Occlusion Area的中心. B默認為0,0,0并在box的中心位置.
Is View Volume
定義攝像機的活動范圍區(qū)域.點選這個選項才能應用遮擋剔除在Occlusion Area內(nèi)的靜態(tài)物體.
Is Target Volume
如果你要遮擋剔除運動物體,打開這個選項.
Target Resolution
確定區(qū)域內(nèi)的Occlusion Culling精度.即一個Occlusion Area的單元尺寸.注意:這個選項只對Target Areas(移動物體)起作用.
Low
減少計算時間但同時精度降低.
Medium
計算時間和精度中等,比較平均.
High
計算時間長但精度高.
Very High
精度很高,計算時間更長.
Extremely High
最高精度.注意:計算時間令人發(fā)指。
如果攝像機處于遮擋區(qū)域之外或者任何物體超出區(qū)域,這些物體將不會被遮擋剔除.
Occlusion Culling - Bake

Occlusion culling檢視面板bake tab.
Properties
View Cell Size
每個view area單元的尺寸,尺寸越小遮擋剔除越精確.這個數(shù)值用來平衡遮擋剔除的精度和存儲容量
Near Clip Plane
Near clip plane如果設置最小數(shù)值 那么游戲中所有攝像機都可看到.
Far Clip Plane
Far Clip Plane用于選擇objects.任何物體的距離大于這個設定數(shù)值都會被自動遮擋.(Should be set to the largest far clip planed that will be used in the game of all the cameras)
Quality
品質(zhì)級別
Preview
開發(fā)階段使用這個(ie,不是很準確但可以讓你御覽在游戲中的大致表現(xiàn))
Production
如果開發(fā)基本結(jié)束準備發(fā)布那就該選擇這個(會耗費更多的時間但更精確)
當你調(diào)整完這些數(shù)值后可以點擊Bake按鈕開始處理Occlusion Culling數(shù)據(jù).如果你對結(jié)果不太滿意,你可以點擊Clear按鈕刪除以前的計算數(shù)據(jù).
Occlusion Culling - Visualization

Occlusion culling檢視面板visualization可視 標簽
Properties
Quick Select
讓你快速選擇場景中的任何攝像機來觀看遮擋剔除的效果
The near and far planes定義了一個虛擬攝像機來計算遮擋剔除數(shù)據(jù).如果你有幾個攝像機near或far planes不同,你應該設置near plane和largest far plane distance適配所有攝像機來調(diào)整物體的包括范圍.
所有場景里的物體只在數(shù)值范圍內(nèi)起作用所有請確定你的所有物體都處于可視范圍.
當你準備好生成occlusion data,點擊Bake按鈕.記住在Bake標簽的Quality selection box中事先選擇Preview和Production.? Preview可以快速生成數(shù)據(jù)并可以快速檢查結(jié)果. Production用于產(chǎn)品發(fā)布前的生成和檢測.
請記住遮擋剔除的數(shù)據(jù)計算生成速度取決于事先設置的cell levels(單元級別),數(shù)據(jù)尺寸大小和精度. Unity會在窗口底部顯示PVS運算狀態(tài).
運算處理結(jié)束后,你會在View Area看到一些不同顏色的cube.顏色相同的區(qū)域共享遮擋剔除數(shù)據(jù).
點擊Clear如果你想刪除所有遮擋剔除的事先計算好的數(shù)據(jù)(預計算數(shù)據(jù)).
Moving Objects
如果想應用遮擋剔除到一個運動物體你必須創(chuàng)建一個Occlusion Area然后設定其尺寸來適配運動物體的活動空間(注意:運動物體不能被標示為static).
創(chuàng)建Occlusion Area后,檢查Is Target Volume checkbox來遮擋剔除運動物體.

移動物體的Occlusion Area properties
Size
設定Occlusion Area尺寸.
Center
設定Occlusion Area的中心.默認0,0,0并位于box的中心.
Is View Volume
定義攝像機能到哪里.檢查這個數(shù)值來遮擋剔除Occlusion Area中的static objects? .
Is Target Volume
遮擋剔除運動物體時必選
Target Resolution
確定區(qū)域內(nèi)的遮擋剔除精度。這將決定Occlusion Area的單元尺寸.注意:只對Target Areas起作用.
Low
減少計算時間但同時精度降低.
Medium
計算時間和精度中等,比較平均.
High
計算時間長但精度高.
Very High
精度很高,計算時間更長.
Extremely High
最高精度.注意:計算時間令人發(fā)指。
添加完Occlusion Area后,你需要了解它是如何劃分單元中的box.如果想了解occlusion area如何計算運動物體,你必須在Scene View中點選Target按鈕 并且 關閉View按鈕同時Occlusion Culling檢視面板是打開的.

Selecting Target (moving objects) or View (static objects)讓你御覽calculated data的運作.
Testing the generated occlusion
occlusion設置完畢后,打開Cull Geometry option (in the Occlusion Culling window)并在場景視窗移動Main Camera.

iScene View中的Occlusion View mode
當你在周圍移動Main Camera? (無論是否在Play mode下),你將會看到不同的物體disable.你在這里需要找出的是occlusion data中的任何錯誤.當你移動攝像機時你可能會發(fā)現(xiàn)會有物體突然出現(xiàn)在視野當中.如果這種情況發(fā)生, your options for fixing the error are either to change the resolution (if you are playing with target volumes), or to move objects around to cover up the error. To debug problems with occlusion, you can move the Main Camera to the problematic position for spot-checking.
運算處理結(jié)束后,你會在View Area看到一些不同顏色的cube.藍色cubes表現(xiàn)的是Target Volumes的單元劃分.白色cubes表現(xiàn)的是View Volumes的單元劃分.如果參數(shù)設置正確你會看到一些物體不被渲染.這表示要么這些物體不在攝像機視角范圍內(nèi)要么被其他物體遮擋住了.
如果occlusion完成后,場景內(nèi)任何物體也沒有被遮擋,拆分物體至更小的pieces以便它們能被完整地包含在一個單元中.
要提醒朋友們的是,如果場景復雜,品質(zhì)設置高的話,烘焙過程將漫長的令人發(fā)指。趕緊升級電腦吧?。?!
對于沒有買專業(yè)版并無法使用umbra插件的朋友也不必擔心,還有另外一個Culling剔除插件可以選擇,是完全免費共享的。具體名字忘記了,不過去unity網(wǎng)站的討論版搜一下Culling關鍵詞可以很容易找見。就到這里.就到這里.轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_409cc4b00100oivo.html
LOD(Level-of-detail)是最常用的游戲優(yōu)化技術。如果你的程序可以定制開發(fā)應用LOD的模塊,當然
是很美好的事情。不過如果沒有也沒關系,大家可以使用UniLOD這個第三方的LOD插件。免費共享的哦(向UniLOD開發(fā)者致敬,贊美偉大的共享精神?。。。?/p>

以下是簡介:
功能眾多,涉及到場景管理,模型優(yōu)化,資源管理員,及顯示效果變化,且不需要腳本編寫,全部通過編輯器實現(xiàn)!目前此unity3d擴展為開源的,你可以下載到源代碼來研究學習。
特色:
·1.自動簡化網(wǎng)格體(Windows + Unity Pro only)
根據(jù)用戶的設定自動減面。
·?2.Level-of-detail編輯器
方便快捷的創(chuàng)建LOD組件來切換不同的品質(zhì)級別或通過設定距離數(shù)值來顯示
或隱藏物體。
創(chuàng)建你的LOD場景
方便快捷的用LOD組件來替換現(xiàn)有組件將現(xiàn)有的場景轉(zhuǎn)換為擁有LOD管理的場景。
將單個的mesh和貼圖成組來降低draw calls
將場景存儲為 標準assets或者asset包
·? 3.場景管理
Streaming支持
Stream your scene as the player moves through the world
資源自動loaded/unloaded
Stream from resource folder, or asset bundles
Minimal performance impact with resource buffering
可以根據(jù)需要調(diào)整,速度或者內(nèi)存
Takes care of switching quality levels as the player moves though the world
充分優(yōu)化,使用最少的資源
·?? 4.資源管理
所有asset bundles和普通資源都以標準方式載入。
Keeps reference counts on your resources and自動釋放
·?? 5.完整植入Unity并只需要通過UnityEditor API來操作。
無需輸入代碼
Sorry,場景管理和資源管理的有些內(nèi)容沒搞懂就不亂翻譯了。
鏈接:
http://unity3d8.com/content/lod擴展beta版本發(fā)布unilod-beta-levelofdetail-and-streaming-support
當然,Unity3d自己的地形是自帶LOD功能的,當你刷好你的地形后,你只需要調(diào)整Pixel Error這個
參數(shù)即可。Unity3d會自動計算生成地形的LOD,無需你做其他的任何設置。

要提醒朋友們的是,如果你使用了Lightmap,那么同時使用LOD的時候會有一些麻煩,我們的辦法
是制作模型的時候事先做好第二套uv(不使用Unity的自動計算lightmapUV功能),而且所有LOD的第二套UV的分布位置都一致,很費工。不知道有沒有更好的方法?。?!
轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_409cc4b00100o6qu.html
動態(tài)實時燈光相比靜態(tài)燈光,非常耗費資源。所以除了能動的角色和物體(比如可以被打的到處亂飛的油桶)靜態(tài)的地形和建筑,通通使用Lightmap。
強大的Unity內(nèi)置了一個強大的光照圖烘焙工具Beast,這個東東是Autodesk公司的產(chǎn)品(可怕的壟斷,感覺和3d沾邊的軟件丫都要插一手)。據(jù)說用來制作過殺戮地帶和鏡之邊緣。
要提醒朋友們的是,如果你使用了Lightmap,那么同時使用LOD的時候會有一些麻煩,我們的辦法
是制作模型的時候事先做好第二套uv(不使用Unity的自動計算lightmapUV功能),而且所有LOD的第二套UV的分布位置都一致,很費工。不知道有沒有更好的方法!??!
轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_409cc4b00100o6qu.html
動態(tài)實時燈光相比靜態(tài)燈光,非常耗費資源。所以除了能動的角色和物體(比如可以被打的到處亂飛的油桶)靜態(tài)的地形和建筑,通通使用Lightmap。
強大的Unity內(nèi)置了一個強大的光照圖烘焙工具Beast,這個東東是Autodesk公司的產(chǎn)品(可怕的壟斷,感覺和3d沾邊的軟件丫都要插一手)。據(jù)說用來制作過殺戮地帶和鏡之邊緣。
?-S/<?B

鏡之邊緣建筑場景漂亮干凈的光影,Lightmap的效果。
在Unity中制作Lightmap很方便,調(diào)節(jié)幾個參數(shù)后直接烘焙即可。支持GI,Skylight,
效果一流?。?!當然你需要一臺好點的機器,不然漫長的烘焙過程你就有的等了。
內(nèi)置的光照圖烘焙工具Beast
P場景準備和光照圖烘焙
點選Window --> Lightmapping打開光照圖烘焙面板:
1.確認所有將要被用來烘焙光照貼圖的網(wǎng)格體UVs正確無誤.最簡單的辦法是在mesh import settings中選擇Generate Lightmap UVs選項(由Beast自動分uv)
2.在Object面板中將所有網(wǎng)格體或地形標注為static –這將告訴Unity,這些物體將不會被移動和改變并且可以被賦予光照貼圖。

3.為了控制光照貼圖的精度,進入Bake面板并調(diào)整Resolution的值. (為了更好的了解你的lightmap texels使用情況,在Scene視窗中找到Lightmap Display小窗口并且選擇Show Resolution).

1.點擊Bake按鈕。
2.Unity Editor's會出現(xiàn)一個進度條,位置處于右下角.
3.當烘焙結(jié)束, Lightmap Editor窗口會顯示已經(jīng)烘焙好的光照圖.
Scene和game視圖會同時自動更新–現(xiàn)在你的場景已經(jīng)有了光照圖的效果!
Unity Lightmap的設置還有更詳細和更高端的內(nèi)容,請參考自帶的文檔,那才是王道啊?。。。?!
最近制作的一個野外場景快完工了。阿彌托福?。。?!希望能跑的流暢,千萬別返工?。。?!
為了避免出現(xiàn)杯具,提前研究了一些資料,涉及到Lod技術(Levels of Detail,多細節(jié)層次),
選擇剔除(Culling),光照貼圖(Lightmap)當然還有強大而又脆弱的Unity3d引擎.所有資料都來自互聯(lián)網(wǎng)和Unity自帶的文檔。有些文檔我自己業(yè)余時間翻譯了下,錯誤的地方請朋友們指正。
一.代碼層面。
1.foreach。
Mono下的foreach使用需謹慎。頻繁調(diào)用容易觸及堆上限,導致GC過早觸發(fā),出現(xiàn)卡頓現(xiàn)象。
特別注意的是在Update中如果非必要,不要使用foreach。盡可能用for來代替foreach。會產(chǎn)生GC Alloc,說明foreach調(diào)用GetEnumerator()時候有堆內(nèi)存上的操作,new和dispose。
2.string修改。
如果熟悉C++的話,就會了解,每次使用string的時候,都要在內(nèi)存中創(chuàng)建一個新的字符串對象,就需要為該新對象分配新的空間。 特別是在循環(huán)中需要修改string對象,就會頻繁的分配新的空間,這時候推薦使用StringBuilder.Append等操作來處理。C++中通常也是通過分配一個固定的字符內(nèi)存來處理字符串的操作。
3.gameObject.tag
gameObject.tag 會在內(nèi)部循環(huán)調(diào)用對象分配的標簽屬性以及拷貝額外的內(nèi)存,推薦使用gameObject.CompareTag("XXX")來代替.tag。
4.使用ObjectPool對象池來管理對象,避免頻繁的Instance,Destroy。
二.貼圖層面。
代碼上的內(nèi)存優(yōu)化,很大層面上都不及貼圖上的優(yōu)化。有時候改一張圖就幫你省了大幾兆的內(nèi)存。
1.巧妙通過調(diào)整紋理資源,來調(diào)整圖的大小。比如:通過9宮格、部分縮小后Unity里在拉大等方式。
比如:(主要調(diào)整了兩個小元素)就省了一半的內(nèi)存。
2.Ios平臺使用PVRT壓縮紋理。Adroid平臺使用ETC1格式壓縮。均可以減至1/4的內(nèi)存大小。優(yōu)化非常明顯。
目前主流的Android機型基本都支持ETC1格式壓縮。但ETC1只能支持非Alpha通道的圖片壓縮。所以一般把Alpha通道圖分離出來,繪制到GPU顯存時,a值從Alpha圖里獲取,無Alpha通道的圖就可以使用ETC1壓縮。
而ETC2以上的格式壓縮雖然支持含Alpha通道的圖片,但是支持的機型還比較少。目前不推薦使用。未使用ETC1壓縮前的內(nèi)存占用大小1024*1024的png圖占用10.7M(包含了Editor中的內(nèi)存占用,以及mip map內(nèi)存占用)。
mipMap是攝像機離得遠近用不同的圖片,3D游戲中用內(nèi)存換性能的一種有效方式。它會將大圖變成若干小圖,存儲內(nèi)存中,當攝像機離的比較遠的時候,只需使用小圖。
UI、2D場景可以把Texure這個設置去掉。這樣實際游戲中未壓縮紋理1024×1024的圖在內(nèi)存中占用是4M。(Unity Profiler下看應該是8M)使用ETC1壓縮后,場景圖片一張大小只有1.3MB,加上通道圖2.6M。幾乎是用來的1/4。甚至文件的大小也小了1/4。
3.通過減色的方式減少圖片大小。很多UI其實使用的色彩很少,用不到256色。這類圖片就可以進行減色壓縮。三.框架設計層面。
一個相對中大型的游戲,系統(tǒng)非常的多。這時候合理的適時的釋放內(nèi)存有助于游戲的正常體驗,甚至可以防止內(nèi)存快速到達峰值,導致設備Crash。
目前主流平臺機型可用內(nèi)存:
Android平臺:在客戶端最低配置以上,均需滿足以下內(nèi)存消耗指標(PSS):
1)內(nèi)存1G以下機型:最高PSS<=150MB
2)內(nèi)存2G的機型:最高PSS<=200MB
iOS平臺:在iPhone4S下運行,消耗內(nèi)存(real mem)不大于150MB
1.場景切換時避開峰值。
當前一個場景還未釋放的時候,切換到新的場景。這時候由于兩個內(nèi)存疊加很容易達到內(nèi)存峰值。解決方案是,在屏幕中間遮蓋一個Loading場景。在舊的釋放完,并且新的初始化結(jié)束后,隱藏Loading場景,使之有效的避開內(nèi)存大量疊加超過峰值。
2.GUI模塊加入生命周期管理。主角、強化、技能、商城、進化、背包、任務等等。通常一個游戲都少不了這些系統(tǒng)。但要是全部都打開,或者這個時候再點世界地圖,外加一些邏輯數(shù)據(jù)內(nèi)存的占用等等。你會發(fā)現(xiàn),內(nèi)存也很快就達到峰值。
這時候有效的管理系統(tǒng)模塊生命周期就非常有必要。首先將模塊進行劃分:
1)經(jīng)常打開 Cache_10;
2)偶爾打開 Cache_5;
3)只打開一次 Cache_0。
創(chuàng)建一個ModuleMananger 類,內(nèi)部Render方法每分鐘輪詢一次。如果是“Cache_0”這個類型,一關閉就直接Destroy釋放內(nèi)存;“Cache_10”這個類型為10分鐘后自動釋放內(nèi)存;" Cache_5"這種類型為5分鐘后自動釋放內(nèi)存。每次打開模塊,該模塊就會重新計時。這樣就可以有效合理的分配內(nèi)存。