Cocos2d-x游戏的耗电量一直是个让人头疼的问题,一个简单的三消游戏,玩一会手机就热得发烫,更郁闷的是电池消耗非常快。基本上两个小时就能够把电池耗光。
近期又看到一个帖子。有个老外用cocos2d-x在安卓上移植了2048这个小游戏,一切顺利。除了手机会发烫。
看来这确实是一个让人非常不爽的问题。
我曾经做过windows桌面系统,知道在windows上。屏幕不会每帧都全屏重绘,而是提供一个WM_PAINT消息,windows GPU驱动程序通过这个消息,能够获得须要重绘的区域。这样就能够降低GPU的负荷。但我查了一下opengl的文档。貌似不支持区域重绘,(这但是MS Windows的核心技术哦)。cocos2d-x底层是用opengl实现的,也无法通过区域重绘来优化了。
还有没有其它办法? 我研究了一下引擎代码。发现引擎的主绘制流程非常easy,就是以固定的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主界面半个小时,手机都是冰凉冰凉的:)