1. 程式人生 > >SLG遊戲效能優化個人總結

SLG遊戲效能優化個人總結

    最近一直在做SLG遊戲的效能優化,趁著手還熱乎,把自己一些心得總結一下。

    目前SLG是基於Flash製作的,語言當然是AS3.0,目前Flash雖然要死要死的了,可是他背後的AS3.0是非常強大的,目前很多H5引擎開發的API都是吸收了很多AS語法規則。

    首先貼出一個性能優化的標準


    另外玩家對於遊戲效能的一個直觀感受有以下幾方面:

        1.Loading時間

        2.進入遊戲後拖屏的流暢度

        3.記憶體的佔用

    下面從這三個方面分析下優化的點以及方案

    一、Loading時間

        我們可以將Loading時間拆分為三部分:(1)美術資源(2)配置資源(3)資料及物件初始化

        一般資源我們都採用即用即載入的方案,配置資源一開始只加載初始場景需要的,這時候就會根據角色等級或者某個判定標準來載入資源,美術資源、資料及物件初始化同理也需要根據這個條件來判斷,進入遊戲後再按照需要載入資源,這時我們就需要一個資源管理器,對於已經載入的資源進行管理,可以使用引用計數來判定一個資源是否在被使用,如果沒有被使用即時釋放掉。

二、拖屏的流暢度

    (1)事件

            SLG類遊戲,通常會有一個大地圖,玩家通過拖動螢幕移動視角,在AS中一般使用事件通知客戶端攝像機視角改變,這其中涉及了大量的資料更新,以及伺服器與客戶端的資料交換。AS中的原生事件對於效能的消耗是很大的,這時候我們需要變更思路,其實在很多外掛中對於原生事件都做了封裝,比如JQuery,LayaBox都對於事件進行了封裝,我也使用了一個包來替代AS中的原生事件

Signal,Signal類似於C#中的事件委託機制,如果我使用AS中的原生事件,我要對每個物件新增事件監聽,80000個物件就是80000個事件監聽,一旦事件派發,就是80000個冒泡,但是使用Signal在管理器監聽,只需要一個監聽就可以達到同等效果,可想對於效能是多麼大的節省。

    (2)與伺服器通訊時機

           我們在玩SLG或同類遊戲的時候,拖屏的時候不會立刻更新所有資訊,往往是停下來的時候會全部更新,這裡面其實就是對於拖屏的時候控制了向伺服器的發包頻率,如果一旦收到事件,就向伺服器請求,不光伺服器吃不消,客戶端收到伺服器訊息的時候也會形成阻塞,不能做到更新,在一幀類的更新過於頻繁,會導致幀率急劇下降,因此大多數的選擇是使用延遲幀呼叫更新,將邏輯處理與介面渲染分幀處理,這樣會使遊戲流暢度提高也降低了伺服器壓力。

  三、記憶體佔用

    記憶體洩漏真是最讓人頭疼的問題,特別是在專案一開始沒有做好記憶體管理的時候,後期優化真的是蛋疼的要命,一般遊戲記憶體佔用分為兩塊:(1)資源(2)物件

    前面已經說過資源的管理需要一個專門的管理器來管理載入了的資源,以便及時對於未使用的資源及時釋放。

    物件的管理同樣如此,遊戲中物件一般又分為兩類:(1)UI物件(2)遊戲物件

    (1)UI物件

        UI物件的管理一般是使用一個MVC框架來進行管理,所有UI都是基於這個框架寫出來的,如果大家有興趣瞭解我平時喜歡用的UI框架可以在我Github下去複製下來看看:https://github.com/dengxuhui/AircaftBattle

    這裡面的UI框架就是我任何一個專案都用的UI框架,這個小專案有興趣可以擴充套件,我現在已經沒有更新這個專案了。

    UI框架就不多說了,資源一般都是從資源管理器獲取的,物件使用後直接釋放。

    (2)遊戲物件

        遊戲物件我們可以籠統的說除了UI都是遊戲物件,遊戲對像我們一般就採用一個工廠來建立以及管理,每個遊戲都會存在一個資源池,因為很多物件的高頻建立銷燬,資源池是一個很好的解決方案,不過一旦資源池沒有管理好就適得其反,對於資源池的一般使用引用計數來實現,快取方式有很多,根據不同情況也有不同適用方法,之前我看過一篇文章寫得挺好的,之後找到貼上來,我這裡就別瞎bibi,我只說說大概原理,我們通過一個遊戲工廠作為遊戲物體的建立以及釋放的唯一介面,建立時先從資源池尋找複合物件,如果沒有建立新物件,如果有直接使用,避免呼叫物件建構函式,當我們不用這個物件的時候,呼叫工廠的物件釋放函式,工廠將這個物件放到資源池中,以備後續使用。這裡只講了大概流程,其中涉及細節並未講到。