Этот раздел может содержать материал, не относящийся к теме статьи . ( Январь 2024 г. ) |
Список отображения , также называемый списком команд в Direct3D 12 и буфером команд в Vulkan , представляет собой ряд графических команд, чтобы их можно было запустить позже, когда список будет выполнен. [1] Системы, которые используют функциональность списка отображения, называются системами с сохраненным режимом , в то время как системы, которые этого не делают, называются системами с непосредственным режимом . В OpenGL списки отображения полезны для перерисовки одной и той же геометрии или многократного применения набора изменений состояния. [2] [3] Это преимущество также используется со списками команд пакета Direct3D 12. В Direct3D 12 и Vulkan списки отображения регулярно используются для покадровой записи и выполнения.
Векторные мониторы или каллиграфические дисплеи 1960-х и 1970-х годов использовали отклонение электронного луча для рисования отрезков линий , точек и иногда кривых непосредственно на экране ЭЛТ . Поскольку изображение немедленно исчезало, его нужно было перерисовывать много раз в секунду ( электронно-лучевые трубки с запоминающей трубкой сохраняли изображение до тех пор, пока оно не гасло, но они были непригодны для интерактивной графики). Для обновления дисплея использовался специальный ЦП, называемый процессором дисплея или блоком обработки дисплея (DPU), который имел буфер памяти для «списка отображения», «файла отображения» или «программы отображения», содержащих координаты отрезка линии и другую информацию. Расширенные процессоры отображения также поддерживали инструкции потока управления , которые были полезны для рисования повторяющейся графики, такой как текст, а некоторые могли выполнять преобразования координат , такие как 3D-проекция . [4] [5]
Одной из самых ранних систем с настоящим списком отображения были 8-битные компьютеры Atari . Список отображения (на самом деле так называемый в терминологии Atari) представляет собой ряд инструкций для ANTIC , видеосопроцессора, используемого в этих машинах. Эта программа, хранящаяся в памяти компьютера и выполняемая ANTIC в реальном времени, может указывать пустые строки, любой из шести текстовых режимов и восьми графических режимов, какие разделы экрана могут быть прокручены по горизонтали или вертикали, и вызывать прерывания списка отображения (называемые растровыми прерываниями или HBI в других системах). [6]
Семейство Amstrad PCW содержит функцию Display List, называемую «Roller RAM». Это область ОЗУ размером 512 байт, состоящая из 256 16-битных указателей в ОЗУ, по одному на каждую строку дисплея размером 720 × 256 пикселей. Каждый указатель определяет местоположение 90 байт монохромных пикселей, которые содержат состояния 720 пикселей строки. 90 байт из 8 состояний пикселей расположены с интервалом в 8 байт, поэтому между каждым байтом данных пикселей имеется 7 неиспользуемых байтов. Это соответствует тому, как текстово-ориентированный PCW создает типичный экранный буфер в ОЗУ, где 8 строк первого символа хранятся в первых 8 байтах, строки второго символа — в следующих 8 байтах и т. д. Roller RAM был реализован для ускорения прокрутки дисплея, поскольку для его 3,4 МГц Z80 было бы неприемлемо медленно перемещать 23 КБ буфер дисплея «вручную», т. е. программно. Начальная запись Roller RAM, используемая в начале обновления экрана, управляется записываемым регистром ввода-вывода Z80. Таким образом, экран можно прокручивать, просто изменяя этот регистр ввода-вывода. [ необходима цитата ]
Другая система, использующая функцию Display List-like в оборудовании, — это Amiga , которая, неслучайно, была также разработана некоторыми из тех же людей, которые разработали пользовательское оборудование для 8-битных компьютеров Atari. После того, как ей было поручено создать режим отображения, она продолжала делать это автоматически для каждой следующей строки сканирования. Компьютер также включал в себя специальный сопроцессор, называемый « Copper », который запускал простую программу или «Copper List», предназначенную для изменения аппаратных регистров синхронно с дисплеем. Инструкции Copper List могли заставить Copper ждать, пока дисплей достигнет определенной позиции на экране, а затем изменить содержимое аппаратных регистров. По сути, это был процессор, предназначенный для обслуживания растровых прерываний . Copper использовался Workbench для смешивания нескольких режимов отображения (несколько разрешений и цветовых палитр на мониторе одновременно), а также многочисленными программами для создания эффектов радуги и градиента на экране. Amiga Copper также был способен перенастраивать спрайтовый движок в середине кадра, с задержкой всего в одну строку сканирования. Это позволяло Amiga рисовать более 8 аппаратных спрайтов, при условии, что дополнительные спрайты не делили строки развертки (или один промежуток между строками развертки) с более чем 7 другими спрайтами. То есть, пока хотя бы один спрайт заканчивал рисоваться, под ним на экране мог быть добавлен другой спрайт. Кроме того, более поздний 32-битный чипсет AGA позволял рисовать более крупные спрайты (больше пикселей в строке), сохраняя при этом то же мультиплексирование. Amiga также имела выделенное аппаратное обеспечение для сдвига блоков («блиттер»), которое могло рисовать более крупные объекты в буфере кадра. Это часто использовалось вместо спрайтов или в дополнение к ним. [ необходима цитата ]
В более примитивных системах результаты списка отображения могут быть смоделированы, хотя и за счет интенсивной записи ЦП в определенные режимы отображения, управления цветом или другие регистры визуальных эффектов в видеоустройстве, а не за счет серии команд рендеринга, выполняемых устройством. Таким образом, нужно создать отображаемое изображение с помощью какого-либо другого процесса рендеринга, либо до, либо во время выполнения генерации отображения, управляемой ЦП. Во многих случаях изображение также изменяется или повторно визуализируется между кадрами . Затем изображение отображается различными способами, в зависимости от точного способа реализации кода отображения, управляемого ЦП. [ необходима цитата ]
Примерами результатов, возможных на этих старых машинах, требующих видео, управляемого центральным процессором, являются такие эффекты, как режим FLI Commodore 64/128 или обработка Rainbow на ZX Spectrum. [ необходима ссылка ]
Для разграничения списка отображения используются функции glNewList
и , а для выполнения списка используется функция . Почти все команды рендеринга, которые происходят между вызовами функций, хранятся в списке отображения. Команды, которые влияют на состояние клиента, не хранятся в списках отображения. [7] Списки отображения именуются целочисленным значением, и создание списка отображения с тем же именем, что и у уже созданного, переопределяет первое. [8]glEndList
glCallList
Функция glNewList
ожидает два аргумента: целое число, представляющее имя списка, и перечисление для режима компиляции. Два режима включают GL_COMPILE_AND_EXECUTE
, который компилирует и немедленно выполняет, и GL_COMPILE
, который только компилирует список. [9]
Списки отображения позволяют использовать шаблон рендеринга с сохраненным режимом , который представляет собой систему, в которой графические команды записываются (сохраняются) для последовательного выполнения в более позднее время. Это противоречит немедленному режиму , в котором графические команды немедленно выполняются при вызовах клиента. [10]
Списки команд создаются с помощью ID3D12Device::CreateCommandList
функции. [11] Списки команд могут быть созданы в нескольких типах: прямые, пакетные, вычислительные, копирующие, видеодекодирующие, видеообрабатывающие и видеокодирующие. Прямые списки команд указывают, что список команд может выполнить графический процессор, и не наследуют никакого состояния графического процессора. [12] Пакеты лучше всего использовать для хранения и выполнения небольших наборов команд любое количество раз. Это используется иначе, чем обычные списки команд, где команды, сохраненные в списке команд, обычно выполняются только один раз. [11] Списки вычислительных команд используются для общих вычислений, с общим использованием для расчета MIP-карт . [13] Список команд копирования предназначен исключительно для копирования, а списки команд декодирования видео и обработки видео предназначены для декодирования и обработки видео соответственно. [12]
После создания списки команд находятся в состоянии записи. Списки команд можно использовать повторно, вызвав ID3D12GraphicsCommandList::Reset
функцию. После записи команд список команд должен быть переведен из состояния записи, вызвав ID3D12GraphicsCommandList::Close
. Затем список команд выполняется, вызвав ID3D12CommandQueue::ExecuteCommandLists
. [11]
Списки отображения в значительной степени устарели в современных графических архитектурах, поскольку они представляют собой набор команд в фиксированном графическом конвейере функций . Современные архитектуры используют шейдеры и объекты буфера вершин , чтобы избежать привязки графической производительности к ЦП. Из-за природы списка отображения он должен копировать каждую команду и ее данные, что может быть проблемой для определенных сред с дефицитом памяти и может быть в целом неэффективным. [7] Однако Vulkan и Direct3D 12 по-прежнему практикуют функциональность, похожую на списки отображения, в форме буферов команд и списков команд.