Подтвердить что ты не робот

Почему приложение Direct3D работает лучше всего в полноэкранном режиме?

Производительность приложения Direct3D кажется значительно лучше в полноэкранном режиме по сравнению с оконным режимом. Каковы технические причины этого?

Думаю, это связано с тем, что полноэкранное приложение может получить эксклюзивный контроль над дисплеем. Но почему приложение не может получить эксклюзивный контроль для части экрана (то есть окно) и имеет те же преимущества в производительности?

4b9b3361

Ответ 1

Вот записки о том, как все работает под ними.

Экран монитора всегда должен быть связан с так называемой первичной поверхностью, чтобы иметь возможность отображать что угодно, т.е. видеокарта может сканировать только одну поверхность в видеопамяти.

Когда приложение полноэкранное (и все настроено правильно, чтобы включить перелистывание), первичная поверхность является всего лишь одним из бэкбуферов приложения и перевернута в другой буфер для каждого кадра. Это наиболее эффективный способ представления на экране, но он требует, чтобы приложение владела всей областью мониторинга (то есть всей первичной поверхностью).

Когда нет полноэкранного приложения и DWM выключен, первичная поверхность принадлежит ОС, и каждое оконное приложение выполняет блик от приложения backbuffer до первичной поверхности. Этот blit требует времени GPU для завершения (а также бликов из других приложений, видимых на экране), поэтому он не так эффективен, как полноэкранная презентация. XP работал таким образом.

Когда DWM создает экран, все становится еще сложнее. Здесь DWM владеет первичной поверхностью и нуждается в том, чтобы рисовать окна приложений там. Чтобы это стало возможным, каждое окно имеет связанную поверхность, содержащую его содержимое, называемую поверхностью перенаправления (что позволяет DWM разрешать ореолы окна, эффекты стекла и все эти хорошие вещи). Каждый раз, когда приложение D3D выдает фрейм, он добавляет blit к поверхности перенаправления. Таким образом, должно произойти несколько blits: blit to the redirection surface by app, blit от поверхности перенаправления до первичной DWM, что опять-таки некоторые накладные расходы по сравнению с полноэкранным.

Обратите внимание, что вся эта дополнительная работа находится на графическом процессоре, поэтому она не влияет на производительность процессора.

Материал для дальнейшего чтения:

http://blogs.msdn.com/greg_schechter/archive/2006/03/19/555087.aspx

http://blogs.msdn.com/greg_schechter/archive/2006/05/02/588934.aspx

http://blogs.msdn.com/greg_schechter/archive/2006/03/05/544314.aspx

Ответ 2

Там бит в MSDN, в котором говорится, что полноэкранный режим использует сброс буфера, если он настроен правильно, а не blitting. Это имеет смысл.

Конечно, вы можете (и в некотором смысле сделать) предоставить эксклюзивный контроль части экрана на приложение, но что будет с остальной частью экрана? Вы все еще должны blit, делать проверку окклюзии и т.д. На остальных окнах, и я думаю, что это приводит к потере производительности.

Ответ 3

Я добавлю в @aib ответ, что остальная часть экрана управляется ОС. Итак, если что-то еще нужно рисовать/обрабатывать одновременно, должен быть удар производительности.

Например, если у вас есть видео, воспроизводимое в проигрывателе Windows Media в одном окне, тогда запустите Civilization в другом, когда Civ начнет рисовать свою графику, ему нужно будет использовать экранное пространство со всем остальным (например, видео.

Если приложение DirectX имеет полноэкранный режим, все остальное может быть "обновлением" или "воспроизведением", но не рисованием.

Ответ 4

В основном, видеооборудование полностью предназначено для приложения с эксклюзивным режимом.

Не существует конкуренции за видео ресурсы (конвейер, память текстур и т.д.)

В частности, загрузка текстуры может быть большим узким местом. Чем меньше вы должны это делать (потому что у вас есть все), тем лучше.