從銷售角度來看,你的全新手機(jī)游戲總是應(yīng)該適用于今天人們所使用的大多數(shù)設(shè)備。“大多數(shù)設(shè)備”可能會(huì)讓開發(fā)者感到驚訝。在2015年1月,世界各地的手機(jī)用戶數(shù)已經(jīng)達(dá)到36億人。所以開發(fā)者的工作便是讓游戲/應(yīng)用能夠適應(yīng)這些設(shè)備的種種硬件約束條件。開發(fā)者們?cè)陂_發(fā)像游戲等需要耗費(fèi)內(nèi)存的軟件時(shí)需要進(jìn)行更多思考。通過編寫這篇文章,我希望能夠幫助一些不了解技術(shù)的人進(jìn)一步理解一些內(nèi)存問題,而這也是他們?cè)谥铝τ?D游戲項(xiàng)目時(shí)需要考慮的內(nèi)容。
1)內(nèi)存泄露:內(nèi)存泄露指的是未被釋放的分配內(nèi)存塊。
類比:讓我們想象你在一個(gè)擁有3個(gè)方形儲(chǔ)物柜的房間尋找一個(gè)儲(chǔ)物柜。
lockers(from game career guide)
1.John和Danny“需要”儲(chǔ)存自己的裝備,而一個(gè)儲(chǔ)物柜便足以滿足他們每個(gè)人。所以現(xiàn)在我們擁有2個(gè)已被使用的儲(chǔ)物柜,以及1個(gè)閑置的儲(chǔ)物柜。
2.這時(shí)候John需要儲(chǔ)存他的頭盔,并且不再需要他之前儲(chǔ)存的裝備。所以現(xiàn)在最理想的情況是他應(yīng)該拿出之前的裝備并將頭盔裝進(jìn)去。但是他卻向管理者請(qǐng)求另一個(gè)儲(chǔ)物柜并希望將頭盔放在全新儲(chǔ)物柜中。從邏輯上看,在這之后所有的儲(chǔ)物柜便都滿了。而現(xiàn)在的John會(huì)忘記自己儲(chǔ)存在第一個(gè)儲(chǔ)物柜中的裝備。
3.現(xiàn)在Danny需要儲(chǔ)存2個(gè)頭盔并需要2個(gè)儲(chǔ)物柜,所以他決定拿掉自己的裝備并空出1個(gè)儲(chǔ)物柜。然后他向管理者申請(qǐng)了一個(gè)新的儲(chǔ)物柜,但是因?yàn)樗袃?chǔ)物柜都滿了所以遭到了管理者的拒絕。
在這里,即使John從儲(chǔ)物柜中拿掉無用的裝備,Danny也不能再使用多出來的儲(chǔ)存空間。
2)相同紋理的多個(gè)例子:一個(gè)紋理將占用寬度*高度*4(游戲邦注:紅色,綠色,藍(lán)色和透明度各占據(jù)1個(gè)字節(jié))的儲(chǔ)存空間。所以一張512×512規(guī)格的圖像將占據(jù)1.05兆的內(nèi)存。而同樣的紋理將占據(jù)其3倍的儲(chǔ)存空間,也就是3.15兆。所以如果我們想要使用這些圖像作為紋理的話我們便需要準(zhǔn)備多出3倍的內(nèi)存。
類比:讓我們以一張呈現(xiàn)出你最喜歡的角色“buttman”并且不能無限次使用的方形貼紙為例。
sticker(from game career guide)
你需要將這個(gè)新角色呈現(xiàn)給3個(gè)不同的人。所以你能夠:
1.獲得2張一樣的貼紙,獲得3個(gè)木質(zhì)框架能夠在上面貼貼紙,并且你將把這些木制框架遞交給那3個(gè)人。
2.讓那3個(gè)人去獲得屬于自己的木制框架并讓他們將貼紙貼到框架上。
第2個(gè)例子適合我們,因?yàn)槲覀兛梢苑磸?fù)使用同樣的貼紙。這也適用于軟件程序中,即所有人可以同時(shí)想到buttman。
3)不必要的迭代:比起多次調(diào)用,在資源中調(diào)用for/while循環(huán)更簡單。你可以在一個(gè)循環(huán)中處理多個(gè)任務(wù)。
類比:你是一個(gè)間諜,并需要向3個(gè)遙遠(yuǎn)的不同場所運(yùn)輸包裹。并且你需要從這3個(gè)不同場所的不同boss那收集到重要的秘密信息。
因?yàn)槟闶菑牟煌琤oss那接到這些任務(wù),所以你可以:
1.根據(jù)不同boss去分配你的任務(wù)。例如你可以駕車前往所有的這3個(gè)場所并先完成bossA所分配的任務(wù),然后再駕車前往同樣的3個(gè)場所完成BossB所分配的任務(wù)。反之亦然。
2.根據(jù)不同場所去分配你的任務(wù)。例如你可以先駕車前往第一個(gè)場所,遞交包裹并獲得信息,然后再駕車前往下個(gè)場所。
如果你所制定的任務(wù)計(jì)劃是像第1種情況那樣的話你便是一個(gè)愚蠢的間諜,因?yàn)槟阈枰ㄙM(fèi)更多時(shí)間和資源去完成同樣的任務(wù)。
4)在內(nèi)存中保留未使用的對(duì)象:任何時(shí)候都只有一定的對(duì)象能夠被使用或出現(xiàn)在屏幕上。因?yàn)槲覀儞碛袃?yōu)先的內(nèi)存空間,所以任何被留在內(nèi)存里的額外對(duì)象都是在耗費(fèi)資源。
類比:你需要將一輛馬車從A點(diǎn)推到B點(diǎn)。讓我們假設(shè)如果馬車未負(fù)載任何東西或者載著最輕的東西,這便是一個(gè)較簡單的任務(wù)。但是因?yàn)槟阆矚g啤酒,所以你選擇用馬車去載一桶啤酒,從而加重了自己任務(wù)的難度。
所以在這里的最佳解決方法便是放棄你所深愛的啤酒。
這里所列出的問題絕對(duì)超過我在一篇文章中能夠?qū)懴碌膬?nèi)容。作為一名開發(fā)者,你應(yīng)該盡快識(shí)別這些問題并使用有效的解決方法。先克服這些挑戰(zhàn)再發(fā)行產(chǎn)品是真正讓人興奮的游戲開發(fā)過程。每個(gè)人每一天只擁有24個(gè)小時(shí)。對(duì)于我們而言,人們能夠花費(fèi)這些寶貴的時(shí)間去嘗試我們所創(chuàng)造的內(nèi)容便是推動(dòng)著我們?nèi)ラ_發(fā)游戲的最佳動(dòng)力。