鄒偉倔监,后端高級工程師直砂,對前端也有一定開發(fā)經(jīng)驗。2010年于華南理工大學畢業(yè)后加入騰訊浩习,參與CDB静暂、TGW等云服務研發(fā),現(xiàn)主要負責微信游戲業(yè)務后臺系統(tǒng)的架構設計與研發(fā)管理谱秽。
大家下午好洽蛀,今天我分享的主題是如何開發(fā)一款火爆的小游戲。其實小程序和小游戲還是有一些共通的地方疟赊,比如在登錄部分小程序和小游戲是類似的辱士,而Wafer2也是支持小游戲的。
如何快速開發(fā)一款火爆的小游戲听绳?“火爆”是一個偏運營的詞颂碘,今天介紹的內容可能更傾向于技術方面,即如何利用微信的開放能力開發(fā)一款小游戲椅挣。小游戲上線120天時發(fā)布了幾個重要的消息头岔,其中有幾個數(shù)字可以用來描述“火爆”這個詞。微信小游戲正式允許第三方開發(fā)者發(fā)布的時間是在3月3日鼠证,而現(xiàn)在幾款小游戲的用戶已經(jīng)過億峡竣,安卓月流水過千萬的也有數(shù)款小游戲,大家應該已經(jīng)體會到了微信小游戲的火爆程度量九。
與火爆相關的兩個知識适掰,一個就是如何開發(fā)颂碧?首先要利用好微信的社交相關性,微信去中心化的情景下社交分享互動是非常重要的类浪,因為沒有傳統(tǒng)流量分發(fā)的總入口载城。第二個是操作的簡便性,我們根據(jù)游戲成為爆款游戲后的數(shù)據(jù)才能推出這兩個結論费就,并不是說具備這兩個特性就一定能開發(fā)出一款火爆的游戲诉瓦。
什么是小游戲?
首先為大家介紹一下什么是小游戲:小游戲特指微信小游戲力细,是小程序的一個子類目睬澡,可在微信內被便捷地獲取和傳播,即點即玩眠蚂,具備出色的用戶體驗煞聪。在開發(fā)的視角來看,小游戲是一個基于Canvas/WebGL + 微信社交開放能力的新平臺逝慧。在框架上看分為三層米绕,是一個典型的分層架構。微信中有一個小游戲的Runtime去運行小游戲馋艺,而OS本身可能會涉及到不同類的設備栅干。
如果放大小游戲的Runtime可以看到很多的細節(jié),第一就是游戲邏輯捐祠,也就是與平臺無關的游戲邏輯的開發(fā)碱鳞。第二部分是游戲引擎,大部分會用到一些引擎的工作流踱蛀、一些各種系統(tǒng)封裝好的高層的API窿给。第三部分是weapp,小游戲的框架是參考了webview的框架率拒,但其實它的底層不是webview崩泡,而是webview精簡優(yōu)化過的平臺,小游戲有的只是與核心相關的一些渲染的API猬膨。這里的weapp-adaper是把小游戲的能力適配到與webview更接近的環(huán)境角撞,讓更上層的游戲或引擎本身能夠更快速地集入到平臺中。
微信的Runtime對外暴露的都是微信的API勃痴,所有的能力都是通過微信API發(fā)布出去的谒所。底層最基本的能力是渲染相關的,即Canvas 2d和WebGL沛申。其他一些微信相關的能力是另外一部劣领,所以小游戲在架構上和小程序是有差別的,但用戶體驗起來沒有太大的區(qū)別铁材。小游戲是沒有頁面概念的尖淘,在實現(xiàn)上也不完全是webview奕锌,其中不必要的部分已經(jīng)被去掉了。
總的來說小游戲的入口為game.js村生,游戲可以利用底層的一些能力將游戲的整個界面繪制出來惊暴。配置文件為game.json主要用來配置小游戲是橫屏還是豎屏,小游戲的全局對象game Gobal類似于webview中的window對象梆造,同時支持javascript語言缴守。但是小游戲有一個重要的一個限制是禁止動態(tài)執(zhí)行代碼葬毫,開發(fā)者必須先提交審核镇辉,在審核通過后才可以上架給普通用戶。另外贴捡,小游戲包括引擎的代碼量比較大忽肛,所以限制大小比小程序要大,首包限制大小為4M烂斋。
下面來說一下Webview Adapter屹逛,它的初衷是為了讓游戲開發(fā)者更好地熟悉我們的平臺,所以我們的平臺在能力上會盡可能地與webview做一些適配汛骂,其實這個適配也是很簡單的一層罕模。比如說我們在瀏覽器里面使用image對象創(chuàng)建一個圖片,而在小游戲里是通過wx.createimage來創(chuàng)建的帘瞭,在代碼中需要做一個簡單的適配淑掌。比如說Canvas、Document都是在Adapter中實現(xiàn)的蝶念,大家可以研究鏈接中的代碼抛腕。其中有一些優(yōu)化的版本,之后官方不會繼續(xù)維系這個Adapter媒殉,因為我們會更專注于底層能力的建設担敌。如果大家已經(jīng)比較熟悉這個平臺的話,就會比較容易地開發(fā)游戲廷蓉。比如Document這個對象在小游戲框架本身中跟普通對象是沒有區(qū)別的全封,它是Adapter做的一個簡單的適配。
下圖是小游戲能力的概覽桃犬,最近小游戲能力的迭代比較快售貌,部分能力還沒有羅列出來。比如最近剛發(fā)布的游戲圈疫萤、健康系統(tǒng)相關的一些接口颂跨,都還沒有列進去。我們先看一下基礎能力扯饶,在渲染這部分WebGL1.0和Canvas 2D都是支持的恒削,這里的Canvas更接近于瀏覽器里面的標準池颈。同時,這里提到的可控幀率的概念钓丰,如果小游戲在后臺運行的話躯砰,可以盡量將幀率降低。在多媒體部分携丁,小游戲還不能像小程序一樣實現(xiàn)實時的音頻視頻流琢歇,這是我們在后續(xù)要進一步支持的。網(wǎng)絡IO的部分與小程序也是類似的梦鉴,我們也提供了一些UI的組件李茫,比如說拉起鍵盤,模態(tài)對話框等肥橙。
小游戲的社交開放能力現(xiàn)在已經(jīng)對外開放了魄宏。其中最重要的一個能力是開放域,將微信的好友關系列開放出去存筏,給開發(fā)者一起使用宠互,但也存在著一些限制。因為小游戲去中心化的特點椭坚,分享這一部分也是非常重要的予跌,開發(fā)者要考慮如何將這個能力利用起來。在代碼方面善茎,因為首包限制是4兆券册,但部分小游戲的代碼量可能比較大。我們最近也在規(guī)劃一個分包的能力巾表,異步加載代碼汁掠,但這個代碼是一定要經(jīng)過我們審核的。
如何開發(fā)一款小游戲集币?
那么如何開發(fā)一款小游戲考阱?因為我本人也只是開發(fā)過一些簡單的游戲,并不是專業(yè)進行游戲開發(fā)鞠苟,所以接下來我會更多地介紹一下如何利用微信的能力來開發(fā)小游戲乞榨。
選擇小游戲引擎
首先在開發(fā)游戲時要選擇引擎,我們與引擎商也有著比較密切的合作当娱,開發(fā)小游戲的引擎一定要是適配的吃既。比如在底層,一開始引擎可能只支持原生的游戲跨细,在微信小游戲上就要做一些適配鹦倚,依賴瀏覽器特有的能力段化。Cocos Creator馆里、Egret Engine碌上、LayaAir Engine這三個引擎已經(jīng)支持了小游戲的開發(fā)揽碘,網(wǎng)上也有相應的文章介紹如何發(fā)布到微信小游戲的平臺。
設備/環(huán)境適配
有關設備管理的適配媒楼,小游戲會有API提供獲取屏幕的寬高乐尊、設備像素比等能力。在小游戲開發(fā)完成后划址,在開發(fā)者工具也可以發(fā)起真機測試的請求扔嵌,微信提供了不同設備的測試集群,幫助開發(fā)者提前去發(fā)現(xiàn)問題夺颤×《校基礎庫提供的wx API本身是一個不斷迭代更新的過程,對于使用了新能力的小游戲拂共,需要做低版本兼容牺弄。比如在檢測到不支持新 API的低版本允許有損服務用戶姻几。同時宜狐,如果某個低版本的用戶占比較少,可以考慮在管理后臺直接配置小游戲要求的基礎庫最低版本蛇捌,當然也意味著這一部分用戶在接觸到這個小游戲時抚恒,微信客戶端會彈出一個要求用戶更新到微信新版本才可使用該小游戲的提示,如果不更新可能就會失去這個用戶络拌。
微信登錄
小游戲的登陸過程與小程序類似俭驮,需要用戶自定義登錄狀態(tài)。appsecret/session_key代表的是小游戲開發(fā)者和微信平臺之間的一種信任約定春贸,比如支付混萝、上報托管數(shù)據(jù),平臺方需要驗證 access_token萍恕,和用戶相關的還要驗證session_key的簽名逸嘀,才能保證請求來自于小游戲開發(fā)者或用戶。access_token是一種應用態(tài)的 access_token允粤,與用戶無關崭倘,需要保證全局維護一份,應該有一個中控的模塊去保證 access_token有效类垫,同時在有效期內直接使用本地 cache的 access_token司光,而不是每次使用都去生成新的 access_token,否則可能遇到調用頻率限制的錯誤而影響服務悉患。切記 appsecret/session_key不要放到前端代碼中去残家,否則可能會被惡意利用從而損壞小游戲開發(fā)者或用戶的權益。
緩存
緩存類型包括數(shù)據(jù)緩存和文件緩存兩種售躁。數(shù)據(jù)緩存即key-value存儲坞淮,適合結構化類型的小數(shù)據(jù)存儲谴仙,上限為 10MB。文件緩存提供了一個完整的文件系統(tǒng) API碾盐,包括目錄 /文件的增刪改讀晃跺,適合針對經(jīng)常使用的網(wǎng)絡資源做本地緩存,上限是50MB毫玖。
和瀏覽器不同的是掀虎,微信只提供了基本的存儲管理能力,并不對存儲什么以及存儲滿時刪除什么做一些操作付枫。開發(fā)者自行靈活定義緩存及淘汰策略烹玉,比如對經(jīng)常訪問的資源存儲到文件系統(tǒng)以及在文件存儲滿時,清理一些最近不常訪問的文件阐滩。
開放數(shù)據(jù)域
我們來說一下開發(fā)數(shù)據(jù)域二打,也就是在保護用戶隱私的前提下把用戶的數(shù)據(jù)開放給小游戲。這是一個封閉掂榔、獨立的javascript作用域继效,開放數(shù)據(jù)域是一個獨立的目錄,其入口文件是index.js装获。目前的限制在于僅支持2d渲染模式瑞信,數(shù)據(jù)只進不出。比如說一個排行榜穴豫,它的目的肯定是用來給用戶看的凡简。
我們簡單看一下它的實現(xiàn)方案,左邊是主域精肃。用戶拿到這些數(shù)據(jù)后實現(xiàn)排行榜其實也是一個Canvas秤涩。它的區(qū)別在于Canvas不能把數(shù)據(jù)取出來,無法分析其中的數(shù)據(jù)是什么司抱。主域里面有一個Canvas筐眷,在微信里上屏Canvas跟屏幕關聯(lián),后面都是離線的Canvas状植,離線的Canvas可以自己根據(jù)需求使用的浊竟。一旦開放數(shù)據(jù)以后,上屏Canvas不能把里面的數(shù)據(jù)取出來津畸,下一個Canvas也不能取出來振定,保證了數(shù)據(jù)的安全性。
因為我們的數(shù)據(jù)在開發(fā)數(shù)據(jù)域中肉拓,用戶沒有辦法進行開發(fā)后频。所以要求開發(fā)者在開發(fā)時將需要的數(shù)據(jù)托管到我們這里,與用戶關聯(lián)起來。這樣就可以在開發(fā)數(shù)據(jù)域里面取到相關數(shù)據(jù)卑惜,其應用場景有好友排行膏执、群排行榜、超越好友提示等露久。用戶在輸入的時候更米,重復用戶的所有操作,在上屏的Canvas和離屏的Canvas上就得到了用戶的所有輸入毫痕,不會有開放數(shù)據(jù)滲透進去征峦。
分享
如果用戶在游戲中達到了很高的分數(shù),可以與好友PK一下消请。在自定義轉發(fā)的窗口栏笆,標題和圖片都可以自定義。但是現(xiàn)在有很多小游戲非常騷擾用戶臊泰,他們做了很多一定需要分享蛉加,才能允許玩游戲的設定。這是大家需要思考的部分缸逃,如何既不影響用戶的體驗针饥,又能夠促進小游戲的互動,在這里需要找到一個合適的平衡點察滑。同時打厘,在分享數(shù)據(jù)后將小游戲與這個群聊關聯(lián)起來修肠,我們就可以看到一個小游戲平臺贺辰。
支付
小游戲是支持虛擬支付的,但目前僅適用于安卓系統(tǒng)中嵌施。且它的方式目前只有一種饲化,即貨幣托管的方式。主要分為兩個流程吗伤,一是用戶花錢購買游戲幣吃靠,這與游戲的服務端是沒有關系的。發(fā)起支付時微信客戶端會生成一個訂單足淆,讓用戶確認支付巢块,這是異步的。平臺負責把用戶RMB兌換成對應的游戲幣巧号,存儲到用戶對應的游戲帳號上族奢。二是使用游戲幣購買道具,開發(fā)者可以扣除對應的游戲幣丹鸿,給用戶發(fā)放游戲內道具越走,扣除游戲幣的過程需要有一定的事務機制,保證在網(wǎng)絡異常的情況下交易正常±鹊校扣除游戲幣的接口支持根據(jù)訂單ID去重铜跑,意味著在網(wǎng)絡超時等情況下,開發(fā)者可用同樣的訂單ID去重試扣除骡澈,直至返回明確的響應锅纺。
性能
小游戲常見的性能問題,一般是內存造成的肋殴。如果內存占用太多會被微信客戶端主動關閉伞广,因此開發(fā)者在用戶游戲過程中要及時釋放不再使用的內存,特別是Canvas和Image類的大型對象疼电,同時可以主動調用wx.triggerGC觸發(fā)底層回收對應資源嚼锄。對于和游戲邏輯相對獨立的工作,可以考慮在worker中去實現(xiàn)蔽豺,小游戲提供了獨立的worker線程執(zhí)行js邏輯的能力区丑。
版本更新機制
小游戲有熱啟動和冷啟動之分,冷啟動是指內存中無該小游戲的運行實例的情況下修陡,啟動小游戲的過程沧侥;熱啟動是指小游戲的運行實例在內存中還存在,只是暫時切換到了后臺魄鸦,這時用戶再次觸發(fā)小游戲回到前臺的過程宴杀。在如果用戶點擊啟動之后,游戲運行時會加載出來這款游戲拾因。在點擊右上角的菜單時旺罢,按紐只是掛后臺,在一定的時間內再啟動時,它會立即恢復绢记,這時內存將會釋放扁达。
小游戲會在冷啟動時檢查小游戲的版本,如有新版本蠢熄,在下載回本地后跪解,下一次冷啟動即可使用最新版。當然签孔,我們也提供了 API可以供開發(fā)者決策在有版本可用時叉讥,是否需要強制更新,應用最新的版本饥追。
運維
管理端提供了發(fā)布图仓、回滾、停服等能力判耕,開發(fā)者可以充分利用平臺的能力透绩。比如在后臺操作中,js可能會報錯。腳本錯誤主要由運行過程中未捕獲的異常觸發(fā)帚豪,該類異程季梗可能會導致用戶小游戲前端的js邏輯暫停執(zhí)行。同時狸臣,平臺也提供了完善的數(shù)據(jù)分析服務莹桅,可以通過小游戲使用助手進行數(shù)據(jù)分析。
Q/A
Q:在剛才的演講中我聽到有一個首包大小限制的問題烛亦,剛才也提到一個解決方案诈泼,是分包加載的機制,我們的小程序里面也有這個煤禽,首包限制是4兆嗎铐达?
A:是的。
Q:分包限制大小是多少檬果?單個分包限制大小多少瓮孙?整包限制大小是多少?最終有多大的限制选脊?因為業(yè)務邏輯的復雜性杭抠,可能決定這個包的大小會不斷的增加。
A:其實我們分首包的限制恳啥,主要是從用戶體驗上考慮的偏灿。包越大,用戶的網(wǎng)絡或者下載的速度時間越長钝的,用戶流失越多翁垂。首包4兆肯定是不會變化的,分包不是說不允許提交多少扁藕,后面的分包大小會不斷調整的沮峡,一定會有2兆或者幾兆的限制。
Q:整包的大小呢亿柑?
A:要考慮對微信本身的影響,比如一個包幾百兆左右棍弄。
Q:我想問一下在前面分享過程當中都提到的session問題望薄。
A:session比較重要,比如說分享到群需要加密鑰呼畸。如果想得到這個群的ID必須要用session解密痕支,還有支付行為必須要用到session。只有小游戲的服務端與用戶一起過來蛮原,我們才可以允許進行與支付相關的行為卧须,比如游戲幣。
Q:session是用于處理業(yè)務邏輯之外的?
A:類似于理解為用戶的登錄態(tài)花嘶,就代表這個用戶登錄了我們的小游戲笋籽。
Q:我們游戲里面的資源相對于小程序的資源會多很多,但是我們?yōu)榱诵实目紤]椭员,盡量多做一些緩存车海,實際上提供緩存的空間比較小。為了效率的考慮如果緩存多一些隘击,很多圖片不需要重新加載很多頁面不需要重新生成侍芝,想聽一下有關這方面的建議。
A:比如說數(shù)據(jù)緩存是10兆埋同,是文件類型的緩存州叠。文件類型的緩存我們這邊是50兆,你們的資源要超過50兆凶赁,整體的策略要考慮一下留量,如果太大會導致用戶的包占用用戶體系比較大。也不排除后面會做一些優(yōu)化哟冬,比如兩個小游戲共用一整塊的空間楼熄,所有小游戲共用這個緩存。用戶不只是玩你這一個游戲浩峡,如果你的小游戲占得比較大可岂,在他們玩其他游戲時,這些游戲就會把你擠掉翰灾。后期我們也會做一些優(yōu)化缕粹,同時也需要開發(fā)者將這方面的需求反饋給我們。
Q:我注意到現(xiàn)在小游戲講究的是去中心化纸淮,對于中小廠商的我們來說卻并沒有太多的應用平斩,現(xiàn)在來看有什么好的方法嗎?
A:其實去中心化代表為小型開發(fā)者和中等開發(fā)者咽块,或大型開發(fā)者提供同樣的舞臺绘面,大家都有同樣的機會。只要游戲做得足夠好用戶就會分享侈沪,分享就會引發(fā)爆款揭璃。最近的小游戲就是通過去中心化完成的,分享類似于朋友圈的傳播速度亭罪,只要把一些微信分享的東西做好瘦馍,再把游戲的品質提高,就會成為爆款应役。
Q:比較火的小游戲情组,跟種子用戶有什么矛盾燥筷?
A:如果我們有一個好友在玩,有好友在玩的話就會傳播出去院崇,可能會給每個游戲一些種子用戶肆氓,有一定程度的曝光,但這主要取決于它的表現(xiàn)亚脆。
作者:鄒偉
鏈接:鄒偉:如何開發(fā)一款小游戲-實戰(zhàn)教程-小程序社區(qū)-微信小程序-微信小程序開發(fā)社區(qū)-小程序開發(fā)論壇-微信小程序聯(lián)盟
著作權歸作者所有做院。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處濒持。