一些Phaser.js做游戲App的經(jīng)驗(yàn)


沉迷于學(xué)習(xí)無法自拔

前言

先來說說Phaser.js的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

1. 開發(fā)效率高啃洋,優(yōu)秀的封裝和豐富的工具對(duì)象可以幫你極快的完成游戲開發(fā)。

2. 渲染能力優(yōu)秀练对,底層使用同樣是成功開源項(xiàng)目的pixi.js作為渲染支持。

3. 大量的示例代碼, 沒錯(cuò)官網(wǎng)上擺著大量的示例代碼也有部分是完整游戲痹籍,這足以讓要嘗試游戲開發(fā)的新人們垂涎欲滴。

缺點(diǎn)

1. 缺乏輔助工具,沒有這些輔助工具的支持游戲制作很難變?yōu)榱魉€工作羡儿,團(tuán)隊(duì)開發(fā)效率會(huì)大打折扣。

2. js游戲APP目前都有的瓶頸是钥,內(nèi)存占用較高掠归。小游戲內(nèi)存占用很容易就達(dá)到100mb以上是目前js游戲引擎都面臨的一個(gè)性能問題。其中除了js運(yùn)行時(shí)占用悄泥,底層webview的內(nèi)存占用超過半數(shù)虏冻,至于webview性能是還有大幅優(yōu)化提升空間還是受移動(dòng)設(shè)備硬件局限這里不再深究。

局限

Phaser引擎只能開發(fā)2D游戲弹囚。嚴(yán)格來說這不算是一個(gè)缺點(diǎn)厨相,因?yàn)橐骈_發(fā)者聲明只專注2D游戲引擎實(shí)現(xiàn)。

應(yīng)用場(chǎng)景

我認(rèn)為Phaser游戲引擎雖然在商業(yè)游戲開發(fā)上無法與cocos2d或者Unity3D相抗衡鸥鹉,但是它成熟的功能支持以及良好的性能表現(xiàn)也可以在游戲開發(fā)選擇中占有一席之地蛮穿。如果你是小游戲(單人)開發(fā)者,或者游戲開發(fā)學(xué)習(xí)教學(xué)毁渗,Phaser引擎都會(huì)是個(gè)不錯(cuò)的選擇践磅。



有人做了漂亮的游戲,但卻不是我

經(jīng)驗(yàn)分享

? 學(xué)習(xí)Phaser首先閱覽官網(wǎng)的API文檔(LEARN->左側(cè)API Documentation )與Examples展示灸异,了解Phaser的能力范圍府适。另外也會(huì)有很多開發(fā)者在官網(wǎng)的News欄目中分享自己的項(xiàng)目、工具插件和經(jīng)驗(yàn)肺樟。除此之外html5gamedevs論壇是除官網(wǎng)之外Phaser資源最集中的網(wǎng)站檐春。

? 理解Phaser的設(shè)計(jì),Group么伯、Cache疟暖、Loader、State田柔。

Group

除了Phaser.Group類型誓篱,部分顯示對(duì)象也可以為其增加孩子元素,不過使用的方法與Group略有不同凯楔,比如:增加子元素 Group.add() 窜骄、Sprite.addChild()。

通常我們會(huì)用Group把顯示對(duì)象分組方便操控摆屯,例如:把敵方單位與右方單位放入不同的Group邻遏,更具體點(diǎn)把卡牌游戲中不同玩家的牌放入不同的Group中顯示和操作糠亩。

Cache

Phaser總是緩存資源增加復(fù)用性。資源加載后准验,通過一個(gè)字符串類型的key訪問獲取赎线,雖然Phaser在載入資源函數(shù)總讓你設(shè)置訪問key,但是只有你需要額外寫代碼控制的資源才需要一個(gè)唯一的名字糊饱,既然是字符串你當(dāng)然也可以用本地化語言垂寥,比如說設(shè)置Button對(duì)象設(shè)置key為“充值按鈕”。API文檔中Cache類的公開屬性里羅列了引擎支持載入的資源類型另锋。

