2010-08-08 3 views
2

Я рисую простой чертеж линии (строка с некоторым текстом посередине) в подклассе CALayer с помощью drawInContext(). Я обновляю этот слой, когда пользователь выполняет жест, вызывая на нем setNeedsDisplay. Эффект, который я вижу, - это то, что я мог ожидать, если бы не было двойной буферизации ... i.e вижу части нового рендеринга, перекрывающие части старого рендеринга. Когда я перестаю обновлять (завершать жест), система «догоняет», и я всегда вижу правильный конечный результат, но во время обновлений я вижу непоследовательные результаты ... Этот эффект не является тонким, а иногда и экстремальным ... например. если я продолжу обновление достаточно быстро, я смогу сохранить устаревшие части рисунка на экране для секунд, в то время как новые детали идут вперед ...Почему не кварцевая двойная буферизация моей drawInContext()?

Этого я совсем не понимаю. Если Quartz выполняет буферизацию, то кажется, что он не блиет результат на экране целиком или не просчитывает затронутую область.

Что я пробовал:

1) Я отключить неявные анимации и делать все на чертеже в CATransaction

2) Я не делает ошибку в моем рисунке ... Это буквально просто две строки с некоторым текстом между ними ... нет способа, которым я представляю промежуточные артефакты.

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

4) Кстати, это происходит идентично в симуляторе и на устройстве (iPad).

Нужно ли мне самостоятельно вставлять в буфер вне экрана и копировать его на экран целиком? Я думал, что прочитал, что Кварц делает это для меня.

Update: Как обычно, после нескольких часов стучали голову о стене Я считаю (частичным) ответом 5 минут после размещения вопроса. Я понял, что я использую CATiledLayer для того, чтобы мой слой повторно отображался при масштабировании. Если я переключу его обратно на обычный CALayer, глюки уйдут. Поэтому я предполагаю, что я вижу артефакты отдельной обработки фрагментов. Теперь я пытаюсь выяснить, как бороться с этим ...

+0

Можете ли вы сделать короткий код примера, чтобы воспроизвести проблему? –

ответ

0

Таким образом, получается, что у меня было три проблемы:

1) CATiledLayer явно затухает в новом содержании плитки со временем по умолчанию 0.25 секунды ... Это вызвало хаос с моим рисунком. Я отменяют это в моем CATiledLayer подкласса:

+ (CFTimeInterval)fadeDuration { 
    NSLog(@"got fade duration"); 
    return 0; 
} 

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

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

Со всеми этими изменениями производительность кажется приемлемой.

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