本篇為各位簡單介紹Release Pool的管理概念,並以發射子彈為例子,然後實作他。
上一篇文中,介紹的發射子彈方式,使用者每觸發一個shoot(發射)指令,我們便new一個新的子彈物件 ;當子彈使用完畢(目前的狀況是移出可視範圍外),我們就把他拋棄掉不再使用....每個物件只使用了一次,其實造成了很多浪費。
你得知道,我們每次創造新物件實體,上傳新材質,都需要付出昂貴的系統資源,如果用量一大,很容易就產生資源不足的情況,比方遊戲變得不順暢,很多時候就是資源管理沒有作好產生的後果。
想像一下,我們每次new一個子彈,都需要花10塊錢購買,然後不用的時候就隨處亂丟,一直靠CPU來幫你撿垃圾,蒐集起來拿去倒....不但浪費,CPU還得花時間幫你撿垃圾,有時候他沒空,索興就不作了,或者他認為這個不是垃圾而沒有清理...
下面我們介紹Release Pool的概念。
Release Pool(釋放池),顧名思義他是一個池子,你可以把不要用的東西放進去。
當程式確定物件不用時,再一起把池子裡的物件清理乾淨就。這個動作像是垃圾桶的概念,自己蒐集好,然後拿去倒,不用再請忙碌的CPU幫你忙...
光這樣還不夠酷,酷的是其實它不只是一個垃圾桶,而是一個資源回收桶,當你想要創造一個新的子彈實體,可以先來這裡看看有沒有被丟棄的子彈,如果剛好有,就可以撿起來直接用,就不需要再花10塊錢買新的,實際上你可以省下不少的資源。
接下來回到我們的遊戲程式,我們實作一個專門用來管理 Bullet(子彈)的Release Pool。
首先打開子彈物件Bullet.as
29行,之前子彈不用時,我們是直接kill = true請系統清理掉,不過之後我們得通知系統把它丟到Release Pool裡面,所以我們作一個Signal(14行與18行),然後29行把訊號打出去,順便把自己也傳出去。
再來我們開始實作一個Release Pool用來管理Bullet。
新增一個Class,BulletPool.as
13行,宣告一個Vector.<Bullet>來存放目前不用的子彈物件,就是之前說的pool。
20行,初始Class時順便入子彈的素材,這樣之後生成新的子彈物件可以直接取用。
31行,宣告一個getBullet函式,用來取出pool中子彈的實體,如果pool中是空的(比方一開始的時候),它就會直接new一個新的子彈傳出。
47行,當我們new新的子彈時,別忘了onRelease的時候(目前是超過可視範圍),就執行53行的onRelease函式,這個函式其實就是因為這個子彈目前不用了,先把它塞回pool裡面,等到下一次取用。
用這種作法,我們就可以將子彈物件保持在一個最低限度的量。
再來打開我們的場景MainStarlingState.as,在initialize中加上BulletPool的初始化。
然後將原來的shoot函式(發射子彈),原來是直接new一個子彈物件,改成BulletPool中取出一個子彈物件。
好了之後你可以輸出看看,你的戰鬥機依然可以正常的連續發射子彈,但是卻不需要不斷一直不斷的new新的子彈物件。
ps.目前我們的Pool是自己作的,自己實作一次可以讓你可以清楚理解它的運作概念,其實CitrusEngine裡面也有它作的Pool管理物件,這個之後會再說明。
沒有留言:
張貼留言