netlib.narod.ru< Назад | Оглавление | Далее >

Перечисление установленных видеокарт

Сегодня многие системы позволяют подключить к компьютеру несколько мониторов. Не став в полном смысле общепринятым, использование нескольких мониторов весьма полезно и быстро набирает популярность. Появление видеокарт со встроенной поддержкой подключения нескольких мониторов позволяет ожидать, что эта возможность будет использоваться более часто. Последние видеокарты ATI, nVidia и Matrox имеют два выхода для подключения мониторов, что позволяет подключать несколько мониторов к одной видеокарте.

Устройства Direct3D привязываются к адаптерам. В данном случае вы можете думать об адаптере, как о графическом оборудовании, подключенном к монитору. Например, ATI Rageon 9700 физически представляет собой одну видеокарту, но у нее два выхода для подключения мониторов (DVI и VGA) и, следовательно, в Direct3D она представлена как два адаптера. Вы не можете знать сколько и каких устройств установлено на тех компьютерах, где будет запускаться ваша игра, так как обнаружить их и выбрать необходимое?

В сборках Direct3D есть статический класс с именем Manager, который легко можно использовать для перечисления адаптеров и информации об устройствах, а также для получения сведений о возможностях доступных системе устройств.

Самое первое свойство в классе Manager — это список адаптеров вашей системы. Это свойство можно использовать по-разному. Оно хранит счетчик, сообщающий об общем количестве адаптеров в системе. Каждый адаптер может индексироваться непосредственно (например, Manager.Adapters[0]), а кроме того вы можете использовать перечисление для перебора всех адаптеров вашей системы.

Для демонстрации этих возможностей напишем простое приложение, создающее древовидное представление установленных в вашей системе адаптеров и поддерживаемых ими видеорежимов. Загрузите Visual Studio и выполните следующие действия:

  1. Создайте новый проект Windows Forms на C#. Можете назвать его как хотите; пример на сопроводительном CD-ROM называется Enumeration.

  2. Добавьте ссылки на сборки Microsoft.DirectX.Direct3D и Microsoft.DirectX. Также добавьте инструкции using для этих сборок.

  3. В окне проектирования формы добавьте к форме вашего приложения элемент управления TreeView. Он находится на панели инструментов.

  4. Выберите добавленный к вашей форме элемент управления TreeView и нажмите клавишу F4 (или щелкните по нему правой кнопкой мыши и в контекстном меню выберите команду Properties). В окне свойств элемента управления TreeView присвойте параметру Dock значение Fill. Благодаря этому ваш элемент управления будет занимать всю область окна, даже когда размеры окна изменяются.

Теперь вы должны добавить функцию, которая просканирует все адаптеры системы и предоставит информацию о поддерживаемых каждым из них режимах. Эту работу выполняет представленная ниже функция, так что добавьте ее в ваш класс:

/// <summary>
/// Здесь мы заполняем наше дерево
/// </summary>
public void LoadGraphics()
{
    foreach(AdapterInformation ai in Manager.Adapters)
    {
        TreeNode root = new TreeNode(ai.Information.Description);

        TreeNode driverInfo = new TreeNode(string.Format
            ("Driver information: {0} - {1}",
            ai.Information.DriverName,
            ai.Information.DriverVersion) );

        // Добавляем информацию о драйвере к корневому узлу
        root.Nodes.Add(driverInfo);

        // Получаем поддерживаемые видеорежимы
        TreeNode displayMode = new TreeNode(string.Format
            ("Current Display Mode: {0}x{1}x{2}",
            ai.CurrentDisplayMode.Width,
            ai.CurrentDisplayMode.Height,
            ai.CurrentDisplayMode.Format));

        foreach(DisplayMode dm in ai.SupportedDisplayModes)
        {
            TreeNode supportedNode = new TreeNode(string.Format
                ("Supported: {0}x{1}x{2}",
                dm.Width, dm.Height, dm.Format));

            displayMode.Nodes.Add(supportedNode);
        }
        // Добавляем видеорежимы
        root.Nodes.Add(displayMode);
        // Добавляем корневой узел
        treeView1.Nodes.Add(root);
    }
}

