Ответ 1
Решение:
Кажется, что сработало простое решение с использованием Sleep(1)
в функции рендеринга. Вы также спросили, почему - я не уверен, что смогу это решить правильно, но здесь мое лучшее предположение:
Почему это работает?
Ваши сокурсники могут включить VSync по умолчанию в своих драйверах. Это приводит к тому, что их код работает только так быстро, как может обновиться экран, скорее всего, 60 кадров в секунду. Это дает вам около 16 миллисекунд для рендеринга кадра, и если код эффективен (например, 2 мс для рендеринга), он оставляет много времени для того, чтобы процессор мог выполнять другие связанные с ОС вещи, такие как перемещение вашего окна.
Теперь, если вы отключите вертикальную синхронизацию, программа попытается отобразить как можно больше кадров, эффективно забивая все остальные процессы. Я предложил вам использовать Сон, потому что он раскрывает эту конкретную проблему. Это не имеет значения, если это 1 или 3 мс, что он действительно делает, это сказать "эй, процессор, я сейчас ничего не делаю, поэтому ты можешь делать другие вещи".
Но разве это не замедляет мою программу?
Использование сна - обычная техника. Если вы обеспокоены тем, что потеряли 1 мс каждый кадр, вы также можете попробовать поставить Sleep(0)
, так как он должен действовать точно так же, предоставляя свободное время CPU. Вы также можете попробовать включить вертикальную синхронизацию и проверить, действительно ли моя догадка была правильной.
В качестве дополнительной заметки вы также можете посмотреть графики использования процессора с и без сна. Он должен быть на 100% (или 50% на двухъядерном процессоре) без (работает как можно быстрее) и намного ниже, в зависимости от ваших программных требований и скорости вашего процессора.
Дополнительные замечания о Sleep (0)
После того, как интервал ожидания прошел, поток готов к запуску. Если вы укажете 0 миллисекунд, поток отменит оставшуюся часть своего временного фрагмента, но останется готовым. Обратите внимание, что готовый поток не гарантирует немедленного запуска. Следовательно, поток может не работать до некоторого времени после истечения интервала ожидания. - это от здесь.
Также обратите внимание, что поведение систем Linux может несколько отличаться; но я не специалист по Linux; возможно, прохожий может прояснить.