2013-12-18 3 views
4

Я рисую куски CGBitmapContext в drawRect UIView. Каковы наилучшие значения перечисления CGBitmapInfo для обеспечения оптимальной производительности? Сейчас я использую kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big, но я также видел этот StackOverflow вопрос сниппет, который предлагает альтернативу:Производительность CGBitmapInfo на iOS

Why does this code decompress a UIImage so much better than the naive approach?

// makes system don't need to do extra conversion when displayed. 
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little 

Мои CGBitmapContext изменчиво, так что пользователь может рисовать на ней, добавлять изображения к нему и т. д.

+0

Насколько я знаю второй набор опций, если быстрее. Но можете ли вы использовать UIGraphicsBeginImageContextWithOptions для создания контекста растрового изображения и не беспокоиться об этих деталях? – yurish

+0

My CGBitmapContext изменен, что означает, что пользователь может рисовать его, добавлять к нему изображения и т. Д., И все это необходимо отобразить на экране с помощью UIView drawRect. – jjxtra

+0

@yurish можете ли вы указать мне документацию о том, почему вторая быстрее? – jjxtra

ответ

3

Я провел тесты с kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big против kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little, и профайлер показал мне, что есть несколько иной путь кода.

kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little копирует память напрямую, а kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big переходит через функцию преобразования.

Это почти не повлияло на общее время, необходимое для рисования дорожек в моем CGBitmapContext (даже на iPod 4), а затем позвоните setNeedsDisplayInRect:, чтобы показать их на экране. Кроме того, поскольку общее время существенно идентично, я придерживаюсь kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big.

EDIT я переключился обратно kCGBitmapByteOrder32Little, чтобы иметь лучшую совместимость с рамками других IOS (например, AVFoundation), которые используют BGRA (Little Endian) байт заказов, так как не было никакого влияния на производительность.

+0

Вы измеряете общее время, включая время для преобразования растрового изображения из одного формата в другой? – yurish

+0

Да, общие миллисекунды были очень близкими (возможно, 10-20 разниц). Возможно, я снова профилью его и отправлю точные тайминги. – jjxtra

+0

Как вы можете измерить время преобразования? Если я правильно понимаю, это преобразование выполняется при совершении транзакции Core Animation. SetNeedsDisplayInRect: просто отмечает представление для перерисовки, сам чертеж происходит позже в цикле цикла запуска. – yurish

Смежные вопросы