У меня есть большое количество прямоугольников, и некоторые перекрывают другие; каждый прямоугольник имеет абсолютный z-порядок и цвет. (Каждый "прямоугольник" на самом деле является выровненным по осям ограничивающим прямоугольником эффекта частицы, сеткой или текстурой и может быть полупрозрачным. Но легче абстрагироваться от цветных прямоугольников, если вы не пытаетесь отбросить прямоугольники за другими, поэтому я буду использовать это в описании проблемы:)
Стоимость изменения "цвета" довольно высока; его гораздо быстрее нарисовать два синих прямоугольника подряд, чем рисовать два разноцветных прямоугольника.
Стоимость рисования прямоугольников, которые даже не на экране, слишком высока, и ее следует избегать.
Если два прямоугольника не перекрываются, порядок, который они рисуют относительно друг друга, не важен. Его единственное, если они перекрываются, что z-порядок важен.
Например:
1 (красный) и 4 (красный) могут быть собраны вместе. 2 (синий) и 5 (синий) также могут быть сведены вместе, а также 3 (зеленый) и 7 (зеленый). Но 8 (красный) необходимо нарисовать после 6 (синий). поэтому его либо мы рисуем все три красных вместе, и рисуем синие в двух наборах, либо рисуем все синие вместе и рисуем красный в двух наборах.
И некоторые из прямоугольников могут иногда перемещаться. (Не все из них, некоторые прямоугольники, как известно, являются статическими, другие, как известно, перемещаются.)
Я буду рисовать эту сцену в JavaScript/webGL.
Как я могу нарисовать прямоугольники в разумном порядке, чтобы свести к минимуму изменения цвета, с хорошим компромиссом кода для отбраковки JavaScript и отбросом GPU?
(Просто работа над тем, какие прямоугольники перекрываются и которые видны дорого, у меня есть базовый quadtree, и это ускорило мою сцену, draw-ops для всей сцены), теперь вопрос заключается в том, как максимально минимизировать изменения состояния OpenGL и объединить массивы атрибутов)
ОБНОВЛЕНИЕ Я создал очень простое тестовое приложение, чтобы проиллюстрировать проблему и послужить основой для демонстрации решений: http://williame.github.com/opt_rects/
Исходный код находится на github и может быть легко разветвлен: https://github.com/williame/opt_rects
Оказывается, трудно сделать небольшое тестовое приложение с достаточным изменением состояния, чтобы фактически воссоздать проблему, которую я вижу в своей полной игре. В какой-то момент вам придется принять это за задание, что изменения состояния могут быть достаточно дорогими. Важно также, как ускорить пространственный индекс (quadtree в демо) и общий подход.