cocos2dx UI的一些碎碎念

被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ì)的可以參考:

  1. iOS和android游戲紋理優(yōu)化和內(nèi)存優(yōu)化(cocos2d-x)

  2. 淺談Cocos2d-x紋理優(yōu)化

利用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è)幾秒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末介褥,一起剝皮案震驚了整個(gè)濱河市座掘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柔滔,老刑警劉巖溢陪,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異睛廊,居然都是意外死亡形真,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門超全,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咆霜,“玉大人,你說(shuō)我怎么就攤上這事卵迂≡1悖” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵见咒,是天一觀的道長(zhǎng)偿衰。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么下翎? 我笑而不...
    開(kāi)封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任缤言,我火速辦了婚禮,結(jié)果婚禮上视事,老公的妹妹穿的比我還像新娘胆萧。我一直安慰自己,他們只是感情好俐东,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布跌穗。 她就那樣靜靜地躺著,像睡著了一般虏辫。 火紅的嫁衣襯著肌膚如雪蚌吸。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天砌庄,我揣著相機(jī)與錄音羹唠,去河邊找鬼。 笑死娄昆,一個(gè)胖子當(dāng)著我的面吹牛佩微,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萌焰,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哺眯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了杆怕?” 一聲冷哼從身側(cè)響起族购,我...
    開(kāi)封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陵珍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體违施,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡互纯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了磕蒲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翎苫,靈堂內(nèi)的尸體忽然破棺而出姿鸿,到底是詐尸還是另有隱情,我是刑警寧澤站削,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布坊萝,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏十偶。R本人自食惡果不足惜菩鲜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惦积。 院中可真熱鬧接校,春花似錦、人聲如沸狮崩。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)睦柴。三九已至董习,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爱只,已是汗流浹背皿淋。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恬试,地道東北人窝趣。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像训柴,于是被迫代替她去往敵國(guó)和親哑舒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,166評(píng)論 25 707
  • 用到的組件 1幻馁、通過(guò)CocoaPods安裝 2洗鸵、第三方類庫(kù)安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,619評(píng)論 1 180
  • 我拂掉了你肩上的羽毛 羽毛仗嗦,掉了膘滨。風(fēng)吹,又起了稀拐。 也不知道會(huì)再落到誰(shuí)的肩上火邓, 我看了你的肩上空空如也,安穩(wěn)了德撬。 又...
    南城微南閱讀 242評(píng)論 0 2
  • 今天學(xué)的SPI 明天學(xué)習(xí)FLASH 加油哈
    宋濤1120閱讀 153評(píng)論 0 0
  • 1.所有研發(fā)的產(chǎn)品要經(jīng)過(guò)10個(gè)人以上交叉驗(yàn)證才能夠給客戶使用铲咨。 2.用有專長(zhǎng)的人才。 3.尋求外部資源來(lái)配合蜓洪。 4...
    我不是書生閱讀 153評(píng)論 0 0