2016-11-23 3 views
2

В настоящее время я пишу iOS-сервер для кросс-платформенной программы, чей независимый от платформы движок записывает всю свою графику в 32-разрядные пиксельные буферы в порядке RGBA. Альфа-байт не используется. Графика всегда непрозрачна, поэтому мне не требуется альфа-смешивание.Аппаратное ускорение масштабирования на iOS без OpenGL

Что является наиболее эффективным вариантом для рисования и масштабирования этих пиксельных буферов для моего CGContextRef внутри моего метода drawRect? Буквы пикселей обычно имеют размер всего 320x240 пикселей, и их необходимо масштабировать, чтобы полностью заполнить размеры моего представления, например. 1024x768 на не-Retina iPads и 2048x1536 на Retina iPads. Это очень много работы, поэтому лучше всего использовать GPU. Но как я могу заставить iOS рисовать и масштабировать с помощью GPU без использования OpenGL?

Я пробовал использовать CGContextDrawImage(), но это очень медленно, возможно, потому что все сделано с использованием CPU.

Я также имел взглянуть на CIImage API, потому что они, по-видимому GPU оптимизирован, но проблема в том, что CIImage объекты неизменны, так что я должен был бы постоянно создавать новые CIImage объекты для каждого кадра, мне нужно сделать, который будет вероятно, убить и производительность.

Я мог бы пойти с OpenGL, конечно, но я хотел бы получить некоторые отзывы о том, есть ли более легкое решение получить то, что я хочу здесь.

Спасибо за любые идеи!

+0

Я думаю, что следующие ссылки покажут вам некоторые подсказки. http://stackoverflow.com/questions/6520320/images-vs-core-graphics и https://robots.thoughtbot.com/designing-for-ios-graphics-performance и https://lobste.rs/s/ ckm4uw/a_performance-minded_take_on_ios_design/комментарии/itdkfh. – beshio

ответ

1

Чтобы ответить на мой собственный вопрос, самый простой способ сделать это - просто создать CGImageRef из буфера пикселей, используя CGDataProviderCreateWithData(), а затем CGImageCreate(). Это CGImageRef затем может быть установлен в качестве слоя отображения вида, например, так:

view.layer.contents = (id) myImage; 

Изображение будет автоматически масштабируется (с ускорением GPU), чтобы соответствовать каркас UIView «s, если contentMode установлен в UIViewContentModeScaleToFill (который является по умолчанию).

Спасибо Дэвиду Дункану из списка рассылки Cocoa за предложение этого решения!

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