dispatch_sync в основной поток из обратного вызова CVDisplayLink

#macos #cocoa #core-video

#macos #какао #ядро-видео

Вопрос:

Я анимирую переменную, используемую CVDisplayLink в macOS, и мне любопытно, есть ли какая-либо причина не использовать dispatch_sync поток ссылки отображения (предполагая, что я «управляю» только одной анимацией на ссылку отображения). Кто-нибудь знает?

Кажется, все работает нормально. Я попробовал dispatch_async сначала (в основной поток, кстати), и я заметил, как кадры будут пропущены из-за слишком медленного переключения потоков, я думаю.

При использовании dispatch_sync фреймы не пропускаются, но (конечно) время между «тиками» отображения ссылки увеличилось. Я полагаю, что это не имеет большого значения, поскольку ссылка на отображение будет ждать до следующего vsync, прежде чем снова поставить галочку.

Я думаю, в любом случае, будут случаи, когда отображение обновляется до того, как основной поток сможет обновиться в ответ на ссылку отображения, но мне все еще интересно, лучше ли один подход, чем другой. Спасибо!

PS: Может быть, использование a NSTimer было бы лучше? Поскольку это позволило бы мне выполнять непосредственно в основном потоке, вместо использования GCD из другого потока. Я предполагаю, что vsync не удастся, но idk.

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

1. Хм… Я думаю, что нашел свой ответ. Вызов CVDisplayLinkStop из основного потока приводит к взаимоблокировке при использовании dispatch_sync .

2. Кажется неправильным говорить, но похоже, что нет способа согласовать с vsync в основном потоке (по крайней мере, на macOS).

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