2010-06-15 3 views
0

Я сделал игру, которая использует множество таймеров по всему коду. Однако таймер должен справляться со многими задачами за такое небольшое количество времени, что приводит к проблеме, когда есть отставание в моей игре. Например, мой таймер работает с интервалом (0,05), и ему нужно рисовать и обновлять многие изображения на экране. Есть ли способ распределить рабочий поток, чтобы программа работала намного плавнее?NSTimer Lag - iPhone SDK

Благодаря

Kevin

ответ

2

Я хотел бы использовать NSThread вместо NSTimer. У меня был большой успех в этой области, используя NSThread, потому что он работает на независимом потоке и не запускается с вашего основного потока ui. В петле для потока спите это на 1/20 (ваш 0,05) секунды. Поскольку поток не работает в потоке пользовательского интерфейса, все его задачи не должны замедлять работу вашего пользовательского интерфейса. Однако beacsue он не работает в пользовательском интерфейсе, вам нужно будет позвонить performSelectorOnMainThread, чтобы получить пользовательский интерфейс для обновления из этого фонового потока. Я поместил блокировку моего метода обновления (простого логического), который говорит, что если последнее обновление ui не произошло, просто пропустите этот. то, если у меня закончится время обработки, я просто бросаю кадр или два здесь и там. Я также делаю много проверок, чтобы увидеть, действительно ли что-то изменилось, прежде чем я перерисовываюсь.

0

Простое решение: Ditch NSTimer.

Переместите код перерисовки на один метод, затем используйте CADisplayLink. Проблема с использованием вашего подхода NSTimer заключается в том, что все перерисовывается слишком быстро или слишком медленно для экрана. Используя CADisplayLink, вы можете синхронизировать свой код перерисовки с частотой обновления экрана. Все, что вам нужно сделать, - это подправить свой код, чтобы он мог справиться с тем, чтобы его не вызывали в определенное время.

И да, убедитесь, что вам не нужно перерисовывать, как сказал Аран Малхолланд выше. Просто убедитесь, что проверки не занимают столько времени, сколько перерисовывают.

И не забудьте оптимизировать код. Много. Используйте ivars для доступа к объектам, но все свойство (self.myObject =) для установки ваших объектов.