文章出處

同樣還是更新方面的需求,當我們檢測到版本是新安裝的以后,要進行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


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

IT工程師數位筆記本

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