Смена анимированного кадра UIView вызывает короткую вспышку предыдущего контента перед повторной рендерингом. - PullRequest
0 голосов
/ 18 августа 2010

У меня есть несколько UIViews, которые имеют класс слоя CATiledLayer, потому что их нужно увеличить с помощью UIScrollViews.Я использую Quartz для рендеринга некоторых страниц PDF внутри UIViews.Все в порядке, пока я не попытаюсь анимировать указанные кадры видов при повороте страницы.

Анимация в порядке, содержимое представления быстро и дешево масштабируется в соответствии с новым размером кадра.После анимации я звоню setNeedsDisplay, чтобы перерисовать все это.Теперь перед вызовом моего -(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx get (но после setNeedsDisplay) содержимое представлений вскоре возвращается к предыдущему состоянию (оставшиеся пиксели становятся растянутыми краями в тех случаях, когда содержимое становится меньше, чем представление).Это приводит к вспышке некоторых очень раздражающих графических искажений перед возвратом к нормальному состоянию благодаря новому «проходу рендеринга».

После большой отладки мне удалось разобраться, что это определенно происходит во время фактическогоцикл рисования (а не цикл выполнения приложения, в котором я выполняю setNeedsDisplay), но до того, как -(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx даже будет вызван.

Какой самый разумный способ избежать или отладить это дальше?

Edit : Я собрал очень простой проект, который отлично демонстрирует этот эффект.http://dl.dropbox.com/u/1478968/EEBug.zip PS: в коде рендеринга спит (2), чтобы эффект лучше наблюдался на экране.

1 Ответ

0 голосов
/ 27 августа 2010

Я предполагаю, что рендеринг pdf выполняется процессором, и ему требуется довольно много времени для текстурной загрузки любых рендеров pdf из памяти CPU в память GPU для реального отображения. Таким образом, ваш новый рендеринг UIView может отображаться до того, как все ваши обновленные пиксели слоя PDF попадут в графический процессор.

Лучше всего сделать предварительный рендеринг новых изображений PDF с новым масштабным коэффициентом в другой закадровый CALayer перед UIView setNeedsDisplay, дайте ему время для загрузки в графический процессор (возможно, вам придется профилировать / настраивать пропускную способность шины устройства, которое вы поддерживаете в худшем случае), а затем завершите анимацию просмотра, быстро переключаясь между старым и новым слоями CALayers.

...