DirectX 11 Swap Chain с 7 задними буферами
У меня есть настоящий медиаплеер, который работает на Windows 8 в режиме рабочего стола. Версия DirectX для среды выполнения - 11, но поддержка встроенного графического драйвера - для DirectX 9.
На некоторых компьютерах с точно такой же настройкой я вижу, что фактическое число обратных буферов в цепочке свопинга равно 2, и производительность велика, а на некоторых других число обратных буферов равно 7, и кадры пропадают.
У меня нет исходного кода этого проигрывателя, и я удивляюсь, что может быть причиной для определения различного количества обратных буферов во время выполнения.
Может кто-нибудь объяснить, почему такое количество обратных буферов приводит к такому изменению производительности? Или просто укажите мне на соответствующую документацию, которая объясняет значение количества буферных буферов?
(Более подробная информация об отладке: с помощью GPUView я вижу, что когда счетчик обратных буферов равен 2, аппаратное обеспечение работает в синхронизированном режиме, то есть один пакет в очереди HW в каждую секунду VSync (частота кадров обрезки составляет 30 кадров в секунду), когда для 7 буферных буферов работа выполняется сделано для 5-7 кадров вместе, затем несколько пустых VSyncs, затем снова 5-7 кадров и так далее).
Заранее спасибо!
2 ответа
Ну, я получил ответ от Microsoft. Это делается для экономии энергии при работе от постоянного тока (батареи) - таким образом процессор может активироваться для обработки всех доступных буферов, отправки их в графический процессор для работы и перехода в более глубокий режим энергосбережения на более длительное время.
На самом деле я не вижу смысла в наличии более 4 буферов (четырехъядерная буферизация, которая используется для стереоскопии). Большинство приложений используют 2 буфера (двойная буферизация), чтобы приложение могло начать рисовать следующий кадр во втором (заднем) буфере, пока первый (передний) буфер представлен монитору, в противном случае приложению придется ждать, пока Передний буфер заканчивает рисование на экране, прежде чем он может начать рисовать следующий кадр. Тройная буферизация просто расширяет эту идею, так что есть два обратных буфера. Таким образом, если приложение может завершить отрисовку всего буфера быстрее, чем требуется для отображения на экране переднего буфера, то оно может начать рисовать следующий кадр в третьем буфере, вместо того, чтобы ждать завершения представления переднего буфера.
Я не уверен, что это действительно отвечает на ваш вопрос о других приложениях, использующих 7 буферов, но опять же я не думаю, что в этом есть необходимость, поскольку мониторы обычно обновляются с частотой от 60 до 75 Гц.
Если ваше приложение работает так быстро, что оно может нарисовать 2 буфера до того, как первый буфер будет завершен, просто переведите приложение в спящий режим до завершения работы переднего буфера, чтобы дать некоторым другим программам возможность использовать процессор или потратить его. дополнительное время, выполняя некоторую другую обработку для вашего приложения. Если это медиаплеер, вы можете потратить дополнительное время на выполнение более дорогих операций, чтобы повысить качество воспроизведения мультимедиа.
вот ссылка, описывающая буферизацию, но они не говорят о более чем 4 буферах, вероятно потому, что в этом нет необходимости.
http://en.wikipedia.org/wiki/Multiple_buffering
PS Возможно, причина, по которой приложение, вероятно, теряет частоту кадров при использовании примерно 7 буферов, заключается в том, что приложение, вероятно, не может продолжать запись во все буферы до того, как они должны быть представлены на экране. Вероятно, этого не произошло бы, если бы использовалась многопоточность, потому что тогда следующий буфер мог бы быть представлен на экране до того, как приложение завершило рисование для всех других обратных буферов.