沐思:Cocos 在線教育大廳 + 子游戲開(kāi)發(fā)實(shí)戰(zhàn)
一個(gè)月前 Cocos 「十周年系列沙龍」廣州站完美落幕,此前來(lái)自騰訊開(kāi)心鼠 ABCmouse 在線教育部研發(fā)負(fù)責(zé)人潘偉洲,傾情分享了基于 FFmpeg 的 Cocos Creator 視頻播放器實(shí)現(xiàn)細(xì)節(jié)。
今天 C?姐搬運(yùn)了我們的另一位嘉賓,來(lái)自沐思科技的資深架構(gòu)師吳彧的演講內(nèi)容,為大家?guī)?lái)沐思少兒在線教育的 Cocos 實(shí)戰(zhàn)分享。

沐思選擇?Cocos 制作課件極大提升了開(kāi)發(fā)效率,且課件制作中客戶(hù)端的原生能力,讓用戶(hù)體驗(yàn)更好。
并且課件只需要寫(xiě)一套代碼就可以實(shí)現(xiàn)跨平臺(tái),大大降低了開(kāi)發(fā)成本。那么過(guò)程中有什么困難呢?
?

在線教育的困局是:
課程無(wú)法按時(shí)上架,影響孩子上課。。
用戶(hù)體驗(yàn)糟糕,課件的更新需更新 App 才能體驗(yàn)。
App 包體越來(lái)越大,用戶(hù)下載的時(shí)間過(guò)長(zhǎng),且無(wú)關(guān)課程也需全部下載。
?
破局的方式是我們引入了熱更新,使用差異下載,減少更新時(shí)間。從而課件到達(dá)用戶(hù)速度提升,用戶(hù)體驗(yàn)提升。
Cocos Creator 熱更新是對(duì)遠(yuǎn)程版本和本地版本的版本號(hào)進(jìn)行對(duì)比,本地版本號(hào)小于遠(yuǎn)程版本號(hào)就需要行熱更新,版本號(hào)如何而來(lái)呢?
答案是在 manifest 文件里獲取,我們把攜帶高版本號(hào)的 manifest 文件和最新的構(gòu)建資源放到遠(yuǎn)程服務(wù)器,同時(shí)本地的包內(nèi)留有版本較低和舊的資源。
當(dāng)在需要檢查熱更的時(shí)候,Cocos Creator 會(huì)先初始化本地包內(nèi)的 manifest 文件,同時(shí)創(chuàng)建指定目錄的臨時(shí)文件夾和緩存文件夾,比如緩存文件夾是 hxy,臨時(shí)文件夾則為 hxy.temp。
下載遠(yuǎn)程的 version.manifest 文件緩存到本地 ,獲取版本號(hào)與本地存在的版本進(jìn)行比較,遠(yuǎn)程版本高,則下載攜帶資源信息的 project.manifest 文件到臨時(shí)文件夾 hxy.temp 下。
接著對(duì)比本地 project.manifest 與從遠(yuǎn)程下載到臨時(shí)文件夾中的 project.manifest 資源列表,即當(dāng)中的 assets 表,然后生成差異列表。通過(guò) downloader 進(jìn)行下載差異列表中的文件到本地。
文件下載成功后,對(duì)下載的文件進(jìn)行校驗(yàn)。接著通知下載進(jìn)度、保存下載進(jìn)度,檢查是否有失敗的資源。如果沒(méi)有,則拷貝臨時(shí)文件夾的所有內(nèi)容到設(shè)定的緩存目錄,如果更新失敗則不拷貝臨時(shí)資源到緩存目錄,避免了污染原有的本地緩存資源。
Cocos Creator?會(huì)使用 manifest 文件標(biāo)示每個(gè)資源的狀態(tài)(未開(kāi)始/下載中/下載完成)。如果熱更中途網(wǎng)絡(luò)中斷,重新啟動(dòng)熱更。
Cocos Creator 會(huì)檢查臨時(shí)文件夾中是否有未完成的更新,校驗(yàn)版本是否和遠(yuǎn)程匹配之后,則使用臨時(shí)文件夾中的 manifest 作為遠(yuǎn)程 manifest 繼續(xù)更新(前提是臨時(shí)文件中已經(jīng)下載了 project.manifest。在臨時(shí)文件夾中的命名會(huì)有一個(gè) .temp 后綴)此時(shí)對(duì)于下載狀態(tài)為完成的不會(huì)重新下載,對(duì)于下載中的文件一般是從頭開(kāi)始下載。
更新完成后 Cocos Creator 將遠(yuǎn)程的版本文件 project.manifest 作為當(dāng)前本地的 project.manifest,下次更新即用最新的 manifest 文件的版本號(hào)對(duì)比。
1.下載的過(guò)程是差異下載,可以減少下載時(shí)間,那么差異下載是指什么呢?

