Если Core Graphics использует Metal под капотом, может ли реализация Metal работать быстрее, чем реализация CG?Зачем? - PullRequest
0 голосов
/ 07 февраля 2019

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

- Задача : создать небольшое изображение (кончик кисти) поверх большего.

Я решил сначала создать прототип в CG, используя CGContext для рендеринга марок и выяснения, что они работают довольно хорошо, даже со слипшимися штрихами и холстом приличного размера (размер вывода CGContext).

Однако, поскольку мне нужно рисовать на действительно больших текстурах (8000x6000 было бы здорово), я решил дать металлу шанс.Я знаю, что эта задача может быть тривиальной для тех, кто имеет опыт работы с металлом, но я новичок в этой области.Поэтому я попытался использовать CIFilters (с металлической подложкой) для наложения кисти на холст и отображения ее в пользовательском MetalImageView: GTKView.

Я думал, что холст и кисть как CIImages и отображение их в слое металла уже будут более производительными, чем наивная реализация CG.Но это не так.Подход CIFilter визуализирует весь холст каждый штамп (в точке), независимо от того, в CG я просто обновляю маленький прямоугольник вокруг этой точки.

Теперь, я думаю, я мог бы сделать это с помощью CIFilter, если бы я мог изменить вычисляемый экстент.Я не знаю, можно ли это сделать с помощью Core Image, но я уверен, что в металле это будет действительно легко для тех, кто имеет опыт.

- Вопрос : Может ли реализация из чистого металла печатать изображения быстрее, чем CG, учитывая, что CG работает с Metal под капотом?Если так, как быстрее?Стоит ли учиться, как это сделать, или мне лучше потратить это время на улучшение реализации CG?

Обратите внимание, что я прошу растровую кисть, а не векторную кисть с Bezier Paths, которую гораздо прощекод и работает быстрее, но текстурированные кисти не могут быть использованы.

Я очень ценю любую помощь.

1 Ответ

0 голосов
/ 11 февраля 2019

На самом деле в Руководстве по программированию базового образа есть глава об этом.Они описывают непрерывное рисование в одну и ту же текстуру, используя класс CIImageAccumulator.Вы также можете загрузить пример приложения .

Я думаю, что с точки зрения производительности не должно быть большой разницы.Вы должны быть в состоянии сильно оптимизировать, указав Core Image область интереса и область определения (extent) вашего фильтра мазка кисти.Тогда он сможет отображать только необходимые части изображения, а не все в каждом кадре.

...