Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_voprosy_GEK.docx
Скачиваний:
11
Добавлен:
01.04.2025
Размер:
6.7 Mб
Скачать

4 Шага добавления

New (Q);

Q^.Data:=D;

Q^.Next:=L;

L:=Q

Добавление элемента в середину списка

после T^

New(Q);

Q^.Data:=D;

Q^.Next:=T^.Next;

T^.Next:=Q;

перед T^

New(Q);

Q^:=T^;

T^.Data:=D;

T^.Next:=Q;

Удаление элемента из начала списка

Q:=L

L:=Q^.Next;

Dispose(Q);

Перебор элементов списка

Просмотр элементов списка осуществляется последовательно, начиная с первого элемента (головы).

Для перемещения вдоль списка воспользуемся переменной T, которая будет последовательно указывать на элементы списка.

T:=L;

while (T<>nil) do begin

writeln(T^.data);

T:=T^.next;

end;

Анализ списков

Быстро (с константной сложностью) выполняются операции добавления, удаления, объединения списков.

Медленно (с линейной) – обход списка. Перебор элементов возможен только в одном направлении. Если нужен перебор в обратном направлении, используются двунаправленные списки.

  1. Основные компоненты в языках (с, Java, Delphi). Их свойства, методы, события. Реализация графики.

Язык программирования содержит три основных компонента: алфавит, синтаксис и семантику. Эти компоненты определяют правила записи программ. Алфавит языка – это набор символов, которые можно применять в инструкциях языка программирования. Другие символы допустимы только в особых случаях, например в строковых константах. Синтаксис языка определяет правила построения операторов. Семантика – это смысловое содержание операторов языка программирования. Семантические правила определяют действия, описываемые различными операторами, и, в итоге сущность всего алгоритма.

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

Классы объектов

Классы объектов являются шаблонами, определяющими наборы свойств, методы и событий. По этим шаблонам создаются объекты. Каждый из классов обладает специфическим набором свойств, методов и событий.

Экземпляры классов

Объект, созданный по "шаблону" класса объектов, является экземпляром класса и наследует весь набор свойств, методов и событий данного класса. Каждый экземпляр класса имеет уникальное для данного класса имя. Экземпляры обладают одинаковым набором свойств, но значения свойств у них могут отличаться.

Свойства объектов

Семейство объектов представляет собой объект, содержащий несколько объектов, экземпляров одного класса.

Каждая из компонент представляет собой законченную конструкцию, содержащую свойства, методы и события.

Стандартные компоненты VCL инкапсулируют поведение типовых элементов управления операционной системы Windows, как TButton, TListbox и TEdit. В основном они расположены на вкладках Standard и Win95 Палитры компонент.

В отличие от стандартных компонент, оригинальные компоненты представляют собой элементы управления, у которых нет ни метода для собственного отображения, ни заранее определенного поведения (Tpanel,TstringGrid и др.).

Графические компоненты представляют собой видимые элементы управления, которые не могут принять фокус ввода, т.к. не являются оконными (TImage, Tshape и др.).

Невидимые компоненты не появляются на форме в виде каких-либо элементов управления. Поведение невидимых компонент определяется на этапе проектирования, путем инкапсуляции нужных свойств объекта (TOpenDialog, Ttimer и др.).

Frames - позволяет разместить на форме так называемый "фрейм". Фрейм из себя представляет другое окно. Чтобы создать окно-фрейм, следует выбрать пункт меню File -> New -> Frame, либо выделить значок Frame в окне File -> New -> Other на вкладке New. До тех пор, пока в приложении не будет ни одного фрейма, использовать данный объект не удастся. Фреймы удобны в том случае, когда какие-либо настройки запрашиваются во время работы программы в виде отдельной формы, а также, например, на одной из вкладок основной формы. При нажатии на пиктограмму фрейма вам нужно будет выбрать, какой из фреймов, включённых в проект, поставить на форму.

MainMenu - основное меню окна. Связать его с формой можно через свойство Menu формы. При двойном щелчке по значку MenuMenu появляется дизайнер меню, в котором можно добавлять и удалять пункты. В Caption задаётся текст пунта меню. Чтобы создать черту-разделитель, следует в свойство Caption прописать знак "минус" ("-", без кавычек).

Свойства меню:

Images - выпадающий список с выбором компонента типа TImageList, содержащего набор картинок. Если ни одного такого компонента нет на форме - ничего страшного в этом нет. Картинки для пунктов меню можно загрузить по отдельности.

Items - пункты меню. При нажатии на кнопочку с текстом "..." откроется редактор меню. Всегда, когда вы видите такую кнопку, это означает, что при нажатии на неё откроется окно для редактирования свойства.

Name - имя компонента. По имени к компоненту обращаются, так что это очень важное свойство. Компоненту всегда стоит задавать осмысленное имя!

Tag - это свойство не используется по умолчанию и оставлено для замыслов разработчика. Имеется у всех компонентов, визуальных и невизуальных.

Свойства пунктов меню:

Action - выбор из списка метода, созданного с помощью компонента ActionList. Он будет вызываться при выборе пункта меню.

Bitmap - картинка пункта. Отображается слева.

Caption - текст пункта. Пока не задан текст хотя бы у одного пункта меню, оно не будет отображаться на форме. Если заголовок меню состоит из одного символа дефиса (-), в меню будет создан горизонтальный разделитель.

Checked - отметка пункта флагом слева.

Default - выбор, является ли пункт главным. В любом списке пунктов одного уровня меню может быть один главный пункт. При этом он выделяется жирным шрифтом.

Enabled - активность пункта. Если выбрать False, пункт станет неподсвеченным (неактивным).

GroupIndex - номер группы пункта. Разделение на группы нужно для выбора отмеченных пунктов-радиоэлементов. В каждой группе пунктов один может быть один отмеченный пункт. Смотрите примеры.

Hint - подсказка. У меню и его пунктов подсказки не высвечиваются при наведении курсора мыши, в отличие от других компонентов.

ImageIndex - номер картинки из компонента TImageList, используемого главным меню. Если свойство имеет значение -1, картинка не выбрана.

RadioItem - радиоэлемент. В отличие от простых элементов, в одной группе пунктов может быть только один отмеченный радиоэлемент. Пункты-радиоэлементы отмечаются не флажками, а круглыми маркерами.

ShortCut - горячие клавиши. При нажатии на выбранную комбинацию клавиш будет выполняться обработчик нажатия на данный пункт меню.

SubMenuImages - список картинок для подменю (TImageList).

Visible - видимость пункта в меню.

Пункт контекстного меню Insert - вставить новый пункт над текущим.

Пункт контекстного меню Delete - удалить пункт.

Пункт контекстного меню Create Submenu - создать подменю у выделенного пункта.

События пунктов меню:

OnClick - происходит при выборе пункта меню (основной обработчик).

PopupMenu - контекстное меню (вызывается правой кнопкой мыши). Его можно привязать ко многим компонентам (как правило, это делается через свойство PopupMenu у компонента, которому ассоциируется это меню). Одно и то же меню может быть привязано к нескольким компонентам.

Свойства меню:

Alignment - расположение всплывающего меню относительно курсора мыши.

MenuAnimation - анимация меню при показе. Меню "выезжает" с выбранных сторон. Работает только при включенной опции анимации меню в системе.

TrackButton - кнопка мыши, при нажатии которой будет вызываться меню.

Свойства и события пунктов меню. Те же, что и у пунктов главного меню.

Label - текстовая метка (надпись) на форме. Используется для отображения любого текста в окне. Текст задаётся в свойстве Caption. Свойство Font позволяет настроить шрифт текста.

Свойства:

Align - выравнивание внутри компонента-родителя. У многих визуальных компонентов есть это свойство.

Alignment - выравнивание текста внутри метки.

AutoSize - автоматический подгон размера под текст метки.

Caption - текст метки.

Color - цвет фона метки.

Cursor - выбор курсора мыши. Курсор меняется при его наведении на метку.

Enabled - доступность (активность).

Font - шрифт. Свойство является объектом. Структура свойства:

Color - цвет шрифта.

Name - имя шрифта.

Size - размер шрифта в точках.

Style - стиль шрифта. Включая те или иные опции, вы настраиваете вид шрифта.

Опции стиля:

fsBold - жирный шрифт.

fsItalic - наклонный шрифт.

fsUnderline - шрифт с подчёркиванием.

fsStrikeOut - перечёркнутый шрифт.

Height - высота компонента.

Hint - всплывающая при подведении курсора мыши подсказка.

Layout - вертикальное выравнивание текста внутри метки

Left - отступ слева относительно левого края родителя.

PopupMenu - всплывающее меню, которое будет отображаться при нажатии на кнопку мыши (правую или левую, зависит от настроек самого меню).

ShowHint - показывать подсказку или нет. Простой способ быстро убрать подсказку, не меняя её строки.

Top - отступ сверху относительно верхнего края родителя.

Transparent - прозрачность. В том смысле, что у метки будет отрисовываться только текст, без фона. Будет видимо то, что находится под меткой.

Visible - видимость компонента.

Width - ширина компонента.

WordWrap - перенос слов.

События:

OnClick - обработчик щелчка мыши. Щелчок подразумевает нажатие и отпуск кнопки (основной обработчик).

OnDblClick - двойной щелчок мыши.

OnMouseDown - нажатие мыши.

OnMouseMove - срабатывает при движении курсора мыши над компонентом.

OnMouseUp - отпуск нажатой кнопки мыши.

Edit - поле ввода. Используется для ввода любых данных (текста, числа и т.д.), представленных одной строкой. Свойство ReadOnly позволяет запретить редактирование текста в поле. Текст хранится свойством Text. Свойство MaxLength позволяет задать максимальное число символов, которое может быть введено в поле. Значение 0 означает, что ограничение не установлено.

Свойства:

CharCase - регистр вводимых символов. Можно автоматически сменять его на нижний или верхний, или оставлять вводимые данные без изменения.

MaxLength - максимальное количество символов в поле.

PasswordChar - при установке свойства поле будет скрывать введённые символы, вместо них на выводя на экран символ пароля (PasswordChar).

ReadOnly - запрет редактирования содержимого поля.

TabOrder - порядковый номер компонента в списке при переходе по нажатию клавиши TAB.

TabStop - определяет, будет ли компоненту передаваться фокус при переходе по TAB.

Text - текст поля.

События:

OnChange - происходит при изменении текста поля (основной обработчик).

OnEnter - происходит при передаче фокуса компоненту.

OnExit - происходит при потере фокуса компонентом.

OnKeyDown - происходит при нажатии клавиши.

OnKeyPress - также происходит при нажатии клавиши. Отличия будут рассмотрены позже.

OnKeyUp - происходит при отпуске нажатой клавиши.

Memo - многострочный Edit. Используется для ввода больших объёмов текста. Свойство ScrollBars позволяет указать полосы прокрутки, которые будут отображаться у поля при недостатке места для всего текста:

ssNone - без полос прокрутки;

ssHorizontal - горизонтальная полоса прокрутки;

ssVertical - вертикальная;

ssBoth - обе: и горизонтальная, и вертикальная.

Button - кнопка, самая что ни есть обыкновенная. Caption - текст на кнопке.

CheckBox - флажок-переключатель. Состояние хранится в свойстве Style:

cbUnchecked - не отмечен;

cbChecked - отмечен;

cbGrayed - затемнён.

Само состояние следует изменять с помощью свойства Checked. Таких флажков может быть несколько и каждый может быть отмечен независимо от остальных.

Свойства:

Lines - содержимое текстового поля. В отдельном окне откроется мини-редактор для редактирования свойства.

ScrollBars - полосы прокрутки. Можно установить вертикальную, горизонтальную, обе полосы, либо не показывать полосы даже при необходимости прокрутки.

Text - хотя свойства нет в инспекторе объектов, оно позволяет получать и изменять текст поля.

WantTabs - определяет, можно ли пользователю вставлять символы табуляции в текст. Если нельзя, тогда при нажатии TAB будет происходить переход к следующему компоненту в списке Tab Order.

События:

OnChange - (основной обработчик).

Standard - Button

Простая командная кнопка.

Свойства:

Action - выбор метода, созданного с помощью TActionList. Он будет использоваться в качестве обработчика OnClick.

Caption - текст кнопки.

События:

OnClick - (основной обработчик).

Standard - CheckBox

Флаг. Имеет 3 состояния - отмеченный, неотмеченный, затенённый. Третье состояние используется значительно реже первых двух. Обычно используется для указания опций в программе.

Свойства:

Alignment - положение текста флага относительно галочки.

AllowGrayed - разрешить затенённое состояние флага.

Caption - текст флажка.

Checked - определяет, отмечен флаг или нет.

State - состояние флажка.

События:

OnClick - (основной обработчик).

RadioButton - радио-переключатель. Аналогичен CheckBox, но при наличии нескольких переключателей может быть выбран только один из них. Свойство Checked позволяет изменить состояние переключателя.

Свойства:

Alignment - положение текста относительно маркера.

Caption - текст радиокнопки.

Checked - определяет, выбрана эта кнопка или нет. В группе может быть выбрана только одна кнопка. В группу входят все кнопки с одним родителем.

