鄒偉:如何開發一款小遊戲

騰訊雲加社群發表於2018-05-09
歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~
鄒偉,後端高階工程師,對前端也有一定開發經驗。2010年於華南理工大學畢業後加入騰訊,參與CDB、TGW等雲服務研發,現主要負責微信遊戲業務後臺系統的架構設計與研發管理。

大家下午好,今天我分享的主題是如何開發一款火爆的小遊戲。其實小程式和小遊戲還是有一些共通的地方,比如在登入部分小程式和小遊戲是類似的,而Wafer2也是支援小遊戲的。

如何快速開發一款火爆的小遊戲?“火爆”是一個偏運營的詞,今天介紹的內容可能更傾向於技術方面,即如何利用微信的開放能力開發一款小遊戲。小遊戲上線120天時釋出了幾個重要的訊息,其中有幾個數字可以用來描述“火爆”這個詞。微信小遊戲正式允許第三方開發者釋出的時間是在3月3日,而現在幾款小遊戲的使用者已經過億,安卓月流水過千萬的也有數款小遊戲,大家應該已經體會到了微信小遊戲的火爆程度。

與火爆相關的兩個知識,一個就是如何開發?首先要利用好微信的社交相關性,微信去中心化的情景下社交分享互動是非常重要的,因為沒有傳統流量分發的總入口。第二個是操作的簡便性,我們根據遊戲成為爆款遊戲後的資料才能推出這兩個結論,並不是說具備這兩個特性就一定能開發出一款火爆的遊戲。

什麼是小遊戲?

首先為大家介紹一下什麼是小遊戲:小遊戲特指微信小遊戲,是小程式的一個子類目,可在微信內被便捷地獲取和傳播,即點即玩,具備出色的使用者體驗。在開發的視角來看,小遊戲是一個基於Canvas/WebGL + 微信社交開放能力的新平臺。在框架上看分為三層,是一個典型的分層架構。微信中有一個小遊戲的Runtime去執行小遊戲,而OS本身可能會涉及到不同類的裝置。

如果放大小遊戲的Runtime可以看到很多的細節,第一就是遊戲邏輯,也就是與平臺無關的遊戲邏輯的開發。第二部分是遊戲引擎,大部分會用到一些引擎的工作流、一些各種系統封裝好的高層的API。第三部分是weapp,小遊戲的框架是參考了webview的框架,但其實它的底層不是webview,而是webview精簡優化過的平臺,小遊戲有的只是與核心相關的一些渲染的API。這裡的weapp-adaper是把小遊戲的能力適配到與webview更接近的環境,讓更上層的遊戲或引擎本身能夠更快速地集入到平臺中。

微信的Runtime對外暴露的都是微信的API,所有的能力都是通過微信API釋出出去的。底層最基本的能力是渲染相關的,即Canvas 2d和WebGL。其他一些微信相關的能力是另外一部,所以小遊戲在架構上和小程式是有差別的,但使用者體驗起來沒有太大的區別。小遊戲是沒有頁面概念的,在實現上也不完全是webview,其中不必要的部分已經被去掉了。

總的來說小遊戲的入口為game.js,遊戲可以利用底層的一些能力將遊戲的整個介面繪製出來。配置檔案為game.json主要用來配置小遊戲是橫屏還是豎屏,小遊戲的全域性物件game Gobal類似於webview中的window物件,同時支援javascript語言。但是小遊戲有一個重要的一個限制是禁止動態執行程式碼,開發者必須先提交稽核,在稽核通過後才可以上架給普通使用者。另外,小遊戲包括引擎的程式碼量比較大,所以限制大小比小程式要大,首包限制大小為4M。

下面來說一下Webview Adapter,它的初衷是為了讓遊戲開發者更好地熟悉我們的平臺,所以我們的平臺在能力上會盡可能地與webview做一些適配,其實這個適配也是很簡單的一層。比如說我們在瀏覽器裡面使用image物件建立一個圖片,而在小遊戲裡是通過wx.createimage來建立的,在程式碼中需要做一個簡單的適配。比如說Canvas、Document都是在Adapter中實現的,大家可以研究連結中的程式碼。其中有一些優化的版本,之後官方不會繼續維繫這個Adapter,因為我們會更專注於底層能力的建設。如果大家已經比較熟悉這個平臺的話,就會比較容易地開發遊戲。比如Document這個物件在小遊戲框架本身中跟普通物件是沒有區別的,它是Adapter做的一個簡單的適配。

下圖是小遊戲能力的概覽,最近小遊戲能力的迭代比較快,部分能力還沒有羅列出來。比如最近剛釋出的遊戲圈、健康系統相關的一些介面,都還沒有列進去。我們先看一下基礎能力,在渲染這部分WebGL1.0和Canvas 2D都是支援的,這裡的Canvas更接近於瀏覽器裡面的標準。同時,這裡提到的可控幀率的概念,如果小遊戲在後臺執行的話,可以儘量將幀率降低。在多媒體部分,小遊戲還不能像小程式一樣實現實時的音訊視訊流,這是我們在後續要進一步支援的。網路IO的部分與小程式也是類似的,我們也提供了一些UI的元件,比如說拉起鍵盤,模態對話方塊等。

小遊戲的社交開放能力現在已經對外開放了。其中最重要的一個能力是開放域,將微信的好友關係列開放出去,給開發者一起使用,但也存在著一些限制。因為小遊戲去中心化的特點,分享這一部分也是非常重要的,開發者要考慮如何將這個能力利用起來。在程式碼方面,因為首包限制是4兆,但部分小遊戲的程式碼量可能比較大。我們最近也在規劃一個分包的能力,非同步載入程式碼,但這個程式碼是一定要經過我們稽核的。

如何開發一款小遊戲?

那麼如何開發一款小遊戲?因為我本人也只是開發過一些簡單的遊戲,並不是專業進行遊戲開發,所以接下來我會更多地介紹一下如何利用微信的能力來開發小遊戲。

選擇小遊戲引擎

首先在開發遊戲時要選擇引擎,我們與引擎商也有著比較密切的合作,開發小遊戲的引擎一定要是適配的。比如在底層,一開始引擎可能只支援原生的遊戲,在微信小遊戲上就要做一些適配,依賴瀏覽器特有的能力。Cocos Creator、Egret Engine、LayaAir Engine這三個引擎已經支援了小遊戲的開發,網上也有相應的文章介紹如何釋出到微信小遊戲的平臺。

裝置/環境適配

有關裝置管理的適配,小遊戲會有API提供獲取螢幕的寬高、裝置畫素比等能力。在小遊戲開發完成後,在開發者工具也可以發起真機測試的請求,微信提供了不同裝置的測試叢集,幫助開發者提前去發現問題。基礎庫提供的wx API本身是一個不斷迭代更新的過程,對於使用了新能力的小遊戲,需要做低版本相容。比如在檢測到不支援新 API的低版本允許有損服務使用者。同時,如果某個低版本的使用者佔比較少,可以考慮在管理後臺直接配置小遊戲要求的基礎庫最低版本,當然也意味著這一部分使用者在接觸到這個小遊戲時,微信客戶端會彈出一個要求使用者更新到微信新版本才可使用該小遊戲的提示,如果不更新可能就會失去這個使用者。

微信登入

小遊戲的登陸過程與小程式類似,需要使用者自定義登入狀態。appsecret/session_key代表的是小遊戲開發者和微信平臺之間的一種信任約定,比如支付、上報託管資料,平臺方需要驗證 access_token,和使用者相關的還要驗證session_key的簽名,才能保證請求來自於小遊戲開發者或使用者。access_token是一種應用態的 access_token,與使用者無關,需要保證全域性維護一份,應該有一箇中控的模組去保證 access_token有效,同時在有效期內直接使用本地 cache的 access_token,而不是每次使用都去生成新的 access_token,否則可能遇到呼叫頻率限制的錯誤而影響服務。切記 appsecret/session_key不要放到前端程式碼中去,否則可能會被惡意利用從而損壞小遊戲開發者或使用者的權益。

快取

快取型別包括資料快取和檔案快取兩種。資料快取即key-value儲存,適合結構化型別的小資料儲存,上限為 10MB。檔案快取提供了一個完整的檔案系統 API,包括目錄 /檔案的增刪改讀,適合針對經常使用的網路資源做本地快取,上限是50MB。

