您的位置:首页 > 移动开发 > Cocos引擎

[cocos2d-x]如何减少cocos2d-x游戏的耗电量?

2014-05-06 21:31 204 查看
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主界面半个小时,手机都是冰凉冰凉的:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: