Ради новых идей:
Вариант в вашей текущей реализации будет использовать поддержку CALayer
для теней, которую он вычисляет из фактического содержания пикселей в слое, а не просто из его ограничивающего прямоугольника, и для которого он использует графический процессор. Вы можете попытаться увеличить shadowOpacity
до некоторого огромного значения, чтобы попытаться устранить растушевку; если вам не удастся выполнить рендеринг в подходящий CGContext, выньте только альфа-слой и вручную обработайте его, чтобы применить пороговый тест для альфа-значений, выдвинув их либо до полностью непрозрачного, либо до полностью прозрачного.
Вы можете выполнить этот последний шаг обработки на графическом процессоре даже под ES 1 различными способами. Вы бы использовали альфа-тест, чтобы применить фактический порог, затем вы могли бы, скажем, залить буфер глубины до 1,0, отключить вывод цвета и тест глубины, нарисовать версию с тенью на глубине 0,5, нарисовать версию без затем тень на глубине 1,0, затем включите тестирование цветопередачи и глубины и нарисуйте сплошной черный полноэкранный четырехугольник на глубине 0,75. Так что это похоже на использование буфера глубины для эмуляции трафарета (поскольку графический процессор Apple использовался до того, как устройство с поддержкой ES 2 не поддерживало трафаретный буфер).
Это, конечно, предполагает, что CALayer
тени появляются за пределами композитора, что я не проверял.
В качестве альтернативы, если вы хотите ограничить поддержку устройств ES 2 (все 3GS +), вы можете загрузить свое изображение в виде текстуры и выполнить весь процесс на графическом процессоре. Но это технически оставило бы некоторые устройства с поддержкой iOS 4 без поддержки, поэтому я полагаю, что это не вариант.