В чем волшебство CAReplicatorLayer?

Что мне интересно в CAReplicatorLayer:

  • Он может очень эффективно отображать CALayer несколько раз с различными преобразованиями (как?)
  • Похоже, он каким-то образом повторно использует «резервное хранилище» для реплицированного слоя и даже применяет к нему некоторые цветовые оттенки (как?)

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

Поэтому спросил совершенно по-другому: возможно ли получить «резервное хранилище» для CALayer и отображать его так, как я хочу, столько раз, сколько захочу?

(под «резервным хранилищем» я подразумеваю визуализированную текстуру для CALayer/UIView. Я мало знаю о том, что происходит под капотом CoreAnimation/QuartzCore).


Почему я не смотрю на альтернативы, такие как, например. рендеринг CALayer в UIImage:

  • Представление
  • Контент динамичен/меняется довольно часто при переходах
  • Было бы здорово сделать это по-другому!

person hfossli    schedule 12.12.2012    source источник
comment
Сам задавался этим вопросом. Надеюсь, появится кто-то умнее нас, ха-ха.   -  person Ryan Poolos    schedule 12.12.2012


Ответы (1)


CALayer специального назначения, такие как CAReplicatorLayer или CAGradientLayer, могут (через частные API) выполнять свои рисунки непосредственно на графическом процессоре, используя быстрое заполнение или копирование. В некотором смысле они отличаются тем, что резервное хранилище находится не в обычной оперативной памяти, а непосредственно в графическом процессоре.

person Cocoanetics    schedule 13.12.2012
comment
Спасибо за ответ. Это не звучит многообещающе для того, что я надеялся сделать, но действительно проясняет некоторые аспекты. :) - person hfossli; 13.12.2012
comment
вы всегда можете использовать EAGRLayer и рисовать на нем с помощью OpenGL с шейдерами. Это был бы быстрый способ сделать пользовательский рисунок. - person Cocoanetics; 13.12.2012
comment
Я полагаю, я не могу сделать это с помощью UIViews? Или в моем случае: я делаю что-то столь же смелое, как репликация UIWebView. Я бы очень хотел что-то похожее на CAReplicatorLayer, но с контролем над преобразованием каждого отдельного экземпляра (вместо инкрементного, которое предлагает CAReplicatorLayer). Если OpenGL/EAGLLayer предлагает это, я был бы более чем счастлив. - person hfossli; 13.12.2012