Можно ли установить содержимое CALayer из CGLayer в iPhone SDK? - PullRequest
0 голосов
/ 09 февраля 2010

Для пользовательского UIView, который я реализовал, я хочу отобразить некоторую графику в нескольких слоях CALay, которые добавляются как подпредставления моего слоя UIViews.

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

Первые эксперименты показывают, что я могу заставить все это работать, пройдя что-то вроде этого:

-(void) initCustomLayer: {
    UIGraphicsBeginImageContext(self.bounds.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext ();
    // ... do the drawing in ctx ...
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    customLayer = [[CALayer alloc] init];
    customLayer.bounds.size = self.bounds.size;
    customLayer.contents = image.CGImage;
    [self.layer addSublayer customLayer];
    [customLayer release];
}

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

То, что я не могу выяснить, это то, есть ли способ установить содержимое CALayer из CGLayer?

Возможно ли это и имеет ли это смысл? Должен ли я просто перестать беспокоиться и использовать подход, основанный на UIImage / CGImageRef?

1 Ответ

2 голосов
/ 10 февраля 2010

Хотя в документации не говорится, что CALayers работают аналогично CGLayers, Обзор графики и изображений говорит о том, что Core Animation «ускоряется с помощью GPU», что, я думаю, мы можем с уверенностью истолковать, сказав, что оно помещает контент CALayer на видеокарту, когда это возможно. Это то, что делает CGLayer тоже.

Итак, я ожидаю, что CALayer, поддерживаемый CGImage, обеспечит примерно такое же повышение производительности, что и CGLayer, если вы не часто меняете изображение.

Если вы хотите быть абсолютно уверены, что получите то же поведение кэширования как текстуры, что и CGLayer, создайте подкласс CALayer, который имеет свойство для хранения CGLayer и отвечает на drawInContext:, рисуя CGLayer .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...