天天看點

Unity性能優化

一丶題目: lod 是什麼,優缺點是什麼

答案:LOD 技術即 Levels of Detail 的簡稱,意為多細節層次。LOD 技術指根據物體模型的節點在顯示環境中所處的位置和重要度,決定物體渲染的資源配置設定,降低非重要物體的面數和細節度,進而獲得高效率的渲染運算。

優點:可根據距離動态地選擇渲染不同細節的模型

缺點:加重美工的負擔,要準備不同細節的同一模型,同樣的會稍微增加遊戲的容量。

...

公司出處:上海景格科技股份有限公司

二丶題目: MipMap 是什麼?作用?

答案:在三維計算機圖形的貼圖渲染中有一個常用的技術被稱為 Mipmapping。為了加快渲染速度和減少圖像鋸齒,貼圖被處理成由一系列被預先計算和優化過的圖檔組成的檔案,這樣的貼圖被稱為 MIP map 或者 mipmap。

...

公司出處:上海景格科技股份有限公司

三丶題目: 當遊戲中需要頻繁建立一個物體對象時,我們需要怎麼做來節省記憶體。

答案:做一個 pool,遊戲開始時預先執行個體化足夠的數量,然後用的時候取不用的時候收回

...

公司出處:上海景格科技股份有限公司

四丶題目: 如何優化記憶體?

答案:有很多種方式,例如

1.壓縮自帶類庫;

2.将暫時不用的以後還需要使用的物體隐藏起來而不是直接 Destroy 掉;

3.釋放 AssetBundle 占用的資源;

4.降低模型的片面數,降低模型的骨骼數量,降低貼圖的大小;

5.使用光照貼圖,使用多層次細節(LOD),使用着色器(Shader),使用預設(Prefab)。

...

公司出處:上海景格科技股份有限公司

五丶題目: 動态加載資源的方式?和差別

答案:1.通過 Resources 子產品,調用它的 load 函數:可以直接 load 并傳回某個類

型的 Object,前提是要把這個資源放在 Resource 命名的檔案夾下,Unity

不關有沒有場景引用,都會将其全部打入到安裝包中。Resources.Load();

2.通過 bundle 的形式: 即将資源打成 asset bundle 放在伺服器或本地

磁盤, 然後使用 WWW 子產品 get 下來, 然後從這個 bundle 中 load 某個 object。

AssetBundle

3.通過 AssetDatabase.loadasset :這種方式隻在 editor 範圍内有效,

遊戲運作時沒有這個函數, 它通常是在開發中調試用的 【AssetDatabase 資源資料庫】

差別:Resources 的方式需要把所有資源全部打入安裝包,這對遊戲的分包釋出(微端)和版本更新(patch)是不利的,是以 unity 推薦的方式是不用它, 都用 bundle 的方式替代, 把資源達成幾個小的 bundle, 用哪個就 load哪個,這樣還能分包釋出和 patch,但是在開發過程中,不可能沒更新一個資源就打一次 bundle, 是以 editor 環境下可以使用 AssetDatabase 來模拟,這通常需要我們封裝一個 dynamic resource 的 loader 子產品,在不同的環境下做不同實作。動态資源的存放有時我需要存放一些自己的檔案在磁盤上,例如我想把幾個 bundle 放

在初始的安裝裡, unity 有一個 streaming asset 的概念,用于提供存儲接口的通路。我們需要在編輯器建立一個 StreamingAssets 名字的檔案夾,把需要我們放在客戶磁盤上的動态檔案放在這個檔案夾下面,這樣安裝後,這些檔案會放在使用者磁盤的指定位置,這個位置可以通過

Application.streamingAssetsPath 來得到。

...

公司出處:上海景格科技股份有限公司

六丶題目: 請簡述一下對象池原理,什麼情況下使用?

答案:對象池背後的理念其實是非常簡單的。我們将對象存儲在一個池子中,當需要時在再次使用,而不是每次都執行個體化一個新的對象。池的最重要的特性,也就是對象池設計模式的本質是允許我們擷取一個“新的”對象而不管它真的是一個新的對象還是循環使用的對象。對象池通常用于在那些需要經常建立又銷毀的對象比如我們場景中的小怪,經常需要建立和銷毀,我們就可以在小怪銷毀的時候,不真正的銷毀而是,而是把它放入對象池中等到下一次我們需要建立小怪的時候,再從對象池中取出來。

...

公司出處:上海景格科技股份有限公司

七丶題目: 使用mipmap有什麼好處?什麼情況下使用?

答案:Mipmap紋理技術是目前解決紋理分辨率與視點距離關系的最有效途徑,它會先将圖檔壓縮成很多逐漸縮小的圖檔,例如一張64*64的圖檔,會産生 64*64,32*32,16*16,8*8,4*4,2*2,1*1的7張圖檔,當螢幕上需要繪制像素點為20*20 時,程式隻是利用 32*32 和 16*16 這兩張圖檔來計算出即将顯示為 20*20 大小的一個圖檔,這比單獨利用 32*32 的那張原始片計算出來的圖檔效果要好得多,速度也更快。

...

公司出處:上海景格科技股份有限公司

八丶題目: Unity記憶體優化?

答案:GC垃圾回收

...

公司出處:上海奇夢

九丶題目: 你認為unity在開發過程中哪些地方比較容易造成記憶體洩漏和記憶體洩漏問題?如何避免?

答案:腳本做載入不删除處理時,往往腳本中還有一些不用的變量,容易導緻内容洩漏

...

公司出處:上海趣糖

十丶題目: 使用NGUI開發滾動視圖,當滾動清單達到幾百條的時候,如何才能保證界面的滾動流暢運作

答案:

1. 每個滾動條目都是同一個預設體的執行個體

2.做緩存,隻要執行個體化視野範圍内滾動條目,往上超出視野部分,自動填補到視野的下面

...

公司出處:上海趣糖

十一丶題目: 如何解決過多建立和删除對象帶來的卡頓問題

答案:對象池,把不用對象緩存到一個對象清單中

...

公司出處:上海趣糖

十二丶題目: Unity資源加載的有幾種方式,簡述asset bundie

答案:

1. 直接在腳本中public一個對象,然後在螢幕面闆進行指派

2. 直接在程式中進行find查找

3. Resource.load

4. 把資源打成Assetbudle,然後用的時候load進來

assetbundle就是對資源的打包處理,同時這種資源格式便于從網際網路上下載下傳

...

公司出處:上海趣糖

十三丶題目: 背包系統中隻有20個格子,現在有總共有100個物體,除了顯示在視野中的20個外,對其他的處理方法?(注:将其他隐藏起來不可行,對象池得有具體的說明

答案:

1. 每個滾動條目都是同一個預設體的執行個體

2.做緩存,隻要執行個體化視野範圍内滾動條目,往上超出視野部分,自動填補到視野的下面

...

公司出處:上海鹿遊網絡科技有限公司

繼續閱讀