Я занимаюсь разработкой своей первой игры для iPad на Objective-C и Cocoa-Touch, и у меня возникли проблемы с производительностью в игровом цикле.
Каждый игровой объект отмечен CALayer
, который рисует игровой объект на экране, когда происходят изменения. Я видел этот дизайн в уроке «Какао с любовью» и мне понравилась идея.
В игровом цикле я использую следующий код для обновления игровых объектов:
NSArray *allKeys = [gameObjects allKeys];
NSLog(@"fps: %.5f; %d game objects", 1.0 / frameDuration, [allKeys count]); // profiling
// update game objects
for (NSString *gameObjectKey in allKeys) {
[gameObjects willChangeValueForKey:gameObjectKey];
GameObject *gameObject = [[self gameObjectForKey:gameObjectKey] retain];
if ([gameObject updateWithTimeInterval:frameDuration]) {
[self removeGameObjectForKey:gameObjectKey];
}
if ([gameObject hasChanges]) {
[gameObjects didChangeValueForKey:gameObjectKey];
gameObject.changes = 0; // reset changes
}
[gameObject release];
}
Хотя это прекрасно работает для менее чем 30 игровых объектов, частота кадров падает с 30 кадров в секунду до 15 для более чем 30 игровых объектов.
Когда я опускаю вызов hasChanges
и просто вызываю [gameObjects didChangeValueForKey:gameObjectKey];
каждый раз, я могу поддерживать 30 кадров в секунду. Зачем? Разве дороже запрашивать изменения у игрового объекта, чем сообщать в словарь игровых объектов об изменении значения, которое заставляет слой обновляться? Имеет ли это смысл?
Я также использовал профилирование, чтобы выяснить, что именно вызывает проблемы с производительностью, но я не могу справиться с инструментами инструментов.
Спасибо за вашу помощь!