大多数游戏开发者在开发游戏时至少应该遇到一次“低帧率”问题。但另一方面,我正在制作类似数独游戏的益智游戏,其中低帧速率不是问题,因为它没有不断移动的精灵/元素,事实上我计划降低帧速率以使游戏花费更少CPU时间因此降低了iDevices的功耗;这一切只是为了对球员的礼貌:)
我已经知道我可以通过修改animationInterval来控制Cocos2d-iphone中的帧速率:
[[CCDirector sharedDirector] setAnimationInterval:1.0/60];
但我在何时降低帧速率以及何时恢复到正常帧速率(60Hz)的策略上遇到了麻烦。此时我只设法定义了触摸事件的策略,即:
以较低的帧速率开始。在ccTouchBegan上,恢复为正常帧率。在ccTouchEnded上,切换到较低的帧速率。确保相应地处理多点触控。
我还有两个条件:
在CCNode上处理CCActions:只要某些CCNode有正在运行的操作,就恢复到正常的帧速率。
粒子系统:只要存在一些发射粒子的粒子系统,就恢复到正常的帧率。
基本上我需要能够检测是否有动作仍在任何精灵/图层/场景上运行,如果某些粒子系统仍在发射粒子。我更喜欢不对单个对象进行检查,我宁愿有一个简单的[SomeClass isActionRunning]
。我想我可以通过检查“预定”对象列表来做到这一点,但我不知道如何。如果你还可以提出一些我需要恢复到正常帧率的其他条件,我将不胜感激。
答案 0 :(得分:1)
虽然我知道这不是一个非常干净的方法,但你可以破解CCScheduler类并检查scheduledMethods中是否有任何对象。我想你必须检查那里的对象是否属于你的,因为cocos2d本身会安排一些类。
答案 1 :(得分:1)
嗯..我建议你把它设置为30fps ..是..它的屏幕刷新率..但最重要的是你如何编码游戏..它必须是高效的..而不是额外运行进程检查某些东西是否正在运行..它可能会消耗更多的处理能力..
答案 2 :(得分:0)
这可能是您正在寻找的,至少在行动方面。
当您执行某个操作时,您可以在操作结束时调用一个块,您可以在其中重置帧速率。
[[CCDirector sharedDirector] setAnimationInterval:1.0/60];//set your fast frame rate
[self runAction:[CCSequence actions:
[CCMoveBy actionWithDuration:0.5f position:ccp(100,100)], //Do whatever action it is you want to do
[CCCallBlock actionWithBlock:^
{
[[CCDirector sharedDirector] setAnimationInterval:1.0/30]; //Revert to slow frame rate... could also check within the block for other actions
}],
nil]];