1. 程式人生 > >(轉)2014Unity亞洲開發者大會會議簡錄之技術篇

(轉)2014Unity亞洲開發者大會會議簡錄之技術篇

拖公司的福,有幸去了一趟北京參加了一場Unity3D的交流盛宴,在為期兩天的時間內,不僅有著技術上收穫,也有心靈上的震撼。現在先來說說技術方面的一些比較重要的知識,但是會跳過Unity3D後續版本的一些新功能介紹,比如新的GUI、動畫系統的加強、以及新的AssetBundle打包工具。因為等之後版本出來後,自然會有更加詳細的文件以及說明出來。

專案開發、管理和釋出策略

四大準則

  • 準則一:美術資源量對於程式釋出包大小、效能優化、記憶體佔用量的影響,往往超過其他各種因素
    • 技術美術和關卡設計師對於遊戲效能承擔著非常重要的責任
    • 程式設計師往往無法補救由於濫用美術資源而造成的效能問題
  • 準則二:專案團隊應該通過編寫工具來保證美術資源的合法性
    • 美術規範文件無法在實際上保證美術資源的合法性
    • 程式設計師應該通過Unity編輯器擴充套件技術,為美術師實現完整的美術資源合法性檢查工具
  • 準則三:對渲染效率和記憶體佔用的優化應該在專案實施過程中反覆進行
    • 針對CPU端/遊戲邏輯的優化往往能夠比針過GPU端/Shader的優化取得更大的作用
    • GPU/Shader的效能優化應該放在最後進行
    • 善用Unity Profilers (這點非常重要,後面會有對這個功能的詳細講解)
  • 準則四:從反向工程的角度理解專案開發,以最終需要達到的目的來決定程式的架構設計以及關鍵技術的方案選擇
    • 是否需要進行程式碼的增量更新
    • 是否需要嚴格控制程式釋出包的大小
    • 是否需要支援低端移動裝置等等

Mipmaps

  • 凡是3D場景,都應該儘可能啟用MipMaps

    耗費記憶體,提升CPU

硬體分級策略

  • 為什麼進行分級
    • 移動GPU之間的效能差距可能高達10倍以上
    • 效率和效果之間永遠存在著矛盾
  • 怎麼分級
    • Resolution解析度
    • Post-processing 後期特效
    • MSAA 反鋸齒
    • Anisotropy 異向紋理
    • Shaders
    • Fx/particles density, on/off 粒子發射器的數量、密度。單人和多人的不同處理

初級記憶體管理策略

一個遊戲可以使用的記憶體容量簡單的可以理解為:可用記憶體為整個記憶體的%50。比如512M的內在可以使用256M。

  • 控制貼圖大小
  • 選擇合適的壓縮格式
    • PVRTC,DXT,ATC,ETC
  • 使用Prefabs
  • 用好AssetBundles
  • 編寫自己的ObjectPool和LoadManager
    • 通過物件池來避免記憶體的頻繁操作,從而避免記憶體碎片影響到大記憶體塊的申請;切換場景時不釋放公共的UI資源
    • 通過LoadManager,保證在同一時間段內公載入一個www物件,實現順序載入

AssetBundle

老的AssetBundle打包的時候有比較多的弊端,依賴打包的時候很麻煩。一個包改變了,相關聯的包都要重新打一次包,這個過程會嚴重的影響開發效率。這個問題在Unity 5.0會得到解決

AssetBundle的效率比Resources效率要低。這是沒辦法的事

Profiler 效能分析器

Unity3D提供了一個非常強大、非常易於使用的效能分析器,在平常的使用過程中或多或少都會碰到一些搞不明白的地方,這一次官方給了一個比較詳細的解答。一些簡單的功能就不在此介紹了,一看就懂。

