Приложение MFC D3D: руководство по Direct3D часть I - Замечание о возможностях устройства

ОГЛАВЛЕНИЕ

Замечание о возможностях устройства

Среда разработки проверяет возможности устройства на наличие поддержки аппаратной VP, интервалов воспроизведения или нулевых образцовых устройств. Однако вашему приложению может требоваться проверка на наличие других характеристик для работы. Допустим, ваше приложение требует аппаратной поддержки объемных текстур, для чего бы они ни были нужны, поэтому в какой-то момент ему придется проверить член Caps.TextureCaps на наличие флага D3DPTEXTURECAPS_VOLUMEMAP. Если флаг не установлен, аппаратное обеспечение не поддерживает их, и ваше приложение должно достойно завершить работу и сообщить пользователю, чтобы он установил новый адаптер дисплея.

Перечисление множественной выборки

Еще одно ограничение приложения – допустимые типы множественной выборки, по умолчанию заполненное всеми возможными типами в конструкторе CXD3DEnum. Эта функция перечисления спрашивает Direct3D о поддержке каждого типа на поверхности однобуферной прорисовки (буфер невидимых поверхностей), отфильтровывая неподдерживаемые типы с помощью вызова Direct3D CheckDeviceMultiSampleType. Вызов также возвращает, при успехе, количество уровней качества для типа. Оба значения – тип и уровни качества – попадают в соответствующие им списки. Разные типы множественной выборки могут иметь разные уровни качества, поэтому обязательно обращайтесь к обоим спискам в синхронном режиме при передаче значений другим вызовам и структурам API.

Перечисление форматов глубины/трафарета

Эта функция обходит допустимые для приложения форматы глубины/трафарета и проверяет каждый формат по отношению к соответствующим значениям "AppMin", на всякий случай. Затем она задает Direct3D два вопроса о формате: может ли он использоваться в устройстве, и совместим ли он с форматами отображения и буфера невидимых поверхностей устройства. Если и только если ответ на оба вопроса ”да”, то формат буфера глубины/трафарета попадает в текущий список DSFormats в DeviceCombo. Обычно мы получаем подгруппы определенных для приложения форматов глубины/трафарета.

Перечисление конфликтов глубины/трафарета и множественной выборки

Если ваше приложение будет использовать поверхности глубины/трафарета, они должны допускать множественную выборку. Кроме того, если такие поверхности будут использоваться вместе с любой поверхностью однобуферной прорисовки (буфер невидимых поверхностей), обе поверхности требуют один и тот же тип множественной выборки. Поэтому нужно проверять каждый формат глубины/трафарета на совместимость по отношению к каждому типу множественной выборки, попавшему в текущий DeviceCombo.  Это делается с помощью вызова API устройства, который при неудаче регистрирует конфликт в соответствующем списке. Цель всего этого – не дать запрещенной комбинации попасть в настройки отображения.

Перечисление интервалов воспроизведения

Они относятся к способности драйвера обновлять дисплей, т.е. менять воспроизведение с определенной скоростью в единицах скорости обновления экрана (иначе называемой кадровой синхронизацией).

Кадровая синхронизация – количество обновления экрана в секунду, обычно около 60 раз для большинства CRT и TV. Задумывались ли вы когда-либо, как работает ваш монитор CRT (электронно-лучевая трубка)? Электронный луч отклоняется нагретым катодом, чтобы луч ударялся о покрытую люминофором вакуумную трубку в непрерывной развертке слева направо и сверху вниз. Когда луч доходит до правого нижнего угла, он движется обратно кверху вдоль диагонали и повторяет развертку. Количество выполненных разверток в секунду равняется пресловутым 60 Гц –  кадровой синхронизации. Число горизонтальных строк в развертке отличает стандартный NTSC TV (525 строк) от HDTV (1125 строк). Не спрашивайте о плоских экранах или ЖК-дисплеях, так как они работают по-другому, но тоже имеют частоту обновления. Это все, что касается ускоренного курса видеоэлектроники. Завершим его.

Выбор интервала воспроизведения, соответствующего частоте обновления экрана, снижает вероятность помех отображения, делая ваше приложение в целом более надежным. В то же время, когда драйвер дисплея поддерживает мгновенный интервал воспроизведения - т.е. не соответствующий частоте обновления экрана – среда выполнения может обновить сцену несколько раз в течение периода обновления адаптера. Можно сказать, что мы можем получить намного более высокую частоту смены кадров. Выбор осуществляется путем универсального компромисса между скоростью и стабильностью или производительностью против качества. Как обычно, вы должны тестировать, и при завершении тестирования –  тестировать снова.

Мгновенный интервал воспроизведения всегда доступен, но его стоит проверить, чтобы предотвратить взрыв некоторых старых плат. Просто шутка! В настоящее время большинство ПК должны быть в состоянии справиться с ней. Ваше приложение может получить прирост в 10 кадров в секунду за счет него без помех отображения или, при наличии помех, получить такую же частоту кадров, как и при интервале по умолчанию. Интервал воспроизведения по умолчанию, эквивалентный интервалу воспроизведения один, всегда доступен. Перечисление поместит его  вверху списка, на тот случай, если приложение работает в оконном режиме. В данном случае это помогает уменьшить мерцание мыши по сравнению с мгновенным интервалом. Поддержка интервалов 2, 3 и 4 зависит от аппаратного обеспечения, поэтому мы проверяем возможности устройства для них.

И это все для объекта перечисления! Мы имеем полный набор адаптеров, режимов отображения и возможностей устройства, соответствующих требованиям приложения, поэтому мы можем выбирать среди них, чтобы отобразить нашу трехмерную сцену. Этого хватит для части I. Мы на полпути к установке Direct3D, но в первой части слишком много материала. Надеюсь, что это придаст новичкам больше храбрости, чтобы  прочитать ее, и что это всколыхнет существующее положение старых мастеров D3D, вызвав исправления и случайные угрозы убийством.