Многопоточное графическое рисование с помощью мультитач-действий, Swift

#swift #multithreading #core-graphics #multi-touch #uitouch

#swift #многопоточность #ядро-графика #мультитач #uitouch

Вопрос:

Я разрабатываю приложение, которое допускает мультитач-ввод, и у меня возникают проблемы с рисованием с использованием drawRect в моем UIView. Когда на экране находится более одного пальца, мне нужно нарисовать прямоугольник, который охватывает все входные данные UITouch. Есть ли какие-либо рекомендации по этому поводу или способ одновременного рисования нескольких прямоугольников, чтобы избежать повторного рисования большей части экрана снова и снова?

Комментарии:

1. Почему в вашем названии упоминается многопоточное графическое рисование ядра? Вы действительно пытаетесь визуализировать основную графику из нескольких потоков?

2. Я знаю, что рендеринг coregraphics не допускает многопоточности, просто пытаюсь найти эффективный способ одновременного рисования нескольких касаний или, по крайней мере, иллюзию этого.

3. Core Graphics (CG) позволяет выполнять рендеринг из фоновых потоков, если вы будете осторожны. Только не несколько потоков одновременно. Это UIKit, который небезопасен для ad. Вы действительно должны знать, что вы делаете, если собираетесь пытаться писать многопоточный CG-код.

4. Когда вы говорите «нарисуйте прямоугольник, который охватывает все входные данные UITouch», что вы здесь рисуете? Вы имеете в виду прямоугольник (например, прямоугольник выделения)? Или вы имеете в виду, что вы вносите некоторые изменения в ограниченную область (осветляете ее или раскрываете или что-то в этом роде)? Или что-то еще? Я подозреваю, что ответ здесь действительно «CALayer», но я не совсем уверен, что вы пытаетесь нарисовать.

5. В конечном итоге мне бы хотелось, чтобы, когда я провожу 4 пальца по экрану, каждая линия рисуется отдельно друг от друга одновременно, поэтому мне не нужно перерисовывать огромную рамку и охватывать расположение всех четырех пальцев.

Ответ №1:

В UIView есть метод setNeedsDisplay(_:) , который принимает прямоугольник как недействительный. Вы можете вызывать это несколько раз, чтобы принудительно обновлять несколько небольших прямоугольных областей. Система попросит представление повторно нарисовать эти прямоугольники.

Комментарии:

1. Вот в чем проблема, когда мне нужно перерисовать несколько прямоугольных областей одновременно, drawRect не допускает многопоточности, так как же это можно сделать? Или перерисовки, переходящие с одной строки на другую, будут настолько быстрыми, что пользователь не заметит?

2. Система должна вызывать ваш draw(rect:) метод повторно, один раз для каждого rect, который нуждается в обновлении. Это должно происходить достаточно быстро, чтобы его не было видно. (Одним из требований для реализации пользовательского draw(rect:) метода является то, что ваша реализация должна быть быстрой .

3. Прошло очень много времени с тех пор, как я в последний раз тестировал это, поэтому я был бы рад узнать, изменилось ли это, но, насколько я помню, rect, отправленный на setNeedsDisplay(_:) игнорируется и draw(rect:) всегда вызывается с полным прямоугольником на iOS, в отличие от Mac.

4. Как и вы, прошло очень много времени с тех пор, как я возился draw(rect:) . Возможно, вы правы.