Arhn - архитектура программирования

Как работает cacheDisplayInRect внутри?

Как [NSView cacheDisplayInRect:(NSRect)rect toBitmapImageRep:(NSBitmapImageRep *)bitmapImageRep] работает внутри, когда записывает растровые данные в bitmapImageRep?

Например. он проходит и получает доступ к CALayer layer всех подвидов и объединяет их, когда вызывается ...cacheDisplayInRect..., или он просто записывает свой собственный слой (который тогда уже содержит данные представления для всех подвидов).

Предыстория моего вопроса: я использую собственный элемент управления (WKWebView), который не работает, когда дело доходит до снимков экрана (пример ТАК вопрос), и вместо того, чтобы заново изобретать колесо, чтобы сделать снимок экрана всего приложения, включая WKWebView, я хотел бы исправить метод, который Cocoa использует для растровых представлений.


Ответы:


1

Я сделал несколько проб и ошибок и выяснил, что оба ...cacheDisplayInRect... и ...drawInContext... вызывают - [NSView drawRect:] внутри для рендеринга элементов.

- [CALayer drawInContext:context] стек вызовов

#0  0x000000010000e28c in -[DXSecureWKWebView drawRect:] at /Users/x/dev/X/XSecureWKWebView.m:34
#1  0x00007fff8d386749 in -[NSView(NSInternal) _recursive:displayRectIgnoringOpacity:inGraphicsContext:CGContext:topView:shouldChangeFontReferenceColor:] ()
#2  0x00007fff8d386afe in -[NSView(NSInternal) _recursive:displayRectIgnoringOpacity:inGraphicsContext:CGContext:topView:shouldChangeFontReferenceColor:] ()
#3  0x00007fff8d386afe in -[NSView(NSInternal) _recursive:displayRectIgnoringOpacity:inGraphicsContext:CGContext:topView:shouldChangeFontReferenceColor:] ()
#4  0x00007fff8d386168 in __46-[NSView(NSLayerKitGlue) drawLayer:inContext:]_block_invoke ()
#5  0x00007fff8d385e11 in -[NSView(NSLayerKitGlue) _drawViewBackingLayer:inContext:drawingHandler:] ()
#6  0x00007fff8d385493 in -[NSView(NSLayerKitGlue) drawLayer:inContext:] ()

- [NSView cacheDisplayInRect:toBitmapImageRep:] стек вызовов

#0  0x000000010000e2dc in -[XSecureWKWebView drawRect:] at /Users/x/dev/x/XSecureWKWebView.m:34
#1  0x00007fff8d386749 in -[NSView(NSInternal) _recursive:displayRectIgnoringOpacity:inGraphicsContext:CGContext:topView:shouldChangeFontReferenceColor:] ()
#2  0x00007fff8d65fe1c in __50-[_NSViewBackingLayer _renderForegroundInContext:]_block_invoke ()
#3  0x00007fff8d385e11 in -[NSView(NSLayerKitGlue) _drawViewBackingLayer:inContext:drawingHandler:] ()
#4  0x00007fff8d50b740 in -[_NSViewBackingLayer _renderForegroundInContext:] ()
#5  0x00007fff934f5ce1 in -[CALayer renderInContext:] ()
#6  0x00007fff934f7aaf in -[CALayer _renderSublayersInContext:] ()
#7  0x00007fff8d50b807 in -[_NSViewBackingLayer _renderSublayersInContext:] ()
#8  0x00007fff934f5cf0 in -[CALayer renderInContext:] ()
#9  0x00007fff934f7aaf in -[CALayer _renderSublayersInContext:] ()
#10 0x00007fff8d50b807 in -[_NSViewBackingLayer _renderSublayersInContext:] ()
#11 0x00007fff934f5cf0 in -[CALayer renderInContext:] ()
#12 0x00007fff934f7aaf in -[CALayer _renderSublayersInContext:] ()
#13 0x00007fff8d50b807 in -[_NSViewBackingLayer _renderSublayersInContext:] ()
#14 0x00007fff934f5cf0 in -[CALayer renderInContext:] ()
#15 0x00007fff934f7aaf in -[CALayer _renderSublayersInContext:] ()
#16 0x00007fff8d50b807 in -[_NSViewBackingLayer _renderSublayersInContext:] ()
#17 0x00007fff934f5cf0 in -[CALayer renderInContext:] ()
#18 0x00007fff934f7aaf in -[CALayer _renderSublayersInContext:] ()
#19 0x00007fff8d50b807 in -[_NSViewBackingLayer _renderSublayersInContext:] ()
#20 0x00007fff934f5cf0 in -[CALayer renderInContext:] ()
#21 0x00007fff934f7aaf in -[CALayer _renderSublayersInContext:] ()
#22 0x00007fff8d50b807 in -[_NSViewBackingLayer _renderSublayersInContext:] ()
#23 0x00007fff934f5cf0 in -[CALayer renderInContext:] ()
#24 0x00007fff8d50b11d in -[NSView _layerBackedDisplayRectIgnoringOpacity:inContext:isRootView:flipContextIfNeedeed:] ()
#25 0x00007fff8d50ac74 in -[NSView displayRectIgnoringOpacity:inContext:] ()
#26 0x00007fff8d65f685 in __62-[NSView cacheDisplayInRect:toBitmapImageRep:includeSubviews:]_block_invoke ()
#27 0x00007fff8d65f3dc in __36-[NSBitmapImageRep _captureDrawing:]_block_invoke ()
#28 0x00007fff8d65f14c in -[NSBitmapImageRep _captureDrawing:] ()
#29 0x00007fff8d65f079 in -[NSView cacheDisplayInRect:toBitmapImageRep:includeSubviews:] ()
03.12.2015
  • Вы случайно не знаете, насколько медленным или быстрым является cacheDisplay(in:to:). Я использую его для преобразования представлений SwiftUI (через NSView) в NSImage, чтобы поместить его в курсор мыши. Но мое приложение очень медленное, и мне трудно понять, почему. Имеет ли смысл использовать NSView draw() для ручного преобразования NSView (преобразованного из представления SwiftUI) в NSImage? 23.01.2020
  • @j.unruh Боюсь, я понятия не имею, несколько лет назад в последний раз я копался во внутренностях библиотеки iOS. Надеюсь, вы поняли это каким-то другим способом. 28.01.2020
  • Если кто-то еще читает это в какой-то момент и имеет аналогичную проблему: использование Cocoa Drawing и NSViews вместо SwiftUI View помогло мне. Преобразование представлений SwiftUI через cacheDisplay(in:to:) в NSImage было очень медленным для меня. Создание NSView с Cocoa Drawing и преобразование их в NSImage через dataWithPDF(inside:) ускорило создание NSImage примерно в 10 раз. 28.01.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..