游戲開發者需要注意的4個內存使用問題
英文原文:Four Memory Problems to Watch Out for in Game Development
作者:Aditya Kulkarni
從銷售角度來看,你的全新手機游戲總是應該適用于今天人們所使用的大多數設備。“大多數設備”可能會讓開發者感到驚訝。在 2015 年 1 月,世界各地的手機用戶數已經達到 36 億人。所以開發者的工作便是讓游戲/應用能夠適應這些設備的種種硬件約束條件。開發者們在開發像游戲等需要耗費內存的軟件時需要進行更多思考。通過編寫這 篇文章,我希望能夠幫助一些不了解技術的人進一步理解一些內存問題,而這也是他們在致力于 2D 游戲項目時需要考慮的內容。
一、內存泄露:
內存泄露指的是未被釋放的分配內存塊。
類比:讓我們想象你在一個擁有 3 個方形儲物柜的房間尋找一個儲物柜。
lockers (from gamecareerguide)
1. John 和 Danny“需要”儲存自己的裝備,而一個儲物柜便足以滿足他們每個人。所以現在我們擁有 2 個已被使用的儲物柜,以及 1 個閑置的儲物柜。
2. 這時候 John 需要儲存他的頭盔,并且不再需要他之前儲存的裝備。所以現在最理想的情況是他應該拿出之前的裝備并將頭盔裝進去。但是他卻向管理者請求另一個儲物柜并希望 將頭盔放在全新儲物柜中。從邏輯上看,在這之后所有的儲物柜便都滿了。而現在的 John 會忘記自己儲存在第一個儲物柜中的裝備。
3. 現在 Danny 需要儲存 2 個頭盔并需要 2 個儲物柜,所以他決定拿掉自己的裝備并空出 1 個儲物柜。然后他向管理者申請了一個新的儲物柜,但是因為所有儲物柜都滿了所以遭到了管理者的拒絕。
在這里,即使 John 從儲物柜中拿掉無用的裝備,Danny 也不能再使用多出來的儲存空間。
二、相同紋理的多個例子:
一個紋理將占用寬度*高度*4(游戲邦注:紅色,綠色,藍色和透明度各占據 1 個字節)的儲存空間。所以一張 512×512 規格的圖像將占據 1.05 兆的內存。而同樣的紋理將占據其 3 倍的儲存空間,也就是 3.15 兆。所以如果我們想要使用這些圖像作為紋理的話我們便需要準備多出 3 倍的內存。
類比:讓我們以一張呈現出你最喜歡的角色“buttman”并且不能無限次使用的方形貼紙為例。
sticker (from gamecareerguide)
你需要將這個新角色呈現給 3 個不同的人。所以你能夠:
1. 獲得 2 張一樣的貼紙,獲得 3 個木質框架能夠在上面貼貼紙,并且你將把這些木制框架遞交給那 3 個人。
2. 讓那 3 個人去獲得屬于自己的木制框架并讓他們將貼紙貼到框架上。
第 2 個例子適合我們,因為我們可以反復使用同樣的貼紙。這也適用于軟件程序中,即所有人可以同時想到 buttman。
三、不必要的迭代:
比起多次調用,在資源中調用 for/while 循環更簡單。你可以在一個循環中處理多個任務。
類比:你是一個間諜,并需要向 3 個遙遠的不同場所運輸包裹。并且你需要從這 3 個不同場所的不同 boss 那收集到重要的秘密信息。
因為你是從不同 boss 那接到這些任務,所以你可以:
1. 根據不同 boss 去分配你的任務。例如你可以駕車前往所有的這 3 個場所并先完成 boss A 所分配的任務,然后再駕車前往同樣的 3 個場所完成 Boss B 所分配的任務。反之亦然。
2. 根據不同場所去分配你的任務。例如你可以先駕車前往第一個場所,遞交包裹并獲得信息,然后再駕車前往下個場所。
如果你所制定的任務計劃是像第 1 種情況那樣的話你便是一個愚蠢的間諜,因為你需要花費更多時間和資源去完成同樣的任務。
四、在內存中保留未使用的對象:
任何時候都只有一定的對象能夠被使用或出現在屏幕上。因為我們擁有優先的內存空間,所以任何被留在內存里的額外對象都是在耗費資源。
類比:你需要將一輛馬車從A點推到B點。讓我們假設如果馬車未負載任何東西或者載著最輕的東西,這便是一個較簡單的任務。但是因為你喜歡啤酒,所以你選擇用馬車去載一桶啤酒,從而加重了自己任務的難度。
所以在這里的最佳解決方法便是放棄你所深愛的啤酒。
這里所列出的問題絕對超過我在一篇文章中能夠寫下的內容。作為一名開發者,你應該盡快識別這些問題并使用有效的解決方法。先克服這些挑戰再發行 產品是真正讓人興奮的游戲開發過程。每個人每一天只擁有 24 個小時。對于我們而言,人們能夠花費這些寶貴的時間去嘗試我們所創造的內容便是推動著我們去開發游戲的最佳動力。