Вопрос по performance, retina-display, core-graphics, ipad – Рисовать изображение с CoreGraphics на Retina iPad медленно

10

В моем приложении для iPad я выполняю рендеринг в закадровое растровое изображение, а затем рисую растровое изображение на экране. (Это потому, что я хочу повторно использовать существующий код рендеринга растрового изображения.) На iPad 2 это работает как обаяние, но на новом iPad с дисплеем Retina рисование растрового изображения выполняется очень медленно, хотя его разрешение все еще остается так же.

Чтобы нарисовать растровое изображение, мы используем обычные функции Quartz 2D:CGImageCreate с поставщиком данных, созданнымCGDataProviderCreateWithData32-битный формат RGBA сkCGImageAlphaNoneSkipLast, вUIView который отображает растровое изображение, вdrawRect:, мы используемCGContextDrawImage нарисовать его в контексте, возвращаемомUIGraphicsGetCurrentContext.

Обратите внимание, что я даже не пытаюсь рисовать с двойным разрешением: сейчас я в порядке с тем же разрешением, которое я использовал на iPad 2. Похоже, что CoreGraphics внутренне удваивает пиксели, а затем отправляет их в графический процессор. хотяCGImage то, что я делаю, должно быть хорошо для передачи непосредственно в графический процессор. Есть идеи?

Ваш Ответ

1   ответ
15

and then sending that to the GPU,

Довольно много. Точнее (по духу как минимум):

UIKit makes a CGBitmapContext 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, вероятно, более эффективно, чем назначение нового изображения для UIImageView, верно? Frederik Slijkerman
AFAIK два метода почти одинаковы по производительности, но как всегда: если это имеет значение, попробуйте и посмотрите.
Это потрясающее улучшение производительности. Большое спасибо.
В случае, если кому-то интересно, как я, вы должны привести изображениеid вот такview.layer.contents = (id) myUIImage.CGImage; Вы также должны использовать мостовое литье при использовании дугиview.layer.contents = (__bridge id) myUIImage.CGImage; подробности были найдены здесьstackoverflow.com/a/5455139/1721611
Попробовал и метод view.layer.contents работает блестяще, еще раз спасибо! Frederik Slijkerman

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