重要的引數指標:

  • GC Alloc

    記錄了遊戲執行時程式碼產生的堆記憶體分配,這是一個非常重要的引數,甚至比Time更加重要。ManagedHeap的增大,會加速GC回收的到過。如果這個引數有一個比較高的值或者出現在每一幀中,那麼就要引起重視。以下是一些不太引起注意的地方引起的GC分配:

    • GameObject.GetComponet()會引起GC的分配
      • 儘量快取元件
    • Object.get_name()
      • 如果每一幀都需要比較,可以快取名字
    • foreach迴圈
      • 每次foreach會產生一個enumerator
    • 儘可能避免使用LINQ
      • 部分功能無法在某些平臺上使用
      • 會分配大量GC Alloc
    • 協程Coroutine
      • 開啟一個協程,至少分配373的記憶體
    • String連線

      • 使用StringBuilder或String.Format來代替而不是用”+”來進行連線

      關注原則:

    • 檢測任何一次性記憶體分配大於2KB的選項

    • 檢測每幀都具有20B以上記憶體分配的選項
  • Time

    記錄了遊戲執行時的每幀cpu戰勝。當然是越小越好,如果佔用過大那就找原因吧。

  • CPU Usage

    • WaitForTargetFPS
      • vSync功能所致或者幀數限制
    • Overhead
      • 所有無法統計的時間總和,理論值應該為0.
    • Physics.Simulate
      • 物理模擬佔用的CPU
    • Camera.Render
      • 相機渲染準備工作的CPU佔用量
    • RenderTexture.SetActive 設定RenderTexture操作(和相機數一致)
      • 比對當前幀與前一幀的ColorSurface和DepthSurface
      • 如果一致則不生成新的RT, 否則則生成新的RT,並設定與之相對應的Viewport和空間轉換矩陣
    • GUI.Repaint
      • GUI的重繪,使用的Unity3D自帶的GUI,極度不推薦使用
    • Cleanup Unused Cached Data

      清空無用的快取資料,主要包括RenderBuffer的垃圾回收和TextRendering的垃圾回收

      • RenderTexture.GarbageCollectTemporary

        存在於RenderBuffer的垃圾回收中,清楚臨時的FreeTexture

      • TextRendering.Cleanup

        TextMesh的垃圾回收操作

    • Application.Integrate Assets in Background

      遍歷預載入的執行緒佇列並完成載入,同時,完成紋理的載入、Substance的Update等。主要是載入場景的時候會用到,多執行緒載入

    • AssetBundle.LoadAsyncIntegrate

      多執行緒載入AssetBundle的資源

    • Loading.AwakeFromLoad

      在資源載入時會用到,對每種資源進行處理

  • GPU Usage

    • Mesh.DrawVBO

      GPU中關於Mesh的Vertex Buffer Object的渲染耗時

    • Shader.Parse

      資源加入後引擎對Shader的解析過程

    • Shader.CreateGPUProgram

      根據當前裝置支援的圖開庫資訊來建立GPU工程

  • Profiler需要時刻關注的引數

    • CPU—GC Alloc
    • CPU—Time
    • MemoryProfiler—Other

      • ManagedHeap.UsedSize

        移動遊戲建議不超過20M

      • WebStream

        通過WWW載入留下的東西,一般會比SerializedFile大得多。包括壓縮和解壓的東西

      • SerializedFile

        通過WWW等方式載入本地的AssetBundle的留下的序列化檔案,看是否被解除安裝掉

    • MemoryProfiler—Assets
      • 檢視是否有重複的資源
    • Device.Present
      • GPU的Presentdevice確實非常耗時,一般出現在使用了非常複雜的Shader等;
      • GPU執行的非常快,而由於Vsync的原因,使得它需要等待較長時間;
      • 同樣是VSync的原因,但其他執行緒非常耗時,所以導致該項等待時間很長,比如過量的assetbundle載入時容易出現該問題
    • Shader.CreateGPUProgram
    • StackTraceUtility.PostprocessStackTrace() StackTraceUtility.ExtractStackTrace()

      Debug.Log()除錯資訊造成,這是一個很耗時間的操作。釋出的時候儘量去掉

    • GarbageCollectAssetsProfile

      引擎在執行UnloadUnusedAssets操作

  • 總結

    授人以魚,不如授人以漁。技術的進步是無止境的,大部分的時候都需要我們自己去解決問題,只有方法才是真正的解決問題之道。

    • 善用、活用Profiler!

      • 經常使用Profiler為專案來進行體驗
      • 通過Profiler.BeginSample和Profiler.EndSample來自定義檢查範圍
    • 關注CPU & Memory Profiler

      • GC Alloc、 Time、 Assets、WebStream…

    其他

  • Andriod版本無法連線Profiler除錯
    • adb forward tcp:54999 localabstract:Unity-\
    • 再次選擇AndriodProfiler([email protected]:54999)

相關推薦

2014Unity亞洲開發者大會會議技術篇

拖公司的福,有幸去了一趟北京參加了一場Unity3D的交流盛宴,在為期兩天的時間內,不僅有著技術上收穫,也有心靈上的震撼。現在先來說說技術方面的一些比較重要的知識,但是會跳過Unity3D後續版本的一些新功能介紹,比如新的GUI、動畫系統的加強、以及新的AssetBundle打包工具。因為等之後版本出來後

軟件產品化,國內IT人

人才 行業 復雜 指導 大型網站 在一起 分解 世界 品牌 記得在網上看過一則印度軟件的有趣故事,意思是先從印度6個不同城市的軟件公司中選出6位軟件開發人員,出一道千行程序的題目,讓6位開發人員分別開發,最終拿出來的6個程序竟然完全一樣;另一個測試是,將一個千行程序分成六段

申請付費蘋果開發者賬號 注意事項及流程

一、基礎知識 蘋果開發者賬號分為 個人(individual),公司(company),企業(enterprise)三種類型。個人賬號只能有一個開發者,公司賬號允許多個開發者協作開發,企業賬號其App只能用於內部員工使用,是無法對外公開的。所以,通常情況下大家都是選擇個

