Поведение будет зависеть от многих факторов, таких как версия ОС (например, Win7 против Win XP) и количество ядер.Если у вас есть два ядра и два потока без объектов синхронизации, они должны работать одновременно, и Sleep () в одном потоке не должен влиять на другой (по большей части).
Похоже, у вас есть другая синхронизация междупотоки, потому что в противном случае, когда вы вообще не спите в потоке рендеринга, вы должны работать со скоростью> 100FPS, нет?
В случае, если синхронизация абсолютно отсутствует, в зависимости от объема обработки в двух потокахих использование Sleep () может увеличить вероятность конфликта для одноядерной системы.То есть, если только один поток вызывает Sleep (), обычно, скорее всего, ему будут даны следующие кванты после того, как он проснется и при условии, что он выполняет очень мало обработки, то есть сразу выдает, такое поведение продолжится.Если два потока вызывают Sleep (), существует некоторая вероятность, что они проснутся в одних и тех же квантах, и если хотя бы одному из них потребуется выполнить какой-либо объем обработки, другой будет задержан, и наблюдаемая частота будет ниже.Это должно применяться только в том случае, если доступно одно ядро для запуска двух потоков.
Если вы хотите поддерживать частоту обновления 100FPS, вы должны отслеживать время следующего запланированного обновления и только Sleep в течение оставшегося времени.Это гарантирует, что даже если ваш поток столкнется с каким-либо другим потоком для квантов ЦП, вы сможете сохранить скорость (при условии, что процессорного времени достаточно для всей обработки).Что-то вроде:
DWORD next_frame_time = GetTickCount(); // Milli-seconds. Note the resolution of GetTickCount()
while(1)
{
next_frame_time += 10; // Time of next frame update in ms
DWORD wait_for = next_frame_time - GetTickCount(); // How much time remains to next update
if( wait_for < 11 ) // A simplistic test for the case where we're already too late
{
Sleep(wait_for);
}
// Do periodic processing here
}
В зависимости от целевой ОС и ваших требований к точности, вы можете использовать функцию времени с более высоким разрешением, такую как QueryPerformanceCounter ().Приведенный выше код не будет хорошо работать в Windows XP, где разрешение GetTickCount () составляет ~ 16 мс, но должно работать в Win7 - это в основном для иллюстрации моей точки зрения, а не для буквального копирования во всех ситуациях.