События:

OnClick - (основной обработчик).

ListBox - список текстовых строк. Используется для выбора одного из вариантов. Строки задаются в свойстве Items. Чтобы изменить исходные значения, следует щёлкнуть по кнопке с тремя точкам ("...") в строке свойства Items и в открывшемся редакторе ввести требуемые значения. Свойство MultiSelect позволяет включить/выключить одновременный выбор нескольких строк из списка.

Свойства:

Columns - определяет число колонок в списке, которое будет отображаться без необходимости прокрутки. Если заданного числа колонок не хватает, оно будет увеличено до необходимого. Если свойство равно 0, то все элементы будут отображаться в одну колонку с вертикальной прокруткой.

ExtendedSelect - возможность выделять диапазон элементов списка сразу, зажимая Shift. Не работает без свойства MultiSelect = True.

ItemIndex - индекс выделенного элемента списка. Элементы нумеруются с нуля. В инспекторе свойства нет.

Items - элементы списка. Задаются в мини-редакторе.

MultiSelect - возможность выделять несколько произвольных элементов списка, зажимая Ctrl.

Sorted - свойство указывает, будет ли компонент автоматически сортировать список при добавлении или изменении элементов. Когда вы устанавливаете свойство в True, список сразу сортируется.

События:

OnClick - (основной обработчик)

ComboBox - ещё один список для выбора, но выпадающий - на экране видна всего одна строка, а сам список появляется при нажатии на кнопку со стрелкой. Установив свойство Style в csDropDownList можно запретить ввод произвольного значения в ComboBox. Текст выбранной строки доступен в свойстве Text.

Свойства:

DropDownCount - высота (в элементах списка) списка при раскрытии.

Items - список строк, содержащихся в ComboBox. Редактируется в мини-редакторе.

MaxLength - максимально возможное количество символов в поле ввода.

Style - стиль выпадающего списка. Чаще всего используются 3 значения этого свойства:

csDropDown - вы можете выбрать элемент из списка, но и ввод данных в текстовое поле возможен.

csDropDownList - вы можете только выбрать уже имеющийся элемент из списка. В текстовое поле ввести что-либо нельзя.

csSimple - при установке этого значения список выполняет роль Edit. Возможность выбора из выпадающего списка отсутствует.

Text - какой бы ни был выбран стиль списка, свойство всегда возвращает то, что находится в текстовом поле.

События:

OnChange - (основной обработчик)

OnDropDown - происходит, когда пользователь вызывает список нажатием на кнопку.

ScrollBar - Полоса прокрутки. Вставляется внутрь компонента, у которого необходимо обеспечить прокрутку. Пригодится в том случае, если компонент не умещается на форме.

Standard - GroupBox

Группа. Компонент предназначен для группировки других компонентов внутри себя.

Свойства:

Caption - заголовок группы.

События:

OnClick - (основной обработчик)

GroupBox - "контейнер" для компонент. Используется для объединения элементов в отдельные области. При перемещении GroupBox'а все компоненты, расположенные на нём, также перемещаются. Для размещения компонент в этом контейнере следует после выбора их на Палитры компонент щёлкнуть по самому контейнеру (а не по форме, как обычно). У GroupBox можно задать текст заголовка (свойство Caption).

RadioGroup - группа из нескольких RadioButton'ов. Тексты строк задаются в свойстве Items. Номер выбранной строки - свойство ItemIndex (нумерация строк начинается с нуля!).

Внешне она похожа на смесь GroupBox и ListBox с радиокнопками. Внутри группы располагается список радиокнопок.

Свойства:

Caption - заголовок группы.

Columns - число колонок, используемых для отображения списка.

ItemIndex - индекс выделенной кнопки. Нумерация осуществляется с 0. -1 означает отсутствие выделенного элемента.

Items - список заголовков радиокнопок. Редактируется в мини-редакторе. Сами кнопки создаются автоматически.

События:

OnClick - (основной обработчик)

Panel - практически такой же контейнер, что и GroupBox, однако без заголовка и с возможностью отключения рельефных границ.

Панель. Может служить либо для отрисовки текста (встроенная возможность), либо контейнером для других компонентов.

Свойства:

AutoSize - подгон размеров под содержимое панели. Под содержимым подразумеваются дочерние компоненты, а не текст.

BevelInner, BevelOuter - стиль внутренней и внешней рамок панели. Настраивая эти свойства, вы можете добиться приподнятого или вдавленного вида панели.

