Quartz Performance Drawing Large Buffers - PullRequest
       8

Quartz Performance Drawing Large Buffers

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

Мне интересно, является ли то, что я пытаюсь, просто плохой идеей.В настоящее время я работаю в Monotouch.Можно ли нарисовать буфер размером с экран (на моем iPhone 4 размером примерно 320x460) в UIView одинакового размера достаточно быстро, чтобы анимация изменений в этом буфере выглядела плавно для конечного пользователя (необходимо, чтобы при рисовании оно составляло около 20 мс).

Я пробовал много разных реализаций.Лучшим на данный момент кажется использование CGLayer в памяти и вызов context.rawl () для применения его к представлению внутри Draw ().Но даже это занимает 30-40 мс на DrawLayer.

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Это действительно зависит от того, что вы рисуете.

Если вы просто рисуете сплошным закрашенным цветом, это не должно быть проблемой.Вопрос в том, сколько поверхности вы меняете, и как вы ее меняете.

Опять же, это зависит от того, что вы рисуете, и от того, можете ли вы перенести часть работы в графический процессор.Например, если у вас есть статические части вашего интерфейса, которые останутся прежними, или они будут анимированы / обновлены независимо, вы можете использовать другой слой для этих областей и позволить GPU составлять их.

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

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

Но, опять же, это будет во многом зависеть от того, что вы пытаетесь сделать.

1 голос
/ 25 февраля 2012

В последнее время я много работал с пользовательскими представлениями, и у меня тоже было много проблем с производительностью.

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

Затем разделите содержимое слоя на отдельные подслои и перерисовывайте их только при необходимости. Хорошо, что анимация и т. Д. Очень плавные для этих отдельных слоев. (Их содержимое является простым растровым изображением и не изменяется до тех пор, пока вы не скажете это).

Единственное ограничение, с которым я столкнулся, было то, что вы не можете использовать режимы смешивания CG (например, умножение) для подслоев. Насколько я знаю, это невозможно. Вы можете использовать только те режимы наложения внутри кода CG, которые используются для рисования содержимого подслоев, но после этого все они составляются в «нормальном» режиме.

...