В основе производительности PixiJS лежит прямое
взаимодействие с API WebGL. Видеокарта принимает данные
в виде бинарных буферов — последовательностей чисел фиксированного типа.
Именно поэтому ключевую роль в низкоуровневой части библиотеки играет
класс Buffer, который инкапсулирует работу с
типизированными массивами и синхронизацию данных с GPU.
Класс Buffer используется во всех системах геометрии:
при создании Mesh, Geometry, пользовательских
шейдеров и атрибутов вершин.
Типизированные массивы — это структуры данных, позволяющие хранить числовые значения в бинарном формате с фиксированной разрядностью. В отличие от обычных массивов Jav * aScript:
| Тип | Размер | Описание |
|---|---|---|
Float32Array |
4 байта | Числа с плавающей точкой |
Uint16Array |
2 байта | Беззнаковые 16-битные целые |
Uint32Array |
4 байта | Беззнаковые 32-битные целые |
Int16Array |
2 байта | Знаковые 16-битные |
Uint8Array |
1 байт | Байтовые данные |
Для вершинной геометрии чаще всего используются:
Float32Array — координаты, UV, нормали;Uint16Array или Uint32Array —
индексы.Класс Buffer служит связующим звеном между:
Его задачи:
Базовый пример:
import { Buffer } from 'pixi.js';
const data = new Float32Array([
0, 0,
100, 0,
100, 100,
0, 100
]);
const buffer = new Buffer(data);
После создания:
data хранится в CPU-памяти;new Buffer(data, options)
Типизированный массив.
Объект с параметрами:
| Свойство | Назначение |
|---|---|
usage |
Тип использования (STATIC, DYNAMIC, STREAM) |
label |
Отладочная метка |
shrinkToFit |
Оптимизация размера |
Эти значения соответствуют режимам WebGL:
STATIC_DRAW — данные редко изменяются;DYNAMIC_DRAW — периодически обновляются;STREAM_DRAW — обновляются каждый кадр.Выбор режима влияет на стратегию оптимизации GPU.
data[0] = 50;
После изменения необходимо уведомить систему:
buffer.update();
Метод update():
databuffer.data — это ссылка на исходный типизированный
массив. Замена массива возможна:
buffer.data = new Float32Array([...]);
buffer.update();
PixiJS не копирует массив автоматически. Работа происходит с переданной ссылкой.
Индексный буфер хранит порядок обхода вершин:
const indices = new Uint16Array([
0, 1, 2,
0, 2, 3
]);
const indexBuffer = new Buffer(indices);
Он используется совместно с Geometry для определения
треугольников.
Выбор между Uint16Array и Uint32Array
зависит от количества вершин:
Uint16Array;Uint32Array (при поддержке расширений
WebGL).Geometry агрегирует несколько буферов:
Пример:
geometry.addAttribute('aPosition', buffer, 2);
Здесь:
'aPosition' — имя атрибута в шейдере;buffer — экземпляр Buffer;2 — размерность (x, y).PixiJS поддерживает обновление части массива:
buffer.update(data, offset);
Это позволяет:
Каждый Buffer содержит:
_updateID — версия данных;При рендеринге:
gl.bufferSubData или
gl.bufferData;Работа с буферами требует учёта:
update();Оптимизационные рекомендации:
DYNAMIC_DRAW для часто обновляемых
данных;Mesh использует Geometry, а та —
Buffer. Поток данных выглядит так:
TypedArray → Buffer → Geometry → Shader → WebGL → GPU
Таким образом, Buffer — фундаментальный элемент всей
системы отрисовки.
Опция shrinkToFit управляет поведением при уменьшении
массива:
true, GPU-буфер пересоздаётся;false, сохраняется предыдущий размер.Это влияет на:
| Обычный массив | Buffer |
|---|---|
| Динамический тип | Строгий бинарный формат |
| Не совместим с WebGL напрямую | Непосредственно используется GPU |
| Автоматическое расширение | Фиксированный размер |
| Высокий оверхед | Минимальные накладные расходы |
PixiJS поддерживает чередование атрибутов:
// x, y, u, v
new Float32Array([
0, 0, 0, 0,
100, 0, 1, 0,
...
]);
Один буфер может хранить:
Это уменьшает количество WebGL-буферов и повышает эффективность кэширования на GPU.
Буфер можно уничтожить:
buffer.destroy();
Это:
При создании:
необходима прямая работа с Buffer.
Глубокое понимание:
позволяет проектировать высокопроизводительные графические системы.
Buffer — абстракция над WebGL-буферами.Geometry.