BevelWidth - ширина рамок панели в пикселях.

BorderStyle - стиль границы. Либо её нет, либо она есть!

BorderWidth - расстояние между внешней и внутренней рамкой в пикселях.

Caption - текст панели.

События:

OnClick - (основной обработчик)

ActionList - компонент для создания и централизованного управления методами, ассоциируемыми с обработчиками событий компонентов.

Позволяет управлять действиями (Actions), которые привязываются к пунктам меню, кнопкам и т.д.

Библиотека Swing является основной для большинства современных графических приложений Java. В ней предлагаются следующие компоненты (перечислены в том порядке, в каком они возникают впалитре компонентов):

Таблица 2.6.

Компонент

Назначение компонента

1

JLabel

"Метка" - вывод однострочного неформатированного текста

2

JButton

"Кнопка" - кнопка с текстом и/или с картинкой

3

JToggleButton

"Защелкивающаяся кнопка" - кнопка с фиксацией. Может быть одной из нескольких таких кнопок в группе, в этом случае нажатие одной кнопки вызывает отпускание другой. Работа группы обеспечивается компонентом ButtonGroup, который должен быть перетащен на форму, а затем назначен свойству buttonGroup.

4

JCheckBox

"Чекбокс" - пункт выбора с независимой фиксацией.

5

JRadioButton

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

6

ButtonGroup

Обеспечивает работу групп компонентов JToggleButton или JradioButton.

7

JComboBox

"Комбобокс" - выпадающий список.

8

JList

Прокручивающийся список.

9

JTextField

"Текстовое поле" - однострочный пункт ввода и редактирования текста.

10

JTextArea

"Текстовая область" - многострочный пункт ввода и редактирования текста.

11

JPanel

"Панель" - группирующий компонент, позволяющий располагать на себе другие компоненты. Передвижение панели перемещает вместе с ней все расположенные на ней компоненты. По умолчанию свойство layout ("размещение") установлено как FlowLayout - "в виде потока". Для простых задач вместо этого компонента лучше использоватьJLayeredPane.

12

JTabbedPane

"Панель с закладками" - каждый положенный на нее компонент показывается в отдельной закладке. Чтобы разместить на одной закладке несколько компонентов, сначала положите на панель с закладками обычную панель. Для того, чтобы создать последующие закладки, выделите панель с закладками, вызовите правой кнопкой мыши всплывающее меню, пункт Add From Palette ("добавить из палитры"), и добавьте еще одну панель или другой компонент.

13

JScrollBar

Независимая полоса прокрутки. Используется редко - для программно управляемой прокрутки содержимого компонентов, для которых отсутствуют встроенные полосы прокрутки.

14

JScrollPane

"Панель с полосами прокрутки"

15

JMenuBar

"Меню формы" - предназначено для расположения в нем компонентов типа JMenu (заголовков меню).

16

JPopupMenu

"Всплывающее меню" - предназначено для расположения в нем компонентов типа JMenuItem (пунктов меню).

17

JSlider

"Ползунок". Используется для плавной регулировки числовых величин, а также связанных с ними программно регулируемых изменений.

18

JProgressBar

"Прогрессбар" - полоса показа доли выполнения задачи. Показывает уровень, отражающий долю выполнения задачи

19

JSplitPane

"Панель с разделителем" - панель, состоящая из двух частей, между которыми имеется линия разделителя, которую можно перетаскивать мышью, меняя взаимный размер частей.

20

JFormattedTextField

"Поле ввода форматированного текста"

21

JPasswordField

"Поле ввода пароля" - вводимый текст отображается звездочками.

22

JSpinner

"Спиннер" - поле ввода числа с кнопками увеличения/уменьшения.

23

JSeparator

"Сепаратор" - разделительная линия. Используется в декоративных целях для разделения рабочих областей формы и других группирующих компонентов.

24

JTextPane

"Текстовая панель". По умолчанию автоматически переносит текст на новую строку. А не располагает в одну строку с показом горизонтального скроллера, как это делаетJTextArea.

25

JEditorPane

"Панель текстового редактора"

26

JTree

"Дерево" - показывает дерево, в котором каждая ветвь может быть с иконками и текстом, а узлы разворачиваются и сворачиваются.

27

JTable

"Таблица" - показ текстовой таблицы. Имеет возможность заполнения значениями по умолчанию на этапе проектирования.

28

JToolBar

"Тулбар" - панель инструментов. Обычно на нем размещают кнопки JToggleButton, для которых назначены иконки.

