星際的戰斗達到后面,地圖里面的部隊很多,如果我們把每個兵的圖像動畫和屬性值作為一個對象的話,系統的內存里會消耗極大.我們在玩的時候會發現,因為星際里面的種族只有三個,其實兵種只有幾十個.
雖然每個獨立的士兵剩余的血不同,但是同一兵種的圖像動畫是一樣的,即使不同的玩家,只是不同的顏色,比如每個人族的機槍兵.而且大多數玩家只用到常用的一些兵種,很多時候不會制造所有的兵種.
待解決的問題:把把兵種的圖像動畫共享.
思路:我們把每個兵種的圖像動畫建模作為對象,放入內存共享,一旦有某個畫面用到這個兵種,只要把共享的圖像動畫拿出來,更改顏色就可以了.
享元(Flyweight)模式示例,代碼如下:
- <?php
- //機槍兵享元
- class MarineFlyweight
- {
- //繪制機槍兵的圖像動畫,參數為狀態,比如屬于哪一個玩家
- public function drawMarine($state)
- {
- //繪制機槍兵
- }
- }
- //享元工廠
- class FlyweightFactory
- {
- //享元數組,用于存放多個享元
- private $flyweights;
- //獲取享元的方法
- public function getFlyweight($name)
- {
- if (!isset($flyweights[$name]))
- {
- $flyweights[$name] = new $name."Flyweight";
- }
- return $flyweights[$name];
- }
- }
- //初始化享元工廠
- $flyweightFactory = new FlyweightFactory();
- //當我們需要繪制一個機槍兵的時候,同時傳遞一個狀態數組,里面包含剩余的血等等
- $marine = $flyweightFactory->getFlyweight("Marine");
- $marine->drawMarine($status);
- ?>
用途總結:享元模式可以將需要共享的資源集中起來,統一管理,防止重復消耗.
實現總結:需要一個享元工廠管理共享的資源,比如上面的FlyweightFactory,把所有共享的資源的生產全部交給個享元工廠.
新聞熱點
疑難解答