| Китай |
Выбор подходящего устройства в 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 битами.





