Что может вызвать вялый / резкий ответ на изменение размера окна EMPTY в приложении OSX / Cocoa? - PullRequest
2 голосов
/ 13 апреля 2011

НОВАЯ ИНФОРМАЦИЯ: Что-то, что я только что заметил (потому что это не то, что я обычно делал бы), но это многооконный приложение с палитрой инструментов и окном изображения ... проблема заключается в окне изображения - окно инструментов не имеет проблем с изменением размера, оно очень быстрое и плавное. Так что это просто другие окна в приложении; окно редактирования изображения, окно библиотеки изображений.

Что-то в моей структуре приложения может быть неправильным, но я не знаю что. Симптом заключается в том, что изменение размера моего окна не проходит гладко - вместо этого оно на мгновение зависает, а затем «дергается» на следующую позицию. Instruments говорит, что время тратится в mach_msg_trap. Окно ничего не делает - я закомментировал все, пытаясь сузить то, что может быть причиной этого, и теперь у меня даже не происходит рисования (хотя окно, конечно, отображает строку заголовка и границы и т. д.) Так что это пустое окно с нулевой работой просто медленно, как грязь.

Я гуглил как сумасшедший, я прочитал тонны документов по runloops, окнам и представлениям, и я не могу найти даже намека на то, что может вызвать это.

Я вижу эту проблему под 10.5.8, xcode 3.1.3, gcc 4.0 на 8-ядерном компьютере с 8 ГБ оперативной памяти, много свободного места и много свободного дискового пространства. Я вижу такое же поведение на двухъядерном MacBook Pro / 2 ГБ и на двухъядерном MacBook / 2 ГБ, все работают 10.5.8.

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

После того, как весь мой код дисплея закомментирован (буквально ... сверху вниз, без рисования, без кода представления, поэтому приложение буквально не выполняет ничего ), отрывистость такая же, но загрузка ЦП почти ноль. Как будто это не вызывает окна достаточно часто. Но я не могу найти причину, по которой это не удалось бы сделать.

... и под "рывком" я подразумеваю, что когда я перетаскиваю маленький виджет изменения размера в правом нижнем углу окна на умеренной или даже медленной скорости, рамка остается на месте, а затем "щелкает" огромным расстояние до точки, куда попала мышь, затем повторяется.

Добавьте код обратно, и он действует так же. Так что это не код рисования. Мой инстинкт говорит, что это структурная проблема - что-то не так в IB, или в том, как я настроил представления, и т. Д. Но я не могу найти ничего, что я должен сделать как вопрос «это нужно сделать, чтобы сделать ответ изменения размера / перерисовки или мгновенного ответа runloop "в любом из документов или подсказок в Интернете.

В окне есть пользовательский вид, перетаскиваемый из палитры IB таких вещей. Он настроен на изменение размера автоматически с размером окна. И это так. Но он отлично следует за окном, то есть рывками. Drawrect или без Drawrect.

У каких-нибудь настоящих экспертов по какао есть идеи?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Ваше приложение может быть заблокировано при взаимодействии с WindowServer (я вижу, что это происходит, когда я запускаю Minecraft или Starcraft 2, например). Возьмите сэмплы в режиме «Все состояния потока» в Shark или Instruments и найдите CGSSynchronizeBackingStore, если моя нечеткая память получает правильное имя. Как-то так.

В режиме «Все состояния потока» указывается время блокировки, а также время выполнения.

0 голосов
/ 05 мая 2011

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

1) Машина достаточно быстра, чтобы быстро рисовать прокси размером с экран,

2) Обновление окна инструмента в конце изменения размера успешно из-за этого, и

3) изменение размера (и рисование) происходит плавно, потому что я закорачивал рисованную линию инструментальной вдовы при изменении размера окна изображения.

Я собираюсь двигаться дальшеи назовите это, решая эту серию обходных путей, хотя я все еще думаю, что где-то явно есть проблема с ОС или структурой.

...