同樣還是更新方面的需求,當我們檢測到版本是新安裝的以后,要進行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方案。 避免了線程問題,同時又使得圖形有機會渲染,保證了進度條的更新和防止畫面假死。
此技巧在目前公司所有項目中都有使用,大家不用再糾結可行性了,大膽嘗試吧。
文章列表