文章出處

同樣還是更新方面的需求,當我們檢測到版本是新安裝的以后,要進行upd目錄清除。如果使用os.execute執行 rm -rf ooxx 是非常快的
但由于os.execute一旦報錯,那整個lua進程就杯具了。于是,我們最后換成了lfs來進行目錄遍歷并逐個刪除。
這樣一來,文件數目如果過多,會等很久。于是想到使用異步的方式來處理。

一開始我嘗試了lua的協程,我以為他和golang等語言中的一樣。可以實現輕量級線程。
于是我做了一個簡單的測試

h = coroutine.creat( function() for i=0,100000 do print("hahahahahaha") end end )
coroutine.resume(h)
print("oh yeah,i am here")



按我的期望是,最后這句話會在一堆hahahahaha中出現。 而實際上,是要等所有的hahahahaha打印完了,才出現。
協程看來不是我想像中的那貨。

那又怎么辦呢,引入線程? 剛剛返回的h就是一個thread
看來在lua中使用線程行不同,那如果用c++實現一個異步的等效函數,并提供一個監聽呢。這樣無疑是很ok的。
從唐門世界的更新模塊中我發現它就是用java和oc分別實現的android和ios

這樣下去,走太遠了。
我們回過頭來看看,我們之所以面臨這個問題是因為,為了累加更新,我們的文件很小,沒有打包。
基于這個特性我們可以想到,我們的單個文件刪除的開銷是極小的。
于是,我們可以采用如下技巧

遍歷出所有要刪除的文件放入一個table

在onEnterFRame中,一次處理一定數目的文件,直到全部處理完。


這個技巧對單個文件不大的項目非常有效,這個技巧源自我們公司的關卡pre loading方案。 避免了線程問題,同時又使得圖形有機會渲染,保證了進度條的更新和防止畫面假死。

此技巧在目前公司所有項目中都有使用,大家不用再糾結可行性了,大膽嘗試吧。


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()