遊戲開發者的福音

遊戲行業是國家大力發展的朝陽產業,具有廣闊的發展前景,尤其是程式設計師職位,更是一將難求。 IIEEG順應發展潮流,引進了國外先進的遊戲開發技能培訓體系,希望為中國遊戲行業的良性發展輸送源源不斷地遊戲開發高階人員。 IIEEG憑藉強大的行業技術優勢和資源優勢,為喜歡程式設計、

web開發流程

ctu 圖片 hit 處理 隨著 使用 一個bug 原型開發 href a、項目經理與公司決策層的溝通,以確定這個需求有沒有足夠的人手和可行性去實現,以及與現有產品的依存關系。  b、公司決策層與市場/策劃部門的交流,這個過程將進行的相當充分,並且是反復、長期的,它致力於

少是指數級的多

管理 blank 自己 als 參數模板 ria tube temp 謝謝 轉自 http://www.oschina.net/news/30584 原文 Less is exponentially more 是 Rob Pike 自己整理的他在六月22日,舊金山的 G

Html中嵌套其他HTML文件的幾種方法

java mar net rip gin bsp ace wid style 給大家整理了3個方法,一個是HTML的iframe標簽,別兩個是JS引用。比如要在arr.html文件裏引用index.html文件,方法如下。 HTML引用方法: <iframe na

centos7 用yum安裝mysql

unity 文件 設置密碼 highlight yum oca 網上 get r文件 CentOS 7的yum源中貌似沒有正常安裝mysql時的mysql-sever文件,需要去官網上下載 # wget http://dev.mysql.com/get/mysql-

關於ES6的 模塊功能 Module 中export import的用法和註意

關於 tle from tool spa 尋找 import 其它 模塊 關於ES6的 模塊功能 Module 中export import的用法和註意之處 export default 的用法 export default命令用於指定模塊的默認輸出。顯然,一個模塊

Maven的安裝文字版Windows/Linux/Mac

版本 驗證 系統路徑 strong jdk1 編譯 found 編譯器 opts 以下內容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/maven_environment_setup.html

mysql創建表時反引號的作用

navi _id sta gbk ble 擴展 engine bsp div 試用navicat工具查看現網mysql建表語句時,發現表名和字段名都是反引號引起來的 CREATE TABLE `tab_notice_title_tv` ( `i_id` int(11

linux自動備份oracle數據庫並上傳到備份服務器 腳本實現

oralce 查看 cal .com 中間 term star 開始 library 實際項目中,備份數據是不可缺少的一步,完成數據的自動備份減少個人的工作量,是我們的目標。之前很少寫過腳本,不過這些簡單的操作還是可以做到的!話不多說,開始具體介紹:oracle版本:10.

C#進階系列——WebApi 異常處理解決方案

機制 輸出 ges 如果 但是 rom lba slist 解決 出處:http://www.cnblogs.com/landeanfen/p/5363846.html 閱讀目錄 一、使用異常篩選器捕獲所有異常 二、HttpResponseException自

PhantomJS

load mage start random head .com bs4 隱式 解決 # coding=utf—8 import random,headers,xmlParse from bs4 import BeautifulSoup from selen

創建表空間

文件的 temporary 回滾 http 碎片 重要 .html temp 希望 原文地址:http://blog.chinaunix.net/uid-20802110-id-2105656.html CREATE [UNDO] TABLESPACE tablesp

重新編譯Nginx指導手冊【修復靜態編譯Openssl的Nginx漏洞 】

snippets asset 替換 業務需求 tps eight nbsp 出了 sof 1. 概述 當前爆出了Openssl漏洞,會泄露隱私信息,涉及的機器較多,環境迥異,導致修復方案都有所不同。不少服務器使用的Nginx,是靜態編譯opensssl,直接將open

ZOJ 2770 Burn the Linked Camp 差分約束

最小 差分約束 ast divide sam ges format gen period It is well known that, in the period of The Three Empires, Liu Bei, the emperor of the Shu

關於Class.getResource和ClassLoader.getResource的路徑問題

his control window 但是 是我 cto map -1 獲取 參考博客:http://www.cnblogs.com/yejg1212/p/3270152.html Class.getResource(String path) 當path以/開頭,如/a/

歸並排序

mas 並發與並行 希爾 成了 不為 內存空間 con 繼續 內部實現 合並排序,顧名思義,就是通過將兩個有序的序列合並為一個大的有序的序列的方式來實現排序。合並排序是一種典型的分治算法:首先將序列分為兩部分,然後對每一部分進行循環遞歸的排序,然後逐個將結果進行合並。

快速排序

最壞情況 sof 擴大 car ++i sta 混合 大於等於 python 上篇文章介紹了時間復雜度為O(nlgn)的合並排序,本篇文章介紹時間復雜度同樣為O(nlgn)但是排序速度比合並排序更快的快速排序(Quick Sort)。 快速排序是20世紀科技領域的十大算法之