2012-02-07 2 views
0

Я работаю над приложением, которое рисует на экране на основе информации, полученной по сети. Моя проблема в том, что иногда эти события происходят со скоростью выше, чем я могу рисовать, и я испытываю задержку. Теперь проблема заключается не в задержке с типом задержки, которая накапливается. Если бы я рисовал на основе таких событий, как щелчок мышью, и перетаскивание этого не происходит, и я предполагаю, что это связано с тем, как события доставляются. Как я мог узнать, когда представление «готово» сделать снова, потому что тогда я мог отказаться от некоторых событий, полученных по сети, и нарисовать только самые последние.Проблемы с рисованием какао

Прямо сейчас у меня есть прозрачное окно, находящееся «сверху» иерархии окон. Im рисунок на NSImage, который является размером экрана после каждой операции рисования. Я делаю setneedsdisplayinrect вызов представления, в котором происходит рисунок. Когда я получаю вызов, я рисую часть изображения, которое входит в грязный прямоугольник. Моя попытка решить это немного взломать, так как я не знаю другого способа сделать это. Я устанавливаю значение Boolean в true после каждого setneedsdisplayinrect, и я устанавливаю его false в drawrect. Если я получу последующее событие для рисования на изображении, я просто проигнорирую его значение Boolean, равное true.

Какие еще альтернативы делать это у меня есть?

Я думал об использовании cashapelayers и изменении пути, но я не уверен, насколько эффективны слои формы, когда путь становится большим. Я также подумал о том, чтобы использовать несколько слоев формы для разных частей пути, которые разделены (не непрерывны), но если я хочу очистить чертеж, и я удаляю слои, если их много, я заметил немного ботов производительности. Единственный другой способ, которым я мог подумать, - это рисовать с открытым gl, но, учитывая природу представления OpenGL (размер экрана и прозрачность), я не уверен, насколько это будет проблемой производительности.

Любые советы были бы весьма признательны.

Спасибо.

ответ

0

я понял это :)

От объекта, управляемого сетевое соединение я посылал событие, используя основную очередь отправки. Который из того, что я понимаю - я мог бы ошибаться в этом, - может охватывать несколько итераций runloop. То, что мне было нужно, - это отправлять события во время каждой итерации цикла запуска и создавая собственный источник цикла запуска, который будет сигнализировать основную runloop каждый раз, когда я получаю новое событие по сетевому соединению, это значительно улучшило мою производительность.

Смежные вопросы