[cocos2d-x]如何減少cocos2d-x遊戲的耗電量?

    Cocos2d-x遊戲的耗電量一直是個讓人頭疼的問題,一個簡單的三消遊戲,玩一會手機就熱得發燙,更鬱悶的是電池消耗很快,基本上兩個小時就可以把電池耗光。最近又看到一個帖子,有個老外用cocos2d-x在安卓上移植了2048這個小遊戲,一切順利,除了手機會發燙。看來這確實是一個讓人很不爽的問題。

    我以前做過windows桌面系統,知道在windows上,屏幕不會每幀都全屏重繪,而是提供一個WM_PAINT消息,windows GPU驅動程序通過這個消息,可以獲得需要重繪的區域,這樣就可以減少GPU的負荷。但我查了一下opengl的文檔,貌似不支持區域重繪,(這可是MS Windows的核心技術哦)。cocos2d-x底層是用opengl實現的,也無法通過區域重繪來優化了。

    還有沒有其他辦法? 我研究了一下引擎代碼,發現引擎的主繪製流程很簡單,就是以固定的60fps重繪屏幕,即使是靜止的屏幕,也是不變的60fps。其實這裏是可以優化的,完全靜止的畫面,就不要刷新了!我修改了一下代碼,做了一些測試,的確可以實現:在director類中增加一個dirty重繪標誌,每幀繪製前都檢測一下,沒有置上就跳過這幀。

    那麼,什麼時候需要設置重繪標誌呢? 就是屏幕上的圖像發生變化的時候(好像是廢話...)。cocos2d-x通過兩個方法來產生動畫,一個是action(比如Move),一個是event(比如Touch);標準的action都是通過ActionManager來管理的,所以只要在ActionManager的update()函數中設置重繪即可,event是通過eventDispatcher統一管理的,也可以在這個類統一設置。代碼就不貼了,可以看這個PR:https://github.com/cocos2d/cocos2d-x/pull/6178

但是,如果你不通過action和event來更新圖像,比如說直接設置節點的位置,或者自定義schedule回調函數,就需要自己設置重繪標誌。

Ricardo大神也贊成這個功能,而且建議在node visit函數中實現,這樣重繪標誌就對引擎用戶完全透明瞭,不過這個feature要到3.1的時候纔會正式發佈,有興趣的童鞋可以自己合併這個PR先嚐試一下。

我自己測試的情況,優化之後,跑testcpp主界面半個小時,手機都是冰涼冰涼的:)



發佈了72 篇原創文章 · 獲贊 7 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章