做網(wǎng)站圖片自動(dòng)切換seo推廣什么意思
在FPS游戲中,射擊會(huì)生成子彈,在命中敵人后子彈會(huì)被銷毀,那么會(huì)導(dǎo)致子彈對(duì)象頻繁地創(chuàng)建和銷毀,會(huì)造成運(yùn)行效率降低且會(huì)產(chǎn)生內(nèi)存碎片問(wèn)題,而對(duì)象池模式可以很好地解決這個(gè)問(wèn)題。
文章目錄
- 問(wèn)題提出
- 概述
- 問(wèn)題解決
- 總結(jié)
問(wèn)題提出
正如引言所說(shuō),FPS游戲中射擊會(huì)頻繁地創(chuàng)建和銷毀子彈,導(dǎo)致效率降低且產(chǎn)生大量的內(nèi)存碎片。
同時(shí),按照設(shè)計(jì)模式的原則,我們需要遵守開(kāi)放封閉原則,我們希望對(duì)象池除了應(yīng)用在子彈創(chuàng)建和銷毀中,還可以應(yīng)用在其他場(chǎng)景下,即復(fù)用我們的對(duì)象池抽象類與對(duì)象池中對(duì)象的抽象類,且對(duì)于新增場(chǎng)景,只需要增加相應(yīng)的對(duì)象池實(shí)現(xiàn)類與對(duì)象池中對(duì)象的實(shí)現(xiàn)類,而不需要修改抽象類中的代碼。
概述
根據(jù)上文我們提到的需要,對(duì)象池模式的UML類圖設(shè)計(jì)如下。
Abstract Object Pool
抽象的對(duì)象池類,其保存了對(duì)象池的大小,以及所有的抽象的目標(biāo)對(duì)象。用戶可以通過(guò)GetObject
從對(duì)象池中獲取一個(gè)可用的對(duì)象。Concrete Object Pool
具體的對(duì)象池類,根據(jù)要保存的對(duì)象類型,創(chuàng)建特定的對(duì)象數(shù)組,并進(jìn)行相應(yīng)的初始化。Abstract Pool Actor
抽象的目標(biāo)類,inUse
標(biāo)記其是否被使用,我們從對(duì)象池中取出一個(gè)目標(biāo)使用,需要通過(guò)SetInUse(true)
來(lái)進(jìn)行相應(yīng)的設(shè)置,比如對(duì)于子彈我們要讓其可見(jiàn)、開(kāi)啟碰撞、設(shè)置初速度等,當(dāng)目標(biāo)被還給對(duì)象池(可能是主動(dòng)還,可能是超時(shí)還),需要通過(guò)SetInUse(false)
來(lái)還原為初始設(shè)置,比如讓子彈不可見(jiàn)、關(guān)閉碰撞、設(shè)置0速度等。Concrete Pool Actor
具體的目標(biāo)類,需要重寫SetInUse
、構(gòu)造函數(shù)和析構(gòu)函數(shù),因?yàn)椴煌哪繕?biāo)類,他需要初始化的東西不同,析構(gòu)釋放的資源也可能不同。
問(wèn)題解決
下面我們應(yīng)用對(duì)象池解決上面子彈的問(wèn)題
(1) 創(chuàng)建一個(gè) BP_PooledActor
的目標(biāo)抽象類其有屬性 inUse
,TimeToLive
、TimeToLiveTimer
后兩個(gè)屬性用于超時(shí)返還到對(duì)象池中。
自定義事件 CS_SetInUse
如果傳入真,關(guān)閉碰撞、關(guān)閉Tick、隱藏于游戲,設(shè)置一個(gè)定時(shí)器來(lái)超時(shí)返還。
(2)創(chuàng)建一個(gè) AC_ObjectPool
組件,其有屬性 PoolSize
、TimeToLive
、ObjectPool
、PooledActorClass
,ObjectPool
是一個(gè)數(shù)組保存目標(biāo),PooledActorClass
保存目標(biāo)類的類型。
自定義事件 CS_InitializePool
用來(lái)初始化對(duì)象池,根據(jù) PoolSize
創(chuàng)建目標(biāo)對(duì)象加入對(duì)象池
定義函數(shù) F_FindFirstAvailable
用于找到可用的目標(biāo)對(duì)象
定義函數(shù) F_SpawnFromPool
用于用戶從對(duì)象池中獲取目標(biāo)對(duì)象
(3)創(chuàng)建 FirstPersonProjectile
子彈類,其父類為 BP_PooledActor
重寫 CS_SetInUse
,加入設(shè)置投射組件速度和激活/關(guān)閉粒子系統(tǒng)
在 Hit 事件中,CS_SetInUse(false)
返還給對(duì)象池。
(4)在角色類中,加入 AC_ObjectPool
組件,那么就可以在開(kāi)火的時(shí)候使用子彈對(duì)象池中的子彈了
總結(jié)
優(yōu)點(diǎn):
- 減少頻繁創(chuàng)建和銷毀對(duì)象的開(kāi)銷,提高系統(tǒng)性能。
- 控制資源的最大使用量。
缺點(diǎn):
- 需要正確管理對(duì)象的狀態(tài)重置,避免狀態(tài)泄露。
- 增加了復(fù)雜性,需要謹(jǐn)慎管理對(duì)象生命周期。
- 需要我們?cè)u(píng)估一個(gè)合理的資源的最大使用量,過(guò)大會(huì)導(dǎo)致額外的內(nèi)存開(kāi)銷,過(guò)小可能會(huì)導(dǎo)致錯(cuò)誤(需要更復(fù)雜的處理手段)
適用場(chǎng)景:
對(duì)象池適用于我們需要頻繁創(chuàng)建和銷毀一個(gè)對(duì)象,且創(chuàng)建銷毀開(kāi)銷較大的場(chǎng)景,以幫助我們減少創(chuàng)建銷毀的次數(shù),提升性能,同時(shí)減少內(nèi)存碎片。
上面提到的對(duì)象池用法比較初級(jí),更深入地對(duì)象池使用還有根據(jù)對(duì)象池使用情況,動(dòng)態(tài)地增減對(duì)象池中的對(duì)象。