Проблемы рисования какао - PullRequest
0 голосов
/ 07 февраля 2012

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

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

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

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

Любые советы будут с благодарностью.

Спасибо.

1 Ответ

0 голосов
/ 07 февраля 2012

Я понял это:)

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

...