Вопрос по performance, retina-display, core-graphics, ipad – Рисовать изображение с CoreGraphics на Retina iPad медленно
В моем приложении для iPad я выполняю рендеринг в закадровое растровое изображение, а затем рисую растровое изображение на экране. (Это потому, что я хочу повторно использовать существующий код рендеринга растрового изображения.) На iPad 2 это работает как обаяние, но на новом iPad с дисплеем Retina рисование растрового изображения выполняется очень медленно, хотя его разрешение все еще остается так же.
Чтобы нарисовать растровое изображение, мы используем обычные функции Quartz 2D:CGImageCreate
с поставщиком данных, созданнымCGDataProviderCreateWithData
32-битный формат RGBA сkCGImageAlphaNoneSkipLast
, вUIView
который отображает растровое изображение, вdrawRect:
, мы используемCGContextDrawImage
нарисовать его в контексте, возвращаемомUIGraphicsGetCurrentContext
.
Обратите внимание, что я даже не пытаюсь рисовать с двойным разрешением: сейчас я в порядке с тем же разрешением, которое я использовал на iPad 2. Похоже, что CoreGraphics внутренне удваивает пиксели, а затем отправляет их в графический процессор. хотяCGImage
то, что я делаю, должно быть хорошо для передачи непосредственно в графический процессор. Есть идеи?
and then sending that to the GPU,
Довольно много. Точнее (по духу как минимум):
UIKit makes aCGBitmapContext
the size of your view's bounds, in device pixels
It makes that context the current context
You draw your CGImage
into that context
... so CG has to rescale the source image, and touch all of the destination pixels
After you're done drawing, UIKit makes a CGImage
from the bitmap context
and assigns it to the view's layer's contents.
the CGImage that I'm making should be fine for passing to the GPU directly.
Если вы хотите, чтобы это произошло, вы должны указать системе сделать это, исключив некоторые из шагов, описанных выше.
(Между UIKit, CoreAnimation и CoreGraphics нет связи, которая обеспечивает «быстрый путь», как вы ожидаете.)
Самый простой способ был бы сделатьUIImageView
и установите егоimage
кUIImage
оборачиваяCGImageRef
.
Или установите свойview.layer.contents
на вашCGImageRef
, (И обязательноnot переопределение-drawRect:
, not вызов-setNeedsDisplay
и убедитесь,contentMode
являетсяnot UIViewContentModeRedraw
, Легче просто использоватьUIImageView
.)
view.layer.contents = (id) myUIImage.CGImage;
Вы также должны использовать мостовое литье при использовании дугиview.layer.contents = (__bridge id) myUIImage.CGImage;
подробности были найдены здесьstackoverflow.com/a/5455139/1721611