Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 889 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 11:

Выбор подходящего устройства в DirectX

Аннотация: В лекции рассматривается работа адаптеров устройств в DirectX. Свопинг-связки и рендеры. Форматы вторичных буферов и дисплеев. Проверка возможностей устройства.

Файлы к лабораторной работе Вы можете скачать здесь.

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

  1. Поиск всех адаптеров в системе
  2. Перечисление форматов, поддерживаемых для каждого устройства
  3. Возможности и свойства рассматриваемых устройств

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

Создание приложения

  • Создайте новый проект для C# с именем AdapterView


  • Добавьте в проект ссылки на сборки DirectX командой Project/Add Reference

  • Удалите из проекта ненужные в данный момент ссылки


  • Откройте файл 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 битами.