29

JInternalFrame

"Дочернее окно" - окно многооконного приложения. Его можно перемещать в пределах родительского окна - главного окна приложения. В настоящее время такой стиль приложений практически не используется.

30

JLayeredPane

"Панель с абсолютным позиционированием элементов"

31

JDesktopPane

"Панель - рабочий стол". Еще один тип панели с абсолютным позиционированием элементов.

32

JOptionPane

"Диалоговая панель" - предназначена для показа диалоговых форм. В отличие от большинства других компонентов работа идет с помощью методов класса. Имеются вызовы диалогов:

  • С сообщением:

  • javax.swing.JOptionPane.showMessageDialog(null, "Кнопку нажали");

JOptionPane.showMessageDialog(null,"Привет!", "Заголовок сообщения", JOptionPane.INFORMATION_MESSAGE);

  • С подтверждением:

int option=javax.swing.JOptionPane.showConfirmDialog(null,"Продолжить?");

Проверка, какую кнопку нажали или диалог закрыли без осуществления выбора, осуществляется сравнением с константами javax.swing.JOptionPane.NO_OPTION, CANCEL_OPTION, CLOSED_OPTION, OK_OPTION, YES_OPTION

  • С предложением ввести значение:

String input=javax.swing.JOptionPane.showInputDialog(null,"Введите значение:");

- при отказе от ввода возвращается null.

Первый параметр - имя формы, в которой показывается диалог. Если он null - используется форма по умолчанию (главная форма приложения).

Существуют варианты указанных выше методов, позволяющие при вызове задавать дополнительные параметры диалога (заголовок, надписи на кнопках и др.).

33

JColorChooser

"Диалог выбора цвета" - предназначен для выбора пользователем цвета.

34

JFileChooser

"Диалог выбора файла" - предназначен для выбора пользователем файлов. Перед использованием требуется положить его на какую-нибудь диалоговую форму ( JDialog, JFrame) или какой-нибудь группирующий компонент формы.

35

JFrame

"Экранная форма". Показывается вызовом вида jFrame1.setVisible(true) ;

36

JDialog

"Диалоговая форма". Показывается вызовом вида jDialog1.setVisible(true) ;

Графика

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

OpenGL

Данный API основан на стандарте IRIS GL, разработанном корпорацией Silicon Graphics Incorporated (SGI). Окончательно спецификация оформилась в 1992 году (30 июня был выпущен релиз версии 1.0). В OpenGL (Open Graphics Library – Открытая Графическая Библиотека) закладывалась идея создания аппаратно-независимого интерфейса, то есть единожды написанные программы могли бы без проблем работать на различных платформах. Долгое время развитием OpenGL занимался Architectural Review Board (ARB – Комитет Пересмотра Архитектуры), куда входят такие известные компании как 3D Labs, SGI, Apple, nVIDIA, ATi, Intel, id Software, Microsoft. Однако два года назад ввиду замедлившегося развития OpenGL и проблем с устаревшими стандартами дальнейшее развитие и выпуск нового стандарта OpenGL 3.0, поддерживающего все новейшие достижения компьютерной графике, был доверен промышленному консорциуму Khronos Group. Выпуск нового стандарта задерживался по всевозможным причинам и, в конце концов, произошел только на исходе 2008 года. До сих пор нельзя утверждать, что данный стандарт хоть сколько-нибудь прижился. Однако разработчики графического железа вышли из положения, создав extensions (расширения) для получения доступа к новым функциям.

Открытая Графическая Библиотека нашла свое применение во многих областях (не только игровой индустрии), и уже 18 лет остается востребованной.

DirectX

Данная библиотека является изобретением компании RenderMorphic, приобретенным Microsoft. Потребность в дополнительном графическом API возникла из-за изначальной ограниченности программирования игр под Windows 95 (а вернее, из-за медленной обработки мультимедийных данных). Поначалу Game Software Development Kit (Game SDK) позиционировался, как «идеальное решение для создания игр». Конечно же, DirectX 1.0 (впрочем, как и 2, и 3) не мог конкурировать с OpenGL, и поначалу это была медленная, сложная и обладавшая множеством недочетов и дисфункций библиотека. Продвижение DirectX началось с седьмой версии, когда реализация интерфейсов между программной и аппаратной частью стала быстрее и удобнее в программировании. Сейчас DirectX является достаточно мощной и стабильной (причем по большей части ее пишут программисты, работающие над Windows). Следует отметить, что исторически библиотеки решают одну и ту же задачу – упрощение программирования графики, причем в основу их разработки были положены одна и та же идея – реализация промежуточного слоя, способного воспринимать относительно простые программные команды и передавать их по стеку устройств и интерфейсов видеокарте. На настоящий момент обе библиотеки являются мощными разработками с равным потенциалом. Поэтому для определения различий более подробно рассмотрим принципы их работы.