Хотя фрагмент кода может показаться достаточно большим, его работа проста. Давайте разделим его, чтобы ясно видеть, что происходит. Сперва мы начинаем перечисление адаптеров системы. Механизм foreach, используемый в C#, делает этот цикл удивительно простым. Для каждого адаптера системы цикл выполняется один раз и заполняет структуру AdapterInformation относящейся к данному адаптеру информацией.

Взглянув на структуру AdapterInformation вы увидите, что в ней есть несколько членов:

public struct AdapterInformation
{
    int                   Adapter;
    DisplayMode           CurrentDisplayMode;
    AdapterDetails        Information;
    AdapterDetails        GetWhqlInformation();
    DisplayModeEnumerator SupportedDisplayModes;
}

Член Adapter содержит порядковый номер адаптера, который вы используете при создании устройства. Порядковые номера начинаются с нуля и их количество равно количеству адаптеров в вашей системе. Два члена возвращают идентичные структуры AdapterDetails с одним исключением. В члене Information не возвращаются детализированные сведения о сертификации аппаратных средств (Windows Hardware Quality Labs, WHQL), которые позволяет получить функция GetWhqlInformation. Получение детализированной информации может быть весьма ресурсоемким и долгим, поэтому оно выделено в отдельный параметр.

Структура AdapterDetails содержит много информации о самом адаптере, включая его описание и сведения о драйвере. Приложения могут использовать эту структуру, чтобы принимать решения, основываясь на наличии определенных аппаратных средств, хотя это не должно быть необходимо.

Оставшиеся два члена возвращают структуры DisplayMode. Эти структуры могут использоваться для определения различных видеорежимов и включают ширину и высоту изображения для данного видеорежима, частоту кадров и используемый формат. Член CurrentDisplayMode возвращает информацию о режиме, установленном для адаптера в данный момент, а SupportedDisplayModes возвращает список всех видеорежимов, поддерживаемых данным адаптером.

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

Затем к узлу текущего видеорежима мы добавляем дочерние узлы для каждого видеорежима, поддерживаемого адаптером. Теперь нам осталось только вызвать эту функцию во время работы нашего приложения. Измените функцию Main следующим образом:

using (Form1 frm = new Form1())
{
    frm.LoadGraphics();
    Application.Run(frm);
}

Запустив приложение вы увидите окно, показанное на рис. 2.1.


Рис. 2.1. Дерево режимов адаптеров

Рис. 2.1. Дерево режимов адаптеров


Как видите, список содержит поддерживаемые устройством форматы. Эти форматы могут использоваться для вторичных буферов при заполнении структуры параметров показа. Перечисление форматов следует шаблону именования. Шаблон состоит из одной буквы, за которой следует число. Буква обозначает тип данных; число — это количество бит, занимаемых этими данными. Вот некоторые из используемых символов:

Общая сумма битов формата определяет полный размер формата. Например, формат X8R8G8B8 (присутствующий на рис. 2.1) является 32-разрядным форматом, где для красной, зеленой и синей составляющих используется по 8 бит, а оставшиеся 8 бит не используются.

ФОРМАТЫ ДЛЯ ВТОРИЧНЫХ БУФЕРОВ И ДИСПЛЕЯ
Хотя список форматов очень велик, лишь несколько из них могут использоваться в качестве формата для вторичных буферов или дисплея. Для вторичных буферов допустимы следующие форматы:
A2R10G10B10      A1R5G5B5
A8R8G8B8         X1R5G5B5
X8R8G8B8         R5G6B5
Для дисплея могут использоваться те же форматы, что и для вторичного буфера, за исключением тех форматов, где есть альфа-компонента. Единственный формат с альфа-компонентой, который может использоваться для дисплея, это A2R10G10B10, но и то, только в полноэкранном режиме.
Обратите внимание, что хотя эти форматы и считаются в Direct3D допустимыми форматами вторичного буфера, ваша видеокарта может не поддерживать их. В рассматриваемом нами примере поддерживаются только форматы X8R8G8B8 и R5G6B5.

Итак, мы собрали достаточно информации, чтобы определить порядковый номер адаптера для создаваемого устройства, а также поддерживаемый формат вторичного буфера. А как быть с другмим параметрами конструктора устройства? К счастью, все необходимое есть в классе Manager.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz