Манипулирование отдельными пикселями, а затем копирование всего буфера памяти в CGContext, а затем создание UIImage с этим контекстом может оказаться неэффективным, как вы обнаруживаете.
Вы можете продолжать улучшать и оптимизироватьподход холста CoreGraphics, поскольку он более эффективен в отношении того, какая часть вашего вне экрана копируется на экран. Вы можете обнаружить пиксели, которые изменились, и скопировать только минимальный ограничивающий прямоугольник этих пикселей на экран. Этот подход может быть достаточно для вашего случая использования, когда вы заполняете только области цветами.
Вместо того, чтобы копировать весь экран, скопируйте только измененную область:
self.context?.draw(image.cgImage, in: CGRect(x: diffX, y: diffY, width: diffWidth, height: diffHeight))
ЭтоВы можете определить измененный прямоугольник и когда обновлять экран.
Здесь - пример приложения для рисования, использующего CoreGraphics, CoreImage и CADisplayLink. Код немного староват, но концепции все еще действительны и послужат хорошей отправной точкой. Вы можете увидеть, как изменения накапливаются и выводятся на экран с помощью CADisplayLink.
Если вы хотите представить различные типы чернил и рисованных эффектов, подход CoreGraphics будет более сложным. Вам захочется взглянуть на Apple Metal API. Хороший урок здесь .