通常你不需要手動(dòng)去釋放緩存滞项,也許你會(huì)覺得自己開發(fā)的游戲內(nèi)存占用較高是不是該手動(dòng)釋放掉緩存來降低占用率。我的建議是使用chrome任務(wù)管理夭坪,打開“JavaScript使用的內(nèi)存”文判,這個(gè)選項(xiàng)內(nèi)存占用是可以考慮優(yōu)化的,而其他的內(nèi)存占用可以通過特別的手段優(yōu)化室梅,文章稍后會(huì)細(xì)說戏仓。

Loader

Phaser引擎的支持加載的資源格式相當(dāng)豐富,除了能加載紋理圖片亡鼠、視頻音頻赏殃、json、xml间涵、動(dòng)態(tài)加載JavaScript的能力讓游戲熱更新實(shí)現(xiàn)變得十分輕松仁热。另外,關(guān)于其他文本格式的支持可以通過text格式加載后再解析浑厚。

值得一提的是加載進(jìn)度條的實(shí)現(xiàn),有一種方式是通過Loader.start()開始加載根盒,并用onFileComplete钳幅、onLoadComplete等函數(shù)監(jiān)視刷新載入進(jìn)度。這里會(huì)有兩個(gè)陷阱

1. Loader.start() 雖然可以控制開始加載的時(shí)機(jī)炎滞,但是并不意味著資源加載可以放到State的其他步驟敢艰。資源加載函數(shù)總是放在State類的preload函數(shù)中。

2. onFileComplete 收到信號(hào)不代表資源文件已經(jīng)被加載進(jìn)內(nèi)存册赛,而是說該資源被放入加載任務(wù)隊(duì)列钠导,整個(gè)載資源過程是個(gè)異步并發(fā)的過程。同樣onLoadComplete 信號(hào)也不能說明資源已經(jīng)被加載到內(nèi)存中森瘪,而是引擎調(diào)用在State類的create函數(shù)時(shí)資源一定可以被使用(已經(jīng)加載至內(nèi)存中)牡属。

State

狀態(tài)類讓游戲開發(fā)變得簡(jiǎn)便。Phaser引擎為每個(gè)狀態(tài)提供了緩存扼睬、資源訪問的快捷支持逮栅。開發(fā)者只需要實(shí)現(xiàn)包含特定方法的類就可以作為State狀態(tài)使用。以下羅列的方法中*表示必須實(shí)現(xiàn),-表示可選措伐。

- init ? ? ? ? ?初始化狀態(tài)

* preload ? 加載狀態(tài)中用到的資源

* create ? ? 創(chuàng)建顯示對(duì)象

- shutdown 釋放當(dāng)前狀態(tài)的占用(如狀態(tài)切換)

- paused? ? 處理游戲暫停

很好特纤,不過狀態(tài)拆分粒度多大比較合適呢?從引擎的支持看來為狀態(tài)提供了很多支持侥加,這說明一個(gè)狀態(tài)對(duì)象占用的內(nèi)存空間不少捧存,關(guān)于這點(diǎn)可以通過console打印整個(gè)對(duì)象核實(shí)。所以我認(rèn)為Phaser的狀態(tài)用于游戲的大粒度拆分比較合理担败,比如按游戲場(chǎng)景切分為:游戲大廳昔穴,游戲房間,游戲場(chǎng)景123氢架。除此之外部分特殊的部分也可拆分開傻咖,比如將引導(dǎo)狀態(tài),啟動(dòng)時(shí)的歡迎屏等于其他狀態(tài)分更有利于項(xiàng)目維護(hù)岖研。至于簡(jiǎn)單的狀態(tài)變化卿操,游戲內(nèi)部可以用更輕量的方式處理,畢竟減少內(nèi)存花費(fèi)就js游戲App目前內(nèi)存占用率高的環(huán)境下還是必要的孙援。


忍無可忍的你向這些折磨人的小妖精發(fā)射出憤怒的子彈

內(nèi)存

之前反復(fù)提到了內(nèi)存問題害淤,Phaser游戲App到底內(nèi)存占用有多高呢,用Cordova打包的App拓售,在Android系統(tǒng)的手機(jī)上窥摄,圖片資源不合并處理,一些手機(jī)很容就占用200MB以上(如:Mx4 Pro)础淤。這比起cocos與Unity3D的js游戲App 100MB的占用高出一倍著實(shí)讓人難以接受崭放。大家先別著急,其實(shí)優(yōu)化辦法還是有的鸽凶,而且優(yōu)化后內(nèi)存占用會(huì)與那兩個(gè)引擎相差不過币砂。

