被Hugo的更新弄得很傷航瞭,所以搬運(yùn)下github上的博客
UI方面的工作比較碎,比較單調(diào)祠饺,但也有很多講究敞掘,合理的UI設(shè)計(jì)可以節(jié)省很多DrawCall和CPU的開(kāi)銷叽掘,這里總結(jié)一些Tips。
需要時(shí)加載圖集
為了節(jié)省DrawCall一般會(huì)把相同界面或者相同類型的圖片用TexturePacker打包成一張整圖玖雁,比如通用的UI框體更扁,按鈕可以打包成一個(gè)圖集。在每個(gè)場(chǎng)景創(chuàng)建前,加載一些必用圖集浓镜,然后看情況加載其他圖集溃列。
盡量把不同的窗口做成不同的Layer或Node,每個(gè)窗口管理自己所需要的圖集膛薛,避免無(wú)用圖集占用內(nèi)存听隐,做到需要時(shí)加載。這點(diǎn)有點(diǎn)像Unity的組件化Component-Based思想哄啄,盡量把重復(fù)的部分(甚至不重復(fù)的部分雅任,你永遠(yuǎn)不會(huì)想到策劃哪天會(huì)突發(fā)奇想,復(fù)用某一塊界面)獨(dú)立咨跌,然后按需加載沪么。
圖片紋理格式
Android:推薦ETC1圖片加Alpha通道的格式
IOS:推薦PVRTC4
如果效果不滿足可以往上升級(jí),考慮RGBA4444加抖動(dòng)锌半,或者直接用RGBA8888原圖品質(zhì)禽车。
詳細(xì)的可以參考:
利用Cache實(shí)現(xiàn)“只創(chuàng)建一次原則”
一個(gè)稍微復(fù)雜的界面里,各個(gè)標(biāo)簽切換可能會(huì)產(chǎn)生大量的重復(fù)的Button拳喻、Label或者自定義Node哭当,利用Cache把它們存儲(chǔ)起來(lái)進(jìn)行重復(fù)利用猪腕,可以減少明顯的卡頓和不必要的GC冗澈。
一個(gè)Lua的簡(jiǎn)單實(shí)現(xiàn):
self.buttonCache = {
buttonTable = {},
index = 1,
getButton = function()
local index = self.buttonCache.index
local button = self.buttonCache.buttonTable[index]
if button then
button:show()
else
button = WidgetHelper.quickItemWidget()
:retain()
:setAnchorPoint(0.5,0.5)
:setTouchEnabled(true)
:onTouch(handler(self,function(self,event) end))
self.buttonCache.buttonTable[index] = button
end
self.buttonCache.index = self.buttonCache.index + 1
return button
end,
recycleButton = function()
for k,v in pairs(self.buttonCache.buttonTable) do
v:removeFromParent()
v:hide()
end
self.buttonCache.index = 1
end,
releaseButton = function()
for k,v in pairs(self.buttonCache.buttonTable) do
v:release()
end
end,
}
獲取Button的時(shí)候只用調(diào)用getButton(),在切換標(biāo)簽或清空列表時(shí)調(diào)用recycleButton()回收Button并重新計(jì)數(shù)陋葡,在退出Scene的時(shí)候調(diào)用releaseButton()清除Cache亚亲。
不單單是Button,任何重復(fù)的組件都可以用類似的格式進(jìn)行Cache存儲(chǔ)和重復(fù)利用腐缤,可以節(jié)省一大筆創(chuàng)建和銷毀的開(kāi)銷捌归。
需要注意的是,Cache中的元素岭粤,在重復(fù)利用時(shí)要做好檢查惜索,避免出現(xiàn)重復(fù)添加子節(jié)點(diǎn),Enable狀態(tài)沒(méi)有重置等問(wèn)題剃浇。
提供統(tǒng)一的UI控件創(chuàng)建接口
游戲中最常見(jiàn)的組件巾兆,物品道具Button,TTFLabel文本虎囚,HtmlLabel文本角塑,RichText文本,采用統(tǒng)一的接口創(chuàng)建淘讥。保持格式統(tǒng)一圃伶,減少重復(fù)代碼。特別是物品Button,一般是一個(gè)Button底加Icon Sprite加數(shù)量Label的組合窒朋,提供一個(gè)統(tǒng)一接口搀罢,處理不同Item的樣式,比如裝備的彩色底框侥猩,碎片的角標(biāo)魄揉,人物頭像的星級(jí)等等,做到傳入一個(gè)Item ID和Type拭宁,就能產(chǎn)生相應(yīng)的Button洛退。
延時(shí)加載
有時(shí)候運(yùn)氣比較背,一個(gè)列表里面要加載幾十個(gè)子Node杰标,每個(gè)Node上還都有動(dòng)畫和各種子Node兵怯,全部添加完需要2s左右,卡頓明顯腔剂,除了慫恿策劃美術(shù)改圖之外媒区,延時(shí)加載也是一個(gè)解決辦法——不要等列表子Node加載完再顯示,先顯示列表掸犬,開(kāi)一個(gè)計(jì)時(shí)器袜漩,每隔0.1s~0.2s添加一個(gè)子Node,在完全加載完前禁用用戶交互湾碎,雖然時(shí)間差不多宙攻,但效果要明顯好于讓用戶卡個(gè)幾秒。