客戶端界面加載優(yōu)化

最近在處理打開客戶端界面加載卡頓的問題擅憔,兩年前做cocos2dx項目的時候也注意到了這個問題,不過因為當(dāng)時的界面比較簡單倍阐,也沒有太多精力去處理获雕,不了了之。

現(xiàn)象是這樣的收捣,幾百行甚至幾千行的客戶端代碼里面,大部分時間都只卡在widgetFromJsonFile這個函數(shù)中庵楷,即對UI界面的UI元素樹進(jìn)行加載罢艾。不難猜想,里面進(jìn)行了遞歸遍歷并生成了一個個對應(yīng)的cocos widget尽纽。我們組也對此做了不少的底層優(yōu)化咐蚯,紋理的緩存優(yōu)化,json文件的加載優(yōu)化弄贿,處理文本的卡頓bug等等春锋。

拋開底層的優(yōu)化,單純地看待創(chuàng)建UI界面這個問題差凹。整個流程只有兩個入口:1. load期奔,2. destroy,非常類似于服務(wù)端開發(fā)永遠(yuǎn)都優(yōu)化不完的malloc和free函數(shù)危尿。很容易想到UI界面緩存呐萌,顯然這不是我想出來的,夢幻手游的UI界面就做了這種處理谊娇,細(xì)心的同學(xué)可以發(fā)現(xiàn)肺孤,打開商城界面操作一番,關(guān)閉界面再次打開,有些部分竟還是上次打開保留下來的赠堵,這是夢幻對界面加載貢獻(xiàn)非常大的一個優(yōu)化小渊,緩存下來的界面可以做到瞬開。

有了加載結(jié)果緩存茫叭,那什么時候清理緩存呢酬屉,我目前發(fā)現(xiàn)的是斷線重連會清理。其實清理方法很多杂靶,通過檢測內(nèi)存不足的時候清理梆惯,或者通過LRU的方式清理,或者兼而有之吗垮。最近發(fā)現(xiàn)劍俠情緣移動版是通過LRU的方式清理的垛吗。

下面來說下實現(xiàn),主要的變化是烁登,創(chuàng)建出來的root widget怯屉,增加了一個休眠狀態(tài),即三種狀態(tài):創(chuàng)建饵沧、銷毀锨络、休眠。休眠狀態(tài)就是被cache住的狀態(tài)狼牺,可以被喚醒重新利用來達(dá)到優(yōu)化的效果羡儿。每次創(chuàng)建出來的widget通過FakeUI作為代理,接管原來的removeFromParent和setVisible這兩個函數(shù)是钥,緩存的時候并不真正銷毀掠归,只是隱藏起來,并記錄下上次休眠的時間悄泥。

界面的生存周期流程圖如下:


Paste_Image.png

再創(chuàng)建一個管理UIService虏冻,每次創(chuàng)建界面時候先讀緩存,有則直接激活弹囚,沒有則走正常創(chuàng)建流程厨相,創(chuàng)建完以后,判斷是否需要加入界面緩存管理鸥鹉。添加幾個接口就可以投入使用了蛮穿,如下:

class UIService(object):
     add_to_cache(self, fake_ui)
     get_cache(self, name)
     clear(self, force=False)      # 清理所有深度睡眠的ui cache
     step_clear(self)          # LRU的方式,一次清理一個深度睡眠的ui cache

為了減少設(shè)備的內(nèi)存占用毁渗,界面緩存提供了一個根據(jù)LRU的淘汰方式來逐步清理休眠中的界面绪撵,實現(xiàn)如下:

def step_clear(self):
    """ LRU的方式,一次清理一個深度睡眠的csb cache """
    oldest_cache = None
    sorted_cache = self.sort_cache()
    for i,cache in enumerate(sorted_cache):
        deep_sleep_tiem = cache.get_deep_sleep_time()
        if cache.is_deep_sleep() == True and deep_sleep_tiem > 0 and not self.check_ancestor(cache):  # 只檢索深度睡眠中的cache
            oldest_cache = cache
            break

    if oldest_cache:
        name = oldest_cache.get_name()
        oldest_cache.fake_do_destroy()
        del self._csb_cache[name]

寫完發(fā)現(xiàn)才100來行代碼祝蝠,對原有的邏輯代碼侵害非常小音诈,但是需要注意對root_widget動態(tài)addChild的控件需要清理以便下一次利用幻碱,最后再說一下,這種是通過內(nèi)存來換取時間的方法细溅,由于UI緩存長期占用紋理褥傍,內(nèi)存占用過高降不下去,導(dǎo)致我們ios上線初期頻繁閃退喇聊。后來我們最終只在android設(shè)備上開啟了界面緩存恍风。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市誓篱,隨后出現(xiàn)的幾起案子朋贬,更是在濱河造成了極大的恐慌,老刑警劉巖窜骄,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锦募,死亡現(xiàn)場離奇詭異,居然都是意外死亡邻遏,警方通過查閱死者的電腦和手機糠亩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來准验,“玉大人赎线,你說我怎么就攤上這事『ィ” “怎么了垂寥?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長另锋。 經(jīng)常有香客問我矫废,道長,這世上最難降的妖魔是什么砰蠢? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮唉铜,結(jié)果婚禮上台舱,老公的妹妹穿的比我還像新娘。我一直安慰自己潭流,他們只是感情好竞惋,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灰嫉,像睡著了一般拆宛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讼撒,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天浑厚,我揣著相機與錄音股耽,去河邊找鬼。 笑死钳幅,一個胖子當(dāng)著我的面吹牛物蝙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敢艰,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼诬乞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钠导?” 一聲冷哼從身側(cè)響起震嫉,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牡属,沒想到半個月后票堵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡湃望,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年换衬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片证芭。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞳浦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出废士,到底是詐尸還是另有隱情叫潦,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布官硝,位于F島的核電站矗蕊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏氢架。R本人自食惡果不足惜傻咖,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岖研。 院中可真熱鬧卿操,春花似錦、人聲如沸孙援。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拓售。三九已至窥摄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間础淤,已是汗流浹背崭放。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工哨苛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莹菱。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓移国,卻偏偏與公主長得像,于是被迫代替她去往敵國和親道伟。 傳聞我的和親對象是個殘疾皇子迹缀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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