優(yōu)化一: 使用crosswalk代替Cordova的webview,強(qiáng)制開啟WebGL性能更佳玻侥。相應(yīng)的Phaser.Game也要顯示設(shè)置為WebGL渲染决摧。

* 注意使用crosswalk之后可能導(dǎo)致mp3格式的音頻資源無法加載(會(huì)報(bào)錯(cuò)),目前官方暫時(shí)沒有給出解決方案凑兰,不過有網(wǎng)友說可以通過將mp3格式轉(zhuǎn)ogg來繞過該問題掌桩。

優(yōu)化二: 合并小圖,過多的圖片載入會(huì)讓底層渲染好煩更多的內(nèi)存姑食,適當(dāng)?shù)暮喜⑿D減少渲染時(shí)的內(nèi)存消耗波岛。推薦使用ShoeBox工具合圖(也就是制作SpriteSheet),使用default項(xiàng)目生產(chǎn)即可音半。

另外盆色,如果要從cocos的plist中提取切分圖灰蛙,可以使用

Sprite-Plist-Extractor?

位圖字體

使用官方推薦的網(wǎng)站?littera?制作起來也是棒棒噠~


還有呢

還有的話就是我做了一個(gè)移動(dòng)設(shè)備快速顯示布局的框架,使用yaml格式的配置文件隔躲,基本實(shí)現(xiàn)了根據(jù)美術(shù)設(shè)計(jì)的界面原型圖為各個(gè)圖片資源配置好坐標(biāo)就能完成顯示的框架摩梧。這在不規(guī)則布局的界面是很實(shí)用的,當(dāng)然美術(shù)設(shè)計(jì)人員也可以直接在配置中調(diào)整坐標(biāo)查看效果宣旱。

PhaserMobileLayout

最后仅父,祝大家能夠和Phaser一起快樂的玩耍~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浑吟,隨后出現(xiàn)的幾起案子笙纤,更是在濱河造成了極大的恐慌,老刑警劉巖组力,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件省容,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡燎字,警方通過查閱死者的電腦和手機(jī)腥椒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來候衍,“玉大人笼蛛,你說我怎么就攤上這事◎嚷梗” “怎么了滨砍?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)妖异。 經(jīng)常有香客問我惋戏,道長(zhǎng),這世上最難降的妖魔是什么他膳? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任响逢,我火速辦了婚禮,結(jié)果婚禮上矩乐,老公的妹妹穿的比我還像新娘龄句。我一直安慰自己回论,他們只是感情好散罕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著傀蓉,像睡著了一般欧漱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葬燎,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天误甚,我揣著相機(jī)與錄音缚甩,去河邊找鬼。 笑死窑邦,一個(gè)胖子當(dāng)著我的面吹牛擅威,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冈钦,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼郊丛,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瞧筛?” 一聲冷哼從身側(cè)響起厉熟,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎较幌,沒想到半個(gè)月后揍瑟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乍炉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年绢片,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恩急。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杉畜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衷恭,到底是詐尸還是另有隱情此叠,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布随珠,位于F島的核電站灭袁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窗看。R本人自食惡果不足惜茸歧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望显沈。 院中可真熱鬧软瞎,春花似錦、人聲如沸拉讯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魔慷。三九已至只锭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間院尔,已是汗流浹背蜻展。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工喉誊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纵顾。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓伍茄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親施逾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幻林,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,302評(píng)論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法音念,內(nèi)部類的語法沪饺,繼承相關(guān)的語法,異常的語法闷愤,線程的語...
    子非魚_t_閱讀 31,664評(píng)論 18 399
  • 步驟1: 設(shè)置 actionAtItemEnd. 步驟2: 監(jiān)聽 AVPlayerItemDidPlayToEnd...
    ShinrenPan閱讀 2,153評(píng)論 0 3
  • 文/陌宇軒 看夠了 受夠了 為何又死纏不休
    小哲小詩閱讀 214評(píng)論 0 0
  • APP柵格規(guī)范: Android界面的最小間距是8dp(16px)整葡,而規(guī)范的圖像資源尺寸為16dp,24dp讥脐,32...
    Only天然暖寶寶閱讀 555評(píng)論 0 0