Вопрос по core-graphics, ios, graphicscontext, calayer, quartz-2d – На iOS после того, как мы создаем слой из контекста и получаем контекст слоя, как эти контексты связаны друг с другом?

3

Мы можем создать слой из текущего графического контекста, а затем получить его контекст:

CGContextRef context = UIGraphicsGetCurrentContext();

CGLayerRef layer = CGLayerCreateWithContext(context, 
                                            CGSizeMake(self.frame.size.width,
                                                self.frame.size.height), NULL);

CGContextRef contextOfLayer = CGLayerGetContext(layer);

Итак, теперь у нас есть 2 контекста:context а такжеcontextOfLayer, Как эти два контекста связаны друг с другом? ЯвляетсяcontextOfLayer на самом деле частьcontext а такжеcontext имеет массив указателей контекста слоя? Если я распечатаю их адреса, используяNSLog(@"%p", ...), они имеют разные адреса, поэтому они не являются одним и тем же объектом. И я думаюcontextOfLayer не влияет на стек контекста, так что это просто независимый контекст, просто вроде "существующий там"; само собой?

Ваш Ответ

1   ответ
3

CGLayer. CGLayer Под оптимизацией подразумевается повторное рисование одного и того же контента в определенном контексте.

(Например: контексты растрового изображения с определенным форматом - например, 32-разрядный RGBA - или контексты PDF и т. Д.)

Когда вы создаетеCGLayerпередайте контекст, который вы намереваетесь нарисоватьCGLayer в. Это позволяетCGLayer оптимизировать себя для такого рода контекста.

Позже, если вы рисуетеCGLayer в этот контекст или в другой контекст, имеющий тот же формат, рисование будет быстрее.

Если вы рисуетеCGLayer в контекст с другим форматом рисунок все равно будет работать, и вы не получите ошибку. Тем не менее, это может быть не так быстро, как если бы вы только что обратились непосредственно к этому контексту.

документация для CGLayerCreateWithContext говорит:

context

The graphics context you want to create the layer relative to. The layer uses this graphics context as a reference for initialization.

Это означает, что слой смотрит на данныйcontext в качестве ссылки. Это не обязательно означает, чтоcontext хранится вCGLayerили постоянная ссылка. Может быть, но вы не можете сказать - это внутренняя деталь реализации.

документация для CGLayerGetContext говорит

The context that’s returned is the context for the layer itself, not the context that you specified when you created the layer.

Так что вы должны ожидать, чтоcontext != contextOfLayer.

Опять же, API не указывает ничего о том, как эти контексты связаны друг с другом - они могут ссылаться друг на друга внутренне, а могут и нет. Как пользователи API мы не должны ничего предполагать.

Чтобы ответить на ваши вопросы конкретно:

Is contextOfLayer actually part of context and context has a array of layer context pointers?

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

I think contextOfLayer doesn't affect the context stack, so is it just an independent context just kind of "exist out there" by itself?

Да, это независимый контекст. & Quot; контекстный стек & quot; в UIKit это концепция более высокого уровня.CGLayer в CoreGraphics - это API нижнего уровня, который ничего не знает оUIKit.

ага, спасибо ... я хотел знать, что внутренности не зависят от того, как это реализовано, а просто чтобы понять, как это работает внутри 太極者無極而生
CoreGraphics не является открытым исходным кодом, так что нет никакого способа узнать. (Если вы не хотите разбирать библиотеку, это будет значительный объем работы.)

Похожие вопросы