和瀏覽器不同的是,微信只提供了基本的儲存管理能力,並不對儲存什麼以及儲存滿時刪除什麼做一些操作。開發者自行靈活定義快取及淘汰策略,比如對經常訪問的資源儲存到檔案系統以及在檔案儲存滿時,清理一些最近不常訪問的檔案。

開放資料域

我們來說一下開發資料域,也就是在保護使用者隱私的前提下把使用者的資料開放給小遊戲。這是一個封閉、獨立的javascript作用域,開放資料域是一個獨立的目錄,其入口檔案是index.js。目前的限制在於僅支援2d渲染模式,資料只進不出。比如說一個排行榜,它的目的肯定是用來給使用者看的。

我們簡單看一下它的實現方案,左邊是主域。使用者拿到這些資料後實現排行榜其實也是一個Canvas。它的區別在於Canvas不能把資料取出來,無法分析其中的資料是什麼。主域裡面有一個Canvas,在微信裡上屏Canvas跟螢幕關聯,後面都是離線的Canvas,離線的Canvas可以自己根據需求使用的。一旦開放資料以後,上屏Canvas不能把裡面的資料取出來,下一個Canvas也不能取出來,保證了資料的安全性。

因為我們的資料在開發資料域中,使用者沒有辦法進行開發。所以要求開發者在開發時將需要的資料託管到我們這裡,與使用者關聯起來。這樣就可以在開發資料域裡面取到相關資料,其應用場景有好友排行、群排行榜、超越好友提示等。使用者在輸入的時候,重複使用者的所有操作,在上屏的Canvas和離屏的Canvas上就得到了使用者的所有輸入,不會有開放資料滲透進去。

分享

如果使用者在遊戲中達到了很高的分數,可以與好友PK一下。在自定義轉發的視窗,標題和圖片都可以自定義。但是現在有很多小遊戲非常騷擾使用者,他們做了很多一定需要分享,才能允許玩遊戲的設定。這是大家需要思考的部分,如何既不影響使用者的體驗,又能夠促進小遊戲的互動,在這裡需要找到一個合適的平衡點。同時,在分享資料後將小遊戲與這個群聊關聯起來,我們就可以看到一個小遊戲平臺。

支付

小遊戲是支援虛擬支付的,但目前僅適用於安卓系統中。且它的方式目前只有一種,即貨幣託管的方式。主要分為兩個流程,一是使用者花錢購買遊戲幣,這與遊戲的服務端是沒有關係的。發起支付時微信客戶端會生成一個訂單,讓使用者確認支付,這是非同步的。平臺負責把使用者RMB兌換成對應的遊戲幣,儲存到使用者對應的遊戲帳號上。二是使用遊戲幣購買道具,開發者可以扣除對應的遊戲幣,給使用者發放遊戲內道具,扣除遊戲幣的過程需要有一定的事務機制,保證在網路異常的情況下交易正常。扣除遊戲幣的介面支援根據訂單ID去重,意味著在網路超時等情況下,開發者可用同樣的訂單ID去重試扣除,直至返回明確的響應。

效能

小遊戲常見的效能問題,一般是記憶體造成的。如果記憶體佔用太多會被微信客戶端主動關閉,因此開發者在使用者遊戲過程中要及時釋放不再使用的記憶體,特別是Canvas和Image類的大型物件,同時可以主動呼叫wx.triggerGC觸發底層回收對應資源。對於和遊戲邏輯相對獨立的工作,可以考慮在worker中去實現,小遊戲提供了獨立的worker執行緒執行js邏輯的能力。

版本更新機制

小遊戲有熱啟動和冷啟動之分,冷啟動是指記憶體中無該小遊戲的執行例項的情況下,啟動小遊戲的過程;熱啟動是指小遊戲的執行例項在記憶體中還存在,只是暫時切換到了後臺,這時使用者再次觸發小遊戲回到前臺的過程。在如果使用者點選啟動之後,遊戲執行時會載入出來這款遊戲。在點選右上角的選單時,按紐只是掛後臺,在一定的時間內再啟動時,它會立即恢復,這時記憶體將會釋放。

