Безопасно рисовать на фоновых нитях. В документах для -nextDrawable
говорится:
Вызов этого метода блокирует текущий поток ЦП до тех пор, пока не будет доступен новый объект рисования.
(Выделение добавлено.) Если бы его можно было вызывать только в основном потоке, это, вероятно, не было бы таким обобщенным. Кроме того, общий совет Apple состоит в том, чтобы избегать блокировки основного потока, поэтому вы можете подумать, что они каким-то образом укажут на этот факт здесь, например, посоветуют вам не вызывать его, если вы не уверены, что он не заблокируется.
Что касается того, как используется (а не получен) объект рисования, обратите внимание, что типичным вариантом использования является вызов метода -presentDrawable:
командного буфера. Этот метод удобен для добавления запланированного блока обработчика (например, через -addScheduledHandler:
), который затем вызовет -present
на чертеже. Не указано, в каком потоке или очереди будут вызываться блоки обработчика, что говорит о том, что нет никаких обещаний, что вызов -present
для drawable произойдет в основном потоке.
И даже после этого фактическое представление рисуемого на экране не синхронно вызову -present
. Drawable ждет, пока любые команды, которые визуализируют или записывают его текстуру, не будут завершены, и только после этого представляются на экран. Не указано, как достигается эта асинхронность, но далее предполагается, что не имеет значения, в каком потоке -present
вызывается.
Многопоточность немного обсуждается в Руководство по программированию на Metal, хотя оно и не такое прямолинейное, как можно было бы надеяться. См., в частности, раздел о нескольких потоках, буферах команд и кодировщиках команд. Обратите внимание, что обсуждается заполнение буферов команд фоновыми потоками и нет конкретных предупреждений о работе с чертежами. Опять же, это своего рода аргумент из-за отсутствия доказательств, но я думаю, что это ясно. Они заявляют, что только один поток может одновременно воздействовать на данный буфер команд, поэтому они рассматривают вопросы безопасности потоков.
person
Ken Thomases
schedule
13.08.2018