Выбор подходящего устройства в DirectX
Файлы к лабораторной работе Вы можете скачать здесь.
Иногда возникает необходимость предусмотреть в приложении Direct3D возможность определения количества и типа установленных на компьютере видеоадаптеров для выбора наиболее оптимального режима работы приложения. В сборках DirectX существует статический класс Manager, который можно использовать для идентификации адаптеров и имеющихся в системе устройств. В данной работе мы рассмотрим
- Поиск всех адаптеров в системе
- Перечисление форматов, поддерживаемых для каждого устройства
- Возможности и свойства рассматриваемых устройств
В нашем случае под адаптером мы будем подразумевать отдельное аппаратное устройство компьютерной графики, соединяемое с монитором. Мы напишем простое приложение для C#, которое отобразит на экране разветвленную схему, включающую список текущих адаптеров используемого компьютера и поддерживаемых ими режимов отображения.
Создание приложения
- Создайте новый проект для C# с именем AdapterView
- Удалите из проекта ненужные в данный момент ссылки
- Откройте файл Form1.cs в режиме View Code и отредактируйте блок директив "using" в заголовке файла для добавленных сборок, чтобы это выглядело так
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace AdapterView { .................................. }Листинг 11.1. Начало файла Form1.cs
- Откройте файл Form1.cs в режиме View Designer и поместите на форму двойным щелчком из вкладки Widows Forms панели Toolbox компонент TreeView
- Выделите компонент TreeView и через панель Properties установите его свойство Dock в значение Fill
Теперь необходимо добавить функцию, которая сканирует все адаптеры в системе и выдает некоторую информацию относительно поддерживаемых режимов каждого из них.
- Добавьте в конец класса Form1 после функции Main() следующий код
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); } }Листинг 11.2. Функция чтения видеопараметров, поддерживаемых системой
Функция LoadGraphics() во внешнем цикле ведет поиск всех адаптеров в системе, заполняя для каждого найденного адаптера экземпляр ai класса AdapterInformation
Значение свойства Adapter относится к номеру адаптера, который используется при создании устройства. Порядковые номера адаптеров в системе отсчитываются с нуля. Функция GetWhqlInformation() возвращает дополнительную информацию о WHQL (Лаборатория по сертификации аппаратных средств для работы в среде Windows). Извлечение информации о WHQL может быть долгим, поэтому в приложении для Direct3D лучше эту возможность не использовать.
Свойство CurrentDisplayMode содержит информацию о возможностях текущего режима работы используемого адаптера, включая ширину и высоту визуального отображения, а также частоту обновления и используемый формат. Свойство SupportedDisplayModes содержит список всех режимов визуального отображения, на которые способен найденный адаптер.
Вначале мы создаем корневую папку древовидного списка root в качестве нулевого уровня дерева списка. Затем мы добавляем в качестве первого уровня дерева папку, которая будет включать имя драйвера и номер версии. На следующем уровне мы добавляем папку, в которую сохраняем текущие параметры режима визуального отображения адаптера. В дочерних узлах сохраняем данные о поддерживаемом формате и режимах найденного адаптера.
- Измените функцию Main() так, как показано ниже, чтобы обеспечить вызов функции LoadGraphics()
static void Main() { using(Form1 frm = new Form1()) { frm.LoadGraphics(); Application.Run(frm); } }Листинг 11.3. Измененная функция Main()
- Постройте приложение и получите информацию о графических фозможностях вашей системы. Результат должен быть примерно таким
В окне приложения отображается список режимов и форматов, поддерживаемых устройством. Перечисляемые форматы описываются с помощью буквенно-цифрового кода. Символ представляет тип данных, номер - число битов поддерживаемых данных. Символы расшифровываются так:
- A (alpha) - альфа-канал (прозрачность)
- X (unused) - неиспользуемый
- R (red) - красный
- G (green) - зеленый
- B (blue) - синий
- L (luminance) - яркость
- P (palette) - палитра
Сумма всех битов в формате определяет полный размер формата. Например, X8R8G8B9 означает 32-разрядный формат с 8 битами для каждого цвета экранной модели цветов RGB и с неиспользованными 8 битами.