Паузы / вычисления между выполнением функции? - PullRequest
1 голос
/ 12 июля 2011

Я работаю над игрой, и скорость игры составляет 60 кадров в секунду, что дает мне около 16 мсек для выполнения того, что мне нужно выполнить. Я обнаружил, что для выполнения определенных путей кода требуется некоторое время. Сначала я подумал, что это должно быть проблемой с выделением / освобождением памяти. Возможно, это так, но я реализовал пул объектов для более тяжеловесных объектов, и это, похоже, мало что дало.

Я вычеркнул обидно большие объекты и заменил их гораздо более простым объектом, но для создания этого объекта все еще требуется около 3 мс. Простой объект состоит из двух пользовательских объектов, 2 массивов и 2 словарей. Большой объект имеет произвольную сложность. Создание более сложных более крупных объектов, по-видимому, занимает линейно больше времени, занимая до 20-30 мс. Во многих случаях в моей игре я могу сделать намного более сложный объект за долю времени. Но почему-то эти конкретные места в коде вызывают серьезное замедление.

Я использую следующий код для профилирования своих функций (изначально из SO):

NSDate* methodStart = [NSDate date];
// My code here.
NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"[CH] executionTime to create  %@ = %f", myObject , executionTime );

Насколько я могу убедиться, что я делаю что-то подобное во внутренней и внешней функции, похоже, что может быть серьезное замедление:

Внутренний вызов функции завершен: 4 мс
... нет кода между внутренним и внешним кодом, кроме таймера ...
Внешний вызов функции завершен: 8 мс

Моя текущая теория заключается в том, что между функциями, которые вызывают серьезные замедления, происходит вычисление между ними. Поскольку я новичок в Obj-C / C, я не совсем уверен, каким может быть это замедление. Это может быть многопоточность, это может быть из-за выделения памяти / autorelease / dealloc или какой-либо другой не связанной с этим проблемой. Я попытался получить больше информации от Инструментов с небольшой пользой.

Итак, мой вопрос: это звучит логично? Возможно ли, чтобы между моими функциями происходило какое-то вычисление, которое занимало бы 2-4 мс процессора на ipad2? И если моя теория невозможна, есть идеи, чем она может быть ?

1 Ответ

0 голосов
/ 13 июля 2011

Лучший способ отследить проблему такого типа - использовать инструменты для профилирования выполнения кода.Часто вы можете запустить это для кода на Mac под симулятором, чтобы увидеть, куда идет время, однако в этом случае вам может потребоваться профилировать его на вашем iPad, чтобы быть уверенным.

Удалите NSDateна основе профилирующего кода, поскольку NSDate может быть довольно тяжелым объектом, особенно когда вы помещаете результаты в пул автоматического выпуска, который вы здесь делаете.вам нужно только создать один объект NSDate и использовать: [methodStart timeIntervalSinceNow] для вычисления разницы во времени без необходимости создавать отдельный объект и выполнять операцию вычитания даты.

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