Основные принципы работы графических библиотек

OpenGL

OpenGL с самого начала позиционировался исключительно как графическая библиотека. Основой для этой API является ядро, которое в состоянии обрабатывать примитивные объекты (как правило, треугольники). Программный интерфейс библиотеки содержит большое количество (порядка нескольких сотен) процедур и функций, необходимых для создания высококачественных графических изображений. Чтобы аппаратно реализовать многие сложные функции (например, antialiasing или texturing) от видеокарты требуется наличие framebuffer’а (кадровый буфер), причем некоторые операции могут выполняться исключительно в нем. Базовая схема реализации сложных операций показана далее на рисунке 2.

Рисунок 2. Общая схема работы графической библиотеки OpenGL.

На рисунке 1 показаны основные компоненты графической библиотеки OpenGL и их взаимодействие. Для работы с библиотекой программа сначала должна открыть окно во framebuffer (где будет происходить все операции), и потом уже контекст библиотеки связывается с этим окном. Такую операцию нужно проделать один раз, а далее все действия определяются через параметры обработки (рисование простых геометрических объектов: линии, точки, полигоны; рендеринг примитивов, включая их положение и цвет).

Для разработчика процессора видеокарты OpenGL является набором команд, которые влияют на работу графического железа. Если в наличии имеется только адресуемый framebuffer, то библиотека должна быть встроена в GPU. Чаще же плата содержит еще и графический ускоритель (состоящий из растровой подсистемы, которая занимается рендерингом 2D линий и полигонов). Графические процессоры способны лишь просчитывать и трансформировать геометрические данные (аналог элементарных операций, с которыми умеет работать обычный CPU – сложение и присваивание). Задачей создателя графической платы является разработка программного интерфейса GPU для разделения обработки команд OpenGL между GPU и остальным графическим железом. Такое деление должно быть специально оптимизировано под выполнение команд библиотеки.

Сама же библиотека реализована в виде информации о структуре, определяющей, как объекты будут нарисованы во framebuffer, причем некоторые из структур доступны пользователю, который может создавать различные вызовы процедур для изменения параметров.

Чуть выше были рассмотрены основные принципы работы библиотеки, далее будет рассмотрен простой пример – рисование текстурированной пирамиды средствами OpenGL. Для этого требуется базовые понятия, требующиеся для выполнения этой задачи:

  • Vertex (вершины) – образуются после указания координат в 2-х, 3-х или 4-мерном пространстве. В случае данного примера задаются четыре координаты в 3D пространстве, которые обозначают вершины фигуры.

  • Vertex Arrays (массив вершин) – для работы с множеством вершин требуется обрабатывать большое количество команд (для образования простых геометрических фигур), чтобы избежать ненужной вычислительной нагрузки существует объединение вершин. В данном случае из них образуется массив, который содержится в памяти. Для работы с пирамидой в целом вершины объединяются под единым именем.

  • Buffer Objects (буферные объекты) – если требуется сохранить данные (те же Vertex Arrays) в быстрой памяти видеоадаптера для последующего повторного использования, существуют Buffer Objects, которые осуществляют распределение, инициализацию и извлечение информации об объекте из памяти.

  • Evaluators – средства для множественных преобразования координат и цвета. После создания четырех вершин определяются команды для обработки (которые записываются в Display List) и проводятся усреднения и просчет геометрической поверхности (на этом шаге уже появляется каркас объекта).

  • Coordinate Transformation (трансформация координат) – все объекты перед выводом во framebuffer претерпевают изменение своих координат (из их программного представления в «оконное» для framebuffer), схема такого преобразования представлена на рисунке 2. Причем в этот момент происходит подготовка к растеризации (обрезаются лишние части фигуры, которые вылезают за экран).

