Оказывается, это поведение является намеренным.В Windows Vista и более поздних версиях реализована так называемая служба Multimedia Class Scheduler (MMCSS) , призванная сделать воспроизведение мультимедиа максимально плавным.Поскольку воспроизведение мультимедиа использует аппаратные прерывания для обеспечения плавного воспроизведения, любые конкурирующие прерывания будут вызывать проблемы.Одним из основных источников аппаратных прерываний является сетевой трафик.Из-за этого Microsoft решила ограничить сетевой трафик, когда программа работала под MMCSS.
Я думаю, это было большое дело назад в 2007 когда Vista вышла , но я пропустил это.Была статья Марка Руссиновича (спасибо ypnos ) , описывающая MMCSS .Кажется, что вся моя проблема сводилась к следующему:
Поскольку стандартный размер кадра Ethernet составляет около 1500 байтов, ограничение в 10 000 пакетов в секунду равно максимальной пропускной способности примерно 15 МБ / с.Сети 100 МБ могут обрабатывать не более 12 МБ / с, поэтому, если ваша система находится в сети 100 МБ, вы, как правило, не увидите замедления.Однако, если у вас есть сетевая инфраструктура 1 Гбит, а отправляющая система и принимающая система Vista имеют сетевые адаптеры 1 Гбит, вы увидите пропускную способность примерно до 15%.Кроме того, в коде регулирования NDIS есть печальная ошибка, которая увеличивает регулирование, если у вас есть несколько сетевых адаптеров.Например, если у вас есть система с беспроводными и проводными адаптерами, NDIS будет обрабатывать не более 8000 пакетов в секунду, а с тремя адаптерами - до 6000 пакетов в секунду.6000 пакетов в секунду равны 9 МБ / с, это ограничение видно даже в 100 МБ сетях.
Я не проверял, что ошибка в нескольких адаптерах все еще существует в Windows 7 или Vista SP1, но это что-тоискать, если у вас возникли проблемы.
Из комментариев к сообщению Руссиновича я обнаружил, что в Vista SP1 введены некоторые параметры реестра, которые позволяют настроить влияние MMCSS на Windows.В частности, ключ NetworkThrottlingIndex .
Решение моей проблемы состояло в том, чтобы полностью отключить регулирование сети, установив ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\NetworkThrottlingIndex
на 0xFFFFFFFF
, а затем перезагрузив его.Это полностью отключает часть регулирования сети MMCSS.Я попытался просто увеличить значение до 70
, но это не переставало вызывать ошибки, пока я полностью не отключил его.
До сих пор я не видел каких-либо неблагоприятных воздействий на другие мультимедийные приложения (ни на части захвата видео и вывода звука моего собственного приложения) от этого изменения.Я сообщу здесь, если это изменится.