jsge
Version:
Javascript Game Engine
38 lines (31 loc) • 2.88 kB
Plain Text
Date: January 22 2025
jsge@1.5.3
Merge draw calls / Соединение вызовов отрисовки
Status: In Progress (texts)
Done primitives (1.5.9)
Done images (1.5.5)
Done tilesets (1.5.6)
Context:
Каждая добавляемая в игру сущность рисуется отдельно,
что плохо сказывается на производительности. Можно склеить вызовы с одинаковыми webgl
программами и одинаковыми текстурами, по принципам - если нет текстуры и программа одинаковая,
либо текстура одинаковая и программа одинаковая.
Есть функция set GameStageData._renderObject, которая добавляет объект в конец массива #renderObjects
Есть функция get GameStageData._renderObject, которая возвращает массив #renderObjects
Функция RenderLoop.render() перебирает этот массив, выполняет следующие действия
1. Удаляет объекты помеченные флагом isRemoved
2. Выполняет _processActiveAnimations() на объектах помеченных hasAnimations
3. Собирает массив Promise #webGlEngine._bindRenderObject() - которые фактический рисуют каждый объект отдельно
4. Выполняет Promise.allSettled()
Текущая реализация WebGlDrawPrograms имеет расчет координат position, на основе расчета матриц и передаваемых параметров,
translate, scale, rotate, resolution. Если склеивать вызовы отрисовки, нужно будет переносить эти расчеты в javascript.
Нужно будет два метода для рисования, bind и draw, один будет "биндить" одинаковые программы,
второй "биндить" и "отпралять на отрисовку".
Decision:
1. Сделать webgl программу для рисования изображений без расчета position.
2. Перенести расчет position в javascript
3. RenderLoop.render() на этапе 3. определять можно ли склеить вызов отрисовки со следующим объектом если нет.
В зависимости от этого рисовать объект или только подготавливать данные для буффера.
4. Протестировать что получится.
Impact:
No impact.