Ручное управление частотой смены игровой стратегии Cocos2d-iPhone - PullRequest
0 голосов
/ 15 апреля 2011

Большинство разработчиков игр должны были столкнуться с проблемой «низкой частоты кадров» хотя бы один раз при разработке игр. Но я, с другой стороны, делаю головоломку, похожую на судоку, где низкая частота кадров не является проблемой, поскольку в ней нет постоянно движущихся спрайтов / элементов, и на самом деле я планирую уменьшить частоту кадров, чтобы игра занимала меньше времени. Время процессора и, следовательно, снизить энергопотребление iDevices; все это просто вежливость к игрокам:)

Я уже знаю, что могу управлять частотой кадров в Cocos2d-iphone, изменив animationInterval:

[[CCDirector sharedDirector] setAnimationInterval:1.0/60];

Но у меня проблемы со стратегией, когда снижать частоту кадров, а когда возвращаться к нормальной частоте кадров (60 Гц). На данный момент мне удалось определить только стратегию для сенсорного события, а именно:

Начните с более низкой частоты кадров. На ccTouchBegan вернитесь к нормальной частоте кадров. На ccTouchEnded переключитесь на более низкую частоту кадров. Убедитесь, что мультитач обрабатывается соответствующим образом.

У меня осталось еще два условия:

  1. Обработка CCActions на CCNodes: до тех пор, пока некоторые CCNodes имеют выполняемые действия, возвращайтесь к нормальной частоте кадров.

  2. Система частиц: пока существуют системы частиц, испускающие частицы, возвращайтесь к нормальной частоте кадров.

По сути, мне нужно уметь обнаруживать, есть ли какие-либо действия, которые все еще выполняются на каких-либо спрайтах / слоях / сцене, даже если некоторые системы частиц все еще излучают частицы. Я предпочитаю, чтобы проверка отдельных объектов не выполнялась, и я предпочел бы просто [SomeClass isActionRunning]. Я полагаю, что я мог бы сделать это, проверив список «запланированных» объектов, но я не уверен, как. Буду признателен, если бы вы также предложили некоторые другие условия, когда мне нужно вернуться к нормальной частоте кадров.

Ответы [ 3 ]

1 голос
/ 16 апреля 2011

Хм .. Я бы порекомендовал установить его на 30 кадров в секунду. Да. Скорость обновления экрана. Но самое главное, как вы кодируете игру. Это должно быть эффективно. Вместо того, чтобы запускать дополнительныепроцессы, проверяющие, работает ли что-то или нет .. Это может съесть немного больше вычислительной мощности ..

1 голос
/ 15 апреля 2011

хотя я знаю, что это не очень чистый способ, но вы можете взломать класс CCScheduler и проверить, есть ли какой-либо объект в запланированных методах.и я думаю, вы должны проверить, являются ли объекты вашими, поскольку cocos2d сам планирует некоторые классы.

0 голосов
/ 29 марта 2013

Это может быть то, что вы ищете, по крайней мере, относительно действий.

Когда вы запускаете действие, вы можете вызвать блок в конце вашего действия, в котором вы сбрасываете частоту кадров.

[[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]];
...