如何降低cocos2d-x游戏的功耗

Cocos2d-x游戏的功耗一直是个让人头疼的问题。一个简单的三消游戏,玩一会手机就很火了。更郁闷的是电池消耗很快,两个小时就能用完。最近又看到一个帖子说一个老外用cocos2d-x移植了安卓上的小游戏2048,一切顺利,除了手机会热。看来这真的是一个很让人不爽的问题。

我以前做过windows桌面系统。我知道在windows上,不会每帧全屏重绘屏幕,但是会提供一个WM_PAINT消息。通过这个消息,windows GPU驱动可以得到需要重画的区域,可以减轻GPU的负荷。但是我查了opengl文档,好像不支持区域重绘(这是MS Windows的核心技术)。cocos2d-x的底层是用opengl实现的,不能用区域重绘来优化。

还有别的办法吗?我研究了引擎代码,发现引擎的主绘制过程很简单,就是以固定的60fps重绘屏幕,即使静止,也还是60fps。其实这里是可以优化的,不要刷新完全静止的画面!我修改了代码,做了一些测试,确实可以实现:在director类中添加脏重绘标志,在绘制前检查每一帧,跳过这一帧不放上。

那么,什么时候需要设置重画标志呢?当屏幕上的图像改变时(像废话...).Cocos2d-x通过两种方法生成动画,一种是动作(比如移动),一种是事件(比如触摸)。标准动作由动作管理器管理,所以只需要在动作管理器的update()函数中设置重画即可。事件由eventDispatcher管理,也可以在该类中设置。代码我就不贴了。可以看看这个PR:/cocos2d/cocos2d-x/pull/6178。

但是如果不通过动作和事件来更新图像,比如直接设置节点的位置或者自定义调度回调函数,就需要自己设置redraw标志。

里卡多也很赞成这个功能,建议在节点访问功能中实现,这样重绘的logo对引擎用户就完全透明了,不过这个功能要到3.1才正式发布。感兴趣的童鞋可以自己合并这个PR,先试试。

我亲自测试了情况。优化后运行testcpp主界面半小时,手机都凉了:)