技术分享连载(六十一)
資源管理
Q1:Unity5.4.1中,我將需要的Shader打到一個AssetBundle包中(包含一個關(guān)聯(lián)了所有Shader的Shader Variants),分別用Shader.WarmupAllShaders和ShaderVariantCollection.WarmUp兩種方式進(jìn)行預(yù)加載,后者耗時更少。
這里用了Standard Shader做的測試,可以看到真機(jī)上兩種方式耗時差距是非常大的。 請問,確實(shí)是ShaderVariantCollection的效率更高,還是我測試方法有問題?
測試代碼:
Shader的AB包里的內(nèi)容:
根據(jù)官方的文檔的描述,確實(shí)是ShaderVariantCollection的效率更高,詳見:
 https://docs.unity3d.com/Manual/OptimizingShaderLoadTime.html
 因?yàn)樵赟haderVariantCollection中,是可以給每個Shader添加指定的Keyword的,ShaderVariantCollection.WarmUp的調(diào)用只會對ShaderVariantCollection中指定的Keyword進(jìn)行Warmup操作;而Shader.WarmupAllShaders則是對所有的Keyword全部進(jìn)行Warmup操作(其中大多數(shù)很可能都不會用到)。
 因此在Shader.WarmupAllShaders的文檔中也提到,建議使用ShaderVariantCollection.Warmup來進(jìn)行細(xì)粒度的Warmup操作,避免大量多余的Keyword被Warmup,造成嚴(yán)重的卡頓,大家可以參考下文:
 https://docs.unity3d.com/ScriptReference/Shader.WarmupAllShaders.html
此問答來自于UWA 問答社區(qū):https://answer.uwa4d.com/question/58fabe919db5d16c66166132
 如您對該問題仍有疑問,可以轉(zhuǎn)至社區(qū)進(jìn)行進(jìn)一步交流。
資源管理
Q2:我們在做MMO國戰(zhàn)類游戲,因此想咨詢下資源標(biāo)準(zhǔn)。我們同屏?xí)?0~80個玩家,這種情況下主角一般控制在多少面,多少根骨骼呢?一個Boss有80多根骨骼會有問題嗎?
這個需要看研發(fā)團(tuán)隊(duì)希望在什么樣的機(jī)型上運(yùn)行。假設(shè)是低端機(jī)器類似紅米Note2,那么建議玩家都控制在30根骨骼,1500面以下。如果只有一個怪物80根骨骼,問題并不大,但還需要考慮場景中其他物體的使用量。
建議研發(fā)團(tuán)隊(duì)看一下這篇文章,這是我們半年前統(tǒng)計的關(guān)于MMO游戲的性能數(shù)據(jù),相信能對MMO游戲的開發(fā)團(tuán)隊(duì)具有借鑒意義:《MMO移動游戲性能分析報告:渲染、UI、邏輯代碼和內(nèi)存需重點(diǎn)關(guān)注》
此問答來自于UWA 問答社區(qū):
 https://answer.uwa4d.com/question/58f614999db5d16c66166121
 如您對該問題仍有疑問,可以轉(zhuǎn)至社區(qū)進(jìn)行進(jìn)一步交流。
資源管理
Q3:我們想請教一個Unity的普適性的資源管理問題。舉個例子,我們現(xiàn)在的一個特效Prefab包含的貼圖打成AssetBundle時沒有單獨(dú)拆分出來,就會存在一個問題,這個特效AssetBundle會存在重復(fù)加載的問題進(jìn)而導(dǎo)致重復(fù)的特效貼圖在內(nèi)存中。(針對“重復(fù)加載”說明下:我們首先通過AssetBundle出來一個Object,這個Object會緩存一段時間,在這段緩存時間過后這個Object會被Destroy掉,而需要釋放的特效是通過Instantiate這個Object出來的。當(dāng)這個Object過了緩存時間被destroy掉后,下次需要釋放相同的特效還是通過load同樣的AssetBundle進(jìn)行再實(shí)例化出來,這樣內(nèi)存中存在兩份貼圖了。)
Unity中是沒有這種API來提供的,一般是團(tuán)隊(duì)中自行做一些資源的引用計數(shù)來進(jìn)行管理。頻繁調(diào)用UnloadUnusedAssets是不可取的(該函數(shù)的主要作用是查找并卸載不再使用的資源。游戲場景越復(fù)雜、資源越多,該函數(shù)的開銷越大,一般在300~2000 ms范圍內(nèi)),但可以調(diào)用UnloadAsset來釋放資源。
內(nèi)存管理
Q4:我們游戲現(xiàn)在測試出來的GC是否合理?這個分配數(shù)值可以接受嗎?是否存在泄露?如果存在泄露,有沒有具體到每個函數(shù)的分配詳情?
研發(fā)團(tuán)隊(duì)可以在測試報告中查看 Mono堆內(nèi)存分析報告,這里有我們對于Mono堆內(nèi)存的詳細(xì)分析,包括 堆內(nèi)存具體分配 和 堆內(nèi)存泄露分析 兩大功能,如下圖所示。
 就研發(fā)團(tuán)隊(duì)目前的數(shù)據(jù)報告來看,其堆內(nèi)存分配其實(shí)是很小的,之所以有目前的堆內(nèi)存調(diào)用,推測是手動調(diào)用GC的頻率較高所致,研發(fā)團(tuán)隊(duì)可以就此再進(jìn)行進(jìn)一步的檢測。
 原文出處:侑虎科技
 本文作者:admin
 轉(zhuǎn)載請與作者聯(lián)系,同時請務(wù)必標(biāo)明文章原始出處和原文鏈接及本聲明。
總結(jié)
以上是生活随笔為你收集整理的技术分享连载(六十一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java cssselector类_CS
 - 下一篇: Mybatis 详解--- 一级缓存、二