Задать вопрос
Dyikot
@Dyikot

Как лучше реализовать асинхронную задержку?

Недавно ознакомился с сопрограммами 20 стандарта и тут возникает вопрос о правильности реализвации задержки. На данный момент я реализовал задержку в пределах одного потока. В основном цикле производится их обработка, т.е есть приоритетная очередь и просто проверятся вышло ли время и если да то используя обработчик сопрограммы производится ее "продолжение". И проблема какая. У меня в цикле стоит еще задержка равная частоте обновления монитора. И если 60 Гц, то эта проверка будет производится каждые ~16.667 мс. Что оказывается неточность при небольших задержках. И Вот тут возникает вопросы. А может лучше тогда перенести обработку на отдельный поток? Но ведь продолжение всеравно придется вызывать в основном потоке? Или может изменить обработку задержки?
Также у меня есть реализвация таймера, который ждет в отдельном потоке. Можно было бы его использывать, но тогда на каждую зарержку отдельный поток...
  • Вопрос задан
  • 224 просмотра
Подписаться 2 Простой 14 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++: Профессия + специализация + нейросети
    12 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Skillbox
    Разработчик на C++
    7 месяцев
    Далее
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Расспросы выяснили вот что.
Жёсткое реальное время, вероятно мультимедиа: 8 мс — грубо.
Следить за загрузкой едва ли способен. Поток загружен постоянно, задания довольно крупные.
В таком случае поможет многопоточка, главное — придумать, как перекидывать данные из потока в поток.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@rPman
не нужно ждать интервалы времени, это абсурдно и неправильно!

на windows официальный способ через directx 11 (windows 8+)
https://learn.microsoft.com/en-us/windows/uwp/gami...
примеры гуглятся отвратительные включая msdn, но ИИ выдает их в сжатом и понятном виде:
IDXGISwapChain2* swapChain2; // должен быть получен через QueryInterface
swapChain2->SetMaximumFrameLatency(1);
HANDLE hWaitable = swapChain2->GetFrameLatencyWaitableObject();

// основной цикл
for (;;)
{
    // ждём, пока можно обновлять кадр
    WaitForSingleObjectEx(hWaitable, INFINITE, TRUE);

    RenderFrame();
    swapChain2->Present(1, 0);
}


p.s. еще есть фича монитора (и соответственно видеокарты) nvidia g-sync и amd freesync но это сугубо внутренняя ведь видеокарты, она меняет время обновления монитора в угоду приложения (т.е. не ты ждешь а тебя) но управлять этим напряму не получится... она включается по команде swapChain->Present(0...); (если 1 то использовать v-sync), лично сам никогда этим не пользовался, в жизни только один раз писал приложение синхронно vsync и это было давно и работало коряво (но это проблема была во времена winxp-win7 сейчас с этим лучше).

сам считаю что g-sync это отвратительная фича в той форме что преподносится... для приятных ощущений fps должен быть стабильным, и не обязательно бесконечно большим.. после 60Hz начинаются артефакты уже оборудования (дешевое оборудование и тут уже глючит), и только дорогие mid-end и выше мониторы (это от 50т.р. есть дешевле но там другие проблемы) позволяющие в некоторых случаях эту частоту поднять но артефакты будут, их просто не видно невооруженным глазом. Если же постоянно подруливать частотой обновлений, то эта нестабильность будет сразу заметна и создавать ощущение 'тормозов', вынуждая повышать fps что бы это убрать.

Очень небольшой класс игр требует частоты выше 60, а если честно, подавляющему большинству хватит 40 (кто то скажет 30 но там нужно править видеоряд, добавляя смазывание, что создает другие проблемы)... Посмотрите на эти тесты https://testufo.com/ (не всякое железо в браузере позволит выше 60Hz обновлять но если позволит, рекомендую посмотреть)

g-sync позволит изменить частоту разрешения монитора до требуемой без изменения видеорежима, но на практике в игре в лучшем случае будет выбор 30..60..10500Hz а не число по желанию.

Повторюсь, важна стабильность, любое отклонение от нее воспринимается как тормоза.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы