Date: January 22 2025
jsge@1.5.3
Merge draw calls / Соединение вызовов отрисовки

Status: Done texts (1.5.10)
        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. Протестировать что получится.

    Для текстов нужно:
        1. Создать отдельный example с множеством текстов
        2. добавить текстовый атлас
        3. при добавлении текстов в атлас, тексты не должны пересекаться
        4. Атлас может быть определенного размера не превышающего MAX_TEXTURE_SIZE
        5. Если MAX_TEXTURE_SIZE будет превышен - создается еще один атлас
        6. У каждого текста будет отметка индекса атласа и его позиция x,y,w,h на нем
        7. Есть параметры, теста меняются. Смотрим изменился ли размер w, h. 
            Если изменился, текст обрабатываем как новый добавляя на атлас в конец,
            Будут оставаться огрызки, что не очень хорошо.
            Если нет, отчищаем старую позицию текста на атласе и добавляем измененный текст.
        8. Нужно продумать систему отчистки огрызков.

Impact:
    The user experience will improve.