Рисунок 3. Выполнение растеризации и интерполяции графической библиотекой OpenGL.

  • Rasterization – процесс, в котором вся картинка преобразовывается к 2D виду. Растеризатор обрабатывает объект, раскрашивает его, накладывает текстуру, и на выходе получается кадр, который далее поступает во framebuffer, а уже оттуда на монитор. То есть видно, что программист последовательно определяет только основные параметры для той или иной операции. Дальнейшее происходит без его участия, средствами библиотеки, драйвера и, наконец, видеоадаптера.

  • FrameBuffer (кадровый буфер) – некая область памяти для временного хранения информации о точках, составляющих один кадр изображения на мониторе. Открыть окно во framebuffer – это значит распределить видеопамять под изображение.

DirectX

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

Так же как и OpenGL, DirectX на низком уровне взаимодействует с аппаратной частью компьютера и предоставляет управляющей среде верхнего уровня набор интерфейсов для обработки графики, однако большим отличием от конкурента является использование Component Object Model (COM). То есть для работы с изображением нужно не просто вызвать определенную функцию или процедуру, а провести еще ряд дополнительных манипуляций для получения доступа к объектам (работа с которыми происходит только через интерфейсы), а после этого каждому объекту нужно заполнить некий набор необходимых свойств, без которых он является неопределенным. После компиляции программы команды на обработку графики для драйвера и видеокарты идут последовательно, вне зависимости от того, как было создано приложение.

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

Рисунок 3. Пошаговое выполнение отображения объекта в графической библиотеке DirectX.

На аппаратном уровне API выполняется следующим образом: D3D обеспечивает независимость от Hardware Abstraction Layer (HAL – аппаратный уровень абстракции). HAL – это аппаратно-зависимый интерфейс, не поддерживающий эмуляции, который разрабатывается компанией-производителем видеоадаптера и включает в себя поддержку D3D. В данном случае Microsoft описала, как должна быть реализована D3D аппаратно, а уже компании-производители реализуют нужные функции в своих чипах. В результате складывается ситуация, при которой программа ничего не знает об установленном оборудовании и напрямую с ним не взаимодействует. Это имеет свои плюсы и свои минусы. Главный плюс – высокий уровень абстракции от оборудования, что является одной из самых желанных концепций, используемых в программировании вообще. А минус – может возникнуть потребность опроса видеокарты на предмет наличия поддержки графически сложных функций. В рамках данной работы таких функций выполнять не потребуется ввиду относительной простоты модели, поэтому наличие HAL дает только положительный эффект.

HAL может содержать три разных типа модели обработки вершин (на одном устройстве) – программный, аппаратный (который зависит от конкретного устройства) и смешанный. Аппаратный тип поддерживает только обработку вершин и дает возможность небольших изменений состояния устройства по запросу приложения. Кроме использования возможностей видеокарты, DirectX в полной мере пользуется инструкциями AMD 3DNow! и Intel Pentium SIMD (Simple Instruction Multiple Data, одна команда – много данных), которые включены в обработку некоторых вершинных шейдеров.

Для создания сцены потребуется инициализировать D3D объект для рисования, включая создание объекта, указание параметров отображения, создание D3D устройства, причем в параметрах устройства можно указать способ обработки вершин – аппаратный или программный. Далее производятся похожие с OpenGL преобразования, но с учетом того, что все операции работают над объектами. При завершении программы нужно закрыть устройство, но на деле этот процесс все же выглядит немного сложнее. В рамках данной работы не будут рассмотрены столь детальные подробности, поскольку завершение программы не влияет на впечатление пользователя от скорости и динамики отображения модели. Исходя их этого факта, можно достаточно либерально отнестись к корректности и быстроте завершения программы, тем более что в рамках managed-языков программирования это не так актуально.

Рисунок 4. Отображение фигуры по ее вершинам и соединениям между ними в графической библиотеке DirectX.

В новых версиях DirectX появились дополнительные возможности, увеличивающие реалистичность графики:

  • HLSL (High-Level Shader Language – Высокоуровневый Язык Шейдеров) – позволяет управлять потоком команд;

  • Контроль над выполнением шейдеров;

  • Взаимодействие с GDI (Graphics Device Interface);

  • Поддержка замещающих карт (Displacement mapping) – изменение координат полигона;

  • Поддержка 40-битного цвета (более 1.0 млрд. цветов).

Pixel Shaders – это небольшие подпрограммы (выполняются на графическом процессоре), которые работают с каждым пикселем при создании текстуры и применяются для просчета света, создания различных эффектов. В самой библиотеке OpenGL они отсутствуют по причине того, что, когда создавалась спецификация, шейдеры еще не были придуманы, и поэтому они были включены в виде расширений.

!!!6 вопрос отсутствует в билетах!!!

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]