Leopard 10.5.8, XCode 3.1.1; используя runModalForWindow для реализации (как предполагается,) высокопроизводительного механизма отслеживания мыши, в котором я должен выполнять сложные изменения растрового изображения в реальном времени.
Модальный цикл запускается, таймер срабатывает, мышь отслеживает ... но производительность ужасна, и чем дольше продолжается цикл запуска, тем хуже и хуже. Вместо того, чтобы ловить сообщения мыши каждый пиксель или около того, я получаю их каждые 5 ... 10 ... 20 секунд.
Приборы показывают, что большую часть времени в течение этого растущего узкого места ответа тратится на mach_msg_trap (и да, у меня установлена перспектива для запущенного приложения), поэтому у меня сложилось впечатление, что оно «думает», что не Мне нечего делать, несмотря на то, что я тащу мышь с нажатой кнопкой, как сумасшедший. Нет никаких утечек памяти, и на моем 8-ядерном компьютере с частотой 2,8 ГГц процессор практически не работает.
Опять же, приложение не тратит много времени на мой код ... так что это не проблема моей производительности. Возможно, я что-то неправильно настроил, или вообще не настроил, или просто неправильно подхожу к идее - но я уверен, что был бы признателен за понимание. В настоящее время отправка сообщений мыши и сообщений таймера абсолютно недопустима. Вы не могли бы реализовать программу рисования карандашом для кого-то, погруженного в холодную патоку с временем отклика, которое я получаю.
РЕДАКТИРОВАТЬ: Дополнительная информация: не происходит на моем MacBook Pro 10.5.8. Просто 8 - ядерный Mac Pro с 6 дисплеями. Я попытался взять код отображения обрезки в drawrect вне, заменил его NSLog () ... все еще тянется при выпуске обновлений мыши. Также попытался перезагрузить и запустить без обычного дополнения приложений, работающих. И с зеркальными дисплеями. Без разницы.
Представьте, что вы перетаскиваете кисть по экрану; сначала рисует плавно, затем появляются промежутки между размещениями кисти, затем они становятся больше, и это продолжается до тех пор, пока вы не получите только одно размещение кисти каждые 10 секунд. Вот как это действует. Используя NSlog () и различные другие методы отслеживания, я определил, что он, по крайней мере, на самом высоком уровне, потому что события mouseDragged замедляются до минимума. Вкратце, вопрос в том, почему это произошло?
Любой