Проблемы с производительностью в игровом цикле - PullRequest
2 голосов
/ 18 апреля 2011

Я занимаюсь разработкой своей первой игры для 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 кадров в секунду. Зачем? Разве дороже запрашивать изменения у игрового объекта, чем сообщать в словарь игровых объектов об изменении значения, которое заставляет слой обновляться? Имеет ли это смысл?

Я также использовал профилирование, чтобы выяснить, что именно вызывает проблемы с производительностью, но я не могу справиться с инструментами инструментов.

Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 18 апреля 2011

Избавьтесь от сохранения / освобождения gameObject, поскольку оно является избыточным.

Кроме того, вы звоните willChangeValueForKey, но не всегда звоните didChangeValueForKey, когда они должны быть сбалансированы, что может вызывать проблему производительности.Что такое gameObjects?Вы уверены, что он не соответствует требованиям KVO?Вы уверены, что это должно быть?Если так, то почему?Работает ли код, если вы удалите все элементы KVO?

Редактировать ... новый код:

// update game objects
for (NSString *gameObjectKey in allKeys) {      
    GameObject *gameObject = [self gameObjectForKey:gameObjectKey];           

    bool objectDead = [gameObject updateWithTimeInterval:frameDuration];

    if ([gameObject hasChanges]) {
        [gameObjects willChangeValueForKey:gameObjectKey];
        [gameObjects didChangeValueForKey:gameObjectKey];
        gameObject.changes = 0; // reset changes
    }

    if (objectDead) {
        [self removeGameObjectForKey:gameObjectKey];
    }
}

Это работает?Избыточное удержание / освобождение перемещенных и сбалансированных уведомлений KVO.Технически плохо иметь смежные willChange и didChange, но в этом случае, вероятно, все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...