一、前言
這篇文章將會講述物件池的基本概述,並介紹應用方向。
二、物件池
在軟體開發中,物件池是一種常見的設計模式,用於讓物件使用效率最大化的有效管理與重複使用物件。物件池的主要功能在於提升效能與降低資源消耗。
1. 物件使用方式
物件池的主要目的是避免頻繁的物件創建和銷毀,這也是新鮮人在程式設計時很常使用的方式,或者用於功能測試時快速撰寫時的做法,如果希望讓資源不會消耗太大,就會改為使用物件池。
在物件池中,物件會被事先創建並存儲起來,當需要使用物件時,可以直接從物件池中取得一個可用的物件,而不是每次都創建一個新的物件。當物件不再需要使用時,可以將其放回物件池中,以供後續使用。
當我們要從物件池取用一個新的物件時,僅僅轉移物件的座標即可,並不需要重複的生成物件與銷毀。因為是簡單的座標轉移與狀態改變,所以在資源的使用效率上更為高效。
2. 廢物資料
在我之前撰寫的一篇文章中,聽說物件生成與銷毀的過程中,會產生多餘的垃圾資料,初時影響不大,但當生成成千上萬的物件時,就會對遊戲的系統造成可見的影響。
3. 設計難度
這篇文章不介紹詳細的撰寫方式,第一個方面是因為精力關係,這兩天忙其他的事情沒精力研究;第二個方面飾物件池並不好分享,重複利用並不困難,重點是要判斷是否有現有物件,否則要生成新的物件,也就是陣列。
三、應用方向
物件池在軟體開發中有廣泛的應用,基本上只要經常重複使用的遊戲元素都可以考慮使用物件池來設計。
1. 介面(UI)
在遊戲開發中,介面通常是頻繁使用且數量眾多的物件,而我在使用的時候總是覺得介面很吃效能,因為座標改變相對比較困難,而且聽說大量地使用介面物件容易導致電腦當機。
使用物件池能有效管理遊戲中的按鈕、文字、圖片等,這些都可以使用物件池來重複利用,提高介面的反應速度和效能,例如在 Facebook 社團中看到浮動視窗這種會移動的介面,就必須要使用物件池。
2. 子彈
子彈!有什麼比子彈更容易成千上萬的出現?玩家在發射子彈、敵人在發射子彈、陷阱也可能發射子彈!在射擊遊戲或彈幕遊戲中,子彈是頻繁出現的物件,大量的子彈創建與銷毀更需要精簡的使用物件。
使用物件池可以避免每次創建子彈物件,改為重複使用已經存在並且不再使用的子彈物件。這樣可以節省資源並提高遊戲性能,使子彈的生成和銷毀更加高效,也更不容易影響遊戲性。
3. 特效
遊戲中的特效效果(如爆炸、粒子效果等)通常需要頻繁的創建和播放,這幾乎已經成為一種常識,使用物件池可以管理特效物件的重複利用,減少對系統資源的需求,提高特效的效果和性能。
拿子彈來舉例就很容易懂了,發射、飛行、命中,這三個過程中通通會使用到特效,如果產生子彈要生成;子彈產生特效又要生成;音效產生又要生成,這個過程會使用三次的生成物件。
4. 音效
音效在遊戲中扮演著重要的角色,我曾經以為一份音效就夠用了,不過在實作的時候發現有時候還是會在沒播放完的時候播放下一個。
因此需要使用物件池重複利用已經存在的音效物件,尤其是音效物件是一個很容易重複使用的遊戲物件,只需要簡單的一行程式碼就能讓它重複運作,不需要生成一個新的物件。
四、後記
這篇文章主要是讓我簡單撰寫好,然後我得趕快休息了,不知道為什麼暑假我沒有在度假的感覺,倒是認真開發專案讓我很投入就是了...