DrawList
Буфер команд рисования одного кадра, записывающий аппаратно-независимые примитивы, переиспользующий команды из пула и предоставляющий многослойную запись (channels).
Обзор
Виджеты не рисуют напрямую на GPU. Вместо этого операции рисования записывают объекты DrawCommand в DrawList. В конце кадра активный RenderBackend обходит список, выполняет сортировку состояний, батчинг геометрии, привязку текстур и непосредственную отрисовку.
Жизненный цикл команд и пул
Чтобы предотвратить нагрузку на сборщик мусора при непрерывном рендеринге интерфейса, DrawList содержит пул переиспользуемых объектов DrawCommand (до 8192 экземпляров). Внутренние методы запрашивают команды через obtain(DrawCommandType) и возвращают их в пул при вызове clear().
Многослойная запись (Channels)
Механизм каналов (channels) позволяет виджетам записывать команды рисования в раздельные виртуальные слои (фон, содержимое, оверлей, тултип) в рамках одного прохода без усложнения логики. Вызов channelsSplit(n) разделяет буфер на слои, channelsSetCurrent(i) переключает целевой слой, а channelsMerge() склеивает слои обратно в строгом порядке.
Векторные пути (Vector Paths)
DrawList владеет выделенным экземпляром VectorPath, доступным через path(). Процедурные контуры, кривые и многоугольники могут строиться в этом общем объекте без лишних аллокаций геометрических структур.
Потребление бэкендом
Бэкенды могут получать команды как через неизменяемый список List<DrawCommand> (commands()), так и через прямой доступ к элементам массива fastutil (commandElements() и size()) для максимального быстродействия циклов рендера.
Разделение фона и переднего плана по каналам
drawList.channelsSplit(2);
drawList.channelsSetCurrent(1);
// Рисуем передний план первым в коде
drawList.add(foregroundCommand);
drawList.channelsSetCurrent(0);
// Рисуем задний план под содержимым
drawList.add(backgroundCommand);
// Склеиваем слои в правильном порядке 0..N
drawList.channelsMerge();
Обход записанных команд в цикле бэкенда
Object[] elements = drawList.commandElements();
int size = drawList.size();
for (int i = 0; i < size; i++) {
DrawCommand cmd = (DrawCommand) elements[i];
dispatchCommand(cmd);
}
API
DrawList::add(DrawCommand)
add(DrawCommand)
Добавляет копию указанной команды рисования в текущий список или активный канал.
| Параметр | Тип | Описание |
|---|---|---|
command |
DrawCommand |
Команда рисования; null игнорируется. |
DrawList::obtain(DrawCommandType)
obtain(DrawCommandType)
Получает переиспользуемый экземпляр DrawCommand из пула или создаёт новый, если пул пуст.
| Параметр | Тип | Описание |
|---|---|---|
type |
DrawCommandType |
Тип запрашиваемой команды. |
Возвращает DrawCommand: Сброшенный экземпляр DrawCommand, готовый к заполнению..
DrawList::clear()
clear()
Очищает все записанные команды, возвращает их в пул переиспользования, сбрасывает каналы и очищает общий векторный путь.
DrawList::commands()
commands()
Возвращает неизменяемое представление всех записанных команд текущего draw-списка.
Возвращает List: Read-only представление записанных команд..
DrawList::commandElements()
commandElements()
Возвращает внутренний массив fastutil для максимального быстродействия циклов обработки бэкенда.
Возвращает Object[]: Массив объектов; читать только первые size() элементов..
DrawList::size()
size()
Возвращает общее количество записанных команд.
Возвращает int: Количество команд..
DrawList::path()
path()
Возвращает общий экземпляр VectorPath для построения контуров.
Возвращает VectorPath: Общий экземпляр VectorPath..
DrawList::pathClear()
pathClear()
Очищает общий построитель VectorPath, сбрасывая все подпути и вершины.
DrawList::channelsActive()
channelsActive()
Проверяет, активна ли многослойная запись в каналы.
Возвращает boolean: true, если запись ведётся в раздельные каналы..
DrawList::currentChannel()
currentChannel()
Возвращает индекс текущего активного канала записи.
Возвращает int: Индекс текущего канала (0..N-1)..
DrawList::channelsSplit(int)
channelsSplit(int)
Разделяет запись команд на указанное число слоёв-каналов.
| Параметр | Тип | Описание |
|---|---|---|
count |
int |
Количество каналов; значения меньше 1 нормализуются к 1. |
DrawList::channelsSetCurrent(int)
channelsSetCurrent(int)
Выбирает активный канал для последующих команд рисования.
| Параметр | Тип | Описание |
|---|---|---|
channel |
int |
Индекс целевого канала, ограничивается доступным диапазоном. |
DrawList::channelsMerge()
channelsMerge()
Сливает команды всех каналов обратно в основной список в строгом порядке следования каналов.