?
上圖是差異下載中的文件差異操作流程圖,左半部分是刪除和修改的部分,主要本地與遠(yuǎn)程文件列表做對(duì)比,判斷是否有文件刪除和文件是否被修改過(guò)。
如果存在這些操作,就放進(jìn)一個(gè)不同文件列表存儲(chǔ)起來(lái);右半部分主要是判斷增加文件的流程,它用遠(yuǎn)程文件列表跟本地已有的文件列表做對(duì)比。
如果未找到說(shuō)明有增加的文件,就放入不同文件列表存儲(chǔ)起來(lái)。
經(jīng)過(guò)這兩個(gè)步驟,所有下載的的文件中存在差異下載文件都放入那個(gè)不同文件列表,之后就走下載的步驟,這就是差異下載中的文件差異操作流程。
????????????????
2.可版本回退版實(shí)際操作。
在實(shí)際項(xiàng)目中,更新版本可能不小心攜帶了意外的 bug。要想快速還原,那就需要回退到上個(gè)版本。
實(shí)際上 Cocos Creator 的熱更新默認(rèn)如果遠(yuǎn)程版本大于本地版本才會(huì)進(jìn)行熱更,那么如何實(shí)現(xiàn)回退?
這個(gè)問(wèn)題可以修改版本檢查函數(shù)的邏輯,即只要版本不同就熱更。這樣可以通過(guò)服務(wù)器傳給客戶(hù)端要回退的版本即可更新到熱和版本了。
關(guān)鍵代碼:
???????????????
?
? ??
熱更新已經(jīng)可以做到不發(fā)包,隨時(shí)可以上架課程和修復(fù)一些問(wèn)題。那為何又要做大廳子游戲呢?看下面一張圖:
??
?

從圖中可以看出,如果一個(gè)熱更新包的話,包體隨著時(shí)間越來(lái)大,下載時(shí)間也就更長(zhǎng),用戶(hù)下載一個(gè)包花了幾十分鐘,可想而知,體驗(yàn)是非常糟糕的。
所以單個(gè)熱更新在教育 App 存在些問(wèn)題:
第一:包體增大,下載時(shí)間很長(zhǎng),一次更新需要幾十分鐘,不僅在浪費(fèi)用戶(hù)的時(shí)間,也將自己的產(chǎn)品體驗(yàn)做得糟糕;
第二:成本高。如果只有熱更新沒(méi)有 Cocos 大廳-子游戲模式,課件之間關(guān)聯(lián)太大,做不到獨(dú)立,導(dǎo)致開(kāi)發(fā)成本高。
此外影響范圍大,只有一個(gè)熱更新的話每次更新新課件或者修復(fù)某個(gè)問(wèn)題,所有人都要更新,包括上無(wú)關(guān)的課的用戶(hù),這明顯就是綁架用戶(hù)行為,體驗(yàn)很不好。
接下來(lái)解釋一下什么叫大廳+子游戲模式:
1. 將大廳單獨(dú)作為一個(gè)完整的項(xiàng)目,不同的子游戲,則為不同的項(xiàng)目;?
2. 然后要實(shí)現(xiàn)不同項(xiàng)目之間的互調(diào),即大廳調(diào)子游戲,或者子游戲調(diào)大廳;?
3. 資源共享,共用的資源放在大廳項(xiàng)目中,并且子游戲中可以調(diào)用;

?
上圖是大廳子游戲的目錄結(jié)構(gòu)和大廳加載的流程圖。
大廳子游戲好處:
1.每個(gè)子游戲獨(dú)立,減少下載時(shí)間;
2.提高熱更新的效率(打開(kāi)指定子游戲,才會(huì)更新子游戲);
3.降低項(xiàng)目的耦合性(如果不共享資源,子游戲完全可以隨時(shí)抽取出來(lái)作為一個(gè)單獨(dú)的包使用)
現(xiàn)在大多數(shù)大廳子游戲模式為下圖:
??????????????
上圖中都是以課件類(lèi)型為子游戲,這樣做會(huì)不會(huì)存在什么問(wèn)題?我們以荷小魚(yú)大語(yǔ)文為例,下圖是大語(yǔ)文部分課程:
?

從圖中可以看到,大語(yǔ)文下面的課件比較多,而且還有存在增加課程。
這樣開(kāi)發(fā)下去大語(yǔ)文就越來(lái)越大課程,導(dǎo)致包體積越來(lái)越大。
如果以大語(yǔ)文為子游戲的話,隨著時(shí)間的推移,下載會(huì)變得越來(lái)越慢,而且這個(gè)方案也存在無(wú)法按需下載的問(wèn)題。
這個(gè)體驗(yàn)跟沒(méi)有引入大廳子游戲差不多,只是沒(méi)有熱更新那么嚴(yán)重,增長(zhǎng)的速度也較慢,但慢慢也會(huì)走上那條道路,并未做到按需下載,所以這個(gè)子游戲方案存在不合理。
我們需要改進(jìn),看下面方案。
從上圖可以看到,我們不對(duì)大課件作為子游戲,而是對(duì)他下面的每個(gè)課件作為子游戲來(lái)。
這樣就把每個(gè)課件拆分為 N 個(gè)子游戲,我們以拆分到不能拆為止,以它為單位來(lái)作為子游戲,而且包體也非常小,做到按需下載,不會(huì)影響到不需要上這個(gè)課程的用戶(hù)。?
拆那么細(xì)的好處有:
可以做到每個(gè)課件獨(dú)立,課件間無(wú)任何聯(lián)系。如果需要用到的課,可以直接使用,無(wú)需再開(kāi)發(fā),提高開(kāi)發(fā)效率。
單個(gè)包體積變得很小,下載的速度很快,用戶(hù)短時(shí)間即可體驗(yàn)課程;
做到按需下載,更新內(nèi)容只針對(duì)用戶(hù)需要的更新,其他更新不影響未使用用戶(hù),這樣用戶(hù)體驗(yàn)就會(huì)非常好。
不難發(fā)現(xiàn)通過(guò)以上模式,我們就能很好地實(shí)現(xiàn)課件的開(kāi)發(fā),并保障用戶(hù)體驗(yàn),同時(shí)輕松實(shí)現(xiàn)跨平臺(tái),大大降低開(kāi)發(fā)成本。
Cocos 針對(duì)教育行業(yè)子課件的需求,提供了一體化的解決方案:Cocos Runtime,通過(guò) Cocos Runtime 可以快速實(shí)現(xiàn)上文所有功能。
具體信息可以掃描下方二維碼聯(lián)系 Cocos 商務(wù)同學(xué)咨詢(xún)噢!

?
以上就是今天的沐思在線教育課件熱更方案分享,再次感謝吳彧大大。
很遺憾疫情的反撲中止了?Cocos 「十周年系列沙龍」的腳步。
但沒(méi)關(guān)系,相信很快春暖花開(kāi),我們會(huì)有更多的旅程可以一起奔赴。希望廣大開(kāi)發(fā)者們工作的同時(shí),保重身體。祝眉目舒展,順問(wèn)冬安