小遊戲會在冷啟動時檢查小遊戲的版本,如有新版本,在下載回本地後,下一次冷啟動即可使用最新版。當然,我們也提供了 API可以供開發者決策在有版本可用時,是否需要強制更新,應用最新的版本。

運維

管理端提供了釋出、回滾、停服等能力,開發者可以充分利用平臺的能力。比如在後臺操作中,js可能會報錯。指令碼錯誤主要由執行過程中未捕獲的異常觸發,該類異常可能會導致使用者小遊戲前端的js邏輯暫停執行。同時,平臺也提供了完善的資料分析服務,可以通過小遊戲使用助手進行資料分析。

Q/A

Q:在剛才的演講中我聽到有一個首包大小限制的問題,剛才也提到一個解決方案,是分包載入的機制,我們的小程式裡面也有這個,首包限制是4兆嗎?

A:是的。

Q:分包限制大小是多少?單個分包限制大小多少?整包限制大小是多少?最終有多大的限制?因為業務邏輯的複雜性,可能決定這個包的大小會不斷的增加。

A:其實我們分首包的限制,主要是從使用者體驗上考慮的。包越大,使用者的網路或者下載的速度時間越長,使用者流失越多。首包4兆肯定是不會變化的,分包不是說不允許提交多少,後面的分包大小會不斷調整的,一定會有2兆或者幾兆的限制。

Q:整包的大小呢?

A:要考慮對微信本身的影響,比如一個包幾百兆左右。

Q:我想問一下在前面分享過程當中都提到的session問題。

A:session比較重要,比如說分享到群需要加金鑰。如果想得到這個群的ID必須要用session解密,還有支付行為必須要用到session。只有小遊戲的服務端與使用者一起過來,我們才可以允許進行與支付相關的行為,比如遊戲幣。

Q:session是用於處理業務邏輯之外的?

A:類似於理解為使用者的登入態,就代表這個使用者登入了我們的小遊戲。

Q:我們遊戲裡面的資源相對於小程式的資源會多很多,但是我們為了效率的考慮,儘量多做一些快取,實際上提供快取的空間比較小。為了效率的考慮如果快取多一些,很多圖片不需要重新載入很多頁面不需要重新生成,想聽一下有關這方面的建議。

A:比如說資料快取是10兆,是檔案型別的快取。檔案型別的快取我們這邊是50兆,你們的資源要超過50兆,整體的策略要考慮一下,如果太大會導致使用者的包占用使用者體系比較大。也不排除後面會做一些優化,比如兩個小遊戲共用一整塊的空間,所有小遊戲共用這個快取。使用者不只是玩你這一個遊戲,如果你的小遊戲佔得比較大,在他們玩其他遊戲時,這些遊戲就會把你擠掉。後期我們也會做一些優化,同時也需要開發者將這方面的需求反饋給我們。

Q:我注意到現在小遊戲講究的是去中心化,對於中小廠商的我們來說卻並沒有太多的應用,現在來看有什麼好的方法嗎?

A:其實去中心化代表為小型開發者和中等開發者,或大型開發者提供同樣的舞臺,大家都有同樣的機會。只要遊戲做得足夠好使用者就會分享,分享就會引發爆款。最近的小遊戲就是通過去中心化完成的,分享類似於朋友圈的傳播速度,只要把一些微信分享的東西做好,再把遊戲的品質提高,就會成為爆款。

Q:比較火的小遊戲,跟種子使用者有什麼矛盾?

A:如果我們有一個好友在玩,有好友在玩的話就會傳播出去,可能會給每個遊戲一些種子使用者,有一定程度的曝光,但這主要取決於它的表現。


更多分享資料,請戳下面的連結:

如何開發一款小遊戲.pdf

問答
微信小程式如何與資料庫互動?
相關閱讀
施德來:有贊電商小程式的實踐
黃文俊:Serverless小程式後端技術分享
朱展:騰訊雲小程式解決方案


此文已由作者授權騰訊雲+社群釋出,原文連結:https://cloud.tencent.com/developer/article/1117592?fromSource=waitui


相關文章