J'ai un grand nombre de rectangles, et certains en recouvrent d'autres ; chaque rectangle a un ordre z absolu et un couleur . (Chaque "rectangle" est en fait la boîte de délimitation alignée sur l'axe d'un effet de particule, d'un maillage ou d'une texture et peut être semi-transparent. Mais il est plus facile de penser abstraitement à des rectangles colorés tant que l'on n'essaie pas d'éliminer des rectangles derrière d'autres, c'est pourquoi je vais utiliser cela dans la description du problème :)
Le coût du changement de "couleur" est assez élevé ; il est beaucoup plus rapide de dessiner successivement deux rectangles bleus que de dessiner deux rectangles de couleur différente.
Le coût du dessin de rectangles qui ne sont même pas sur l'écran est également assez élevé et doit être évité.
Si deux rectangles ne se chevauchent pas, l'ordre dans lequel ils sont dessinés l'un par rapport à l'autre n'est pas important. Ce n'est que s'ils se chevauchent que l'ordre z est important.
Par exemple :
1 (rouge) et 4 (rouge) peuvent être tirés ensemble. Le 2 (bleu) et le 5 (bleu) peuvent également être dessinés ensemble, tout comme le 3 (vert) et le 7 (vert). Mais le 8 (rouge) doit être dessiné après le 6 (bleu). Donc, soit on dessine les trois rouges ensemble et on dessine les bleus en deux séries, soit on dessine tous les bleus ensemble et on dessine les rouges en deux séries.
Et certains des rectangles peuvent bouger occasionnellement. (Pas tous ; certains rectangles sont connus pour être statiques ; d'autres sont connus pour bouger).
Je vais dessiner cette scène en JavaScript/webGL.
Comment puis-je dessiner les rectangles dans un ordre raisonnable pour minimiser les changements de couleur avec un bon compromis entre l'élimination du code en JavaScript et l'élimination par le GPU ?
(Le simple fait de déterminer quels rectangles se chevauchent et lesquels sont visibles est coûteux. J'ai un quadtree de base et cela a accéléré énormément le dessin de ma scène (par rapport à l'émission des draw-ops pour toute la scène) ; maintenant la question est de savoir comment minimiser les changements d'état OpenGL et concaténer les tableaux d'attributs autant que possible)
UPDATE J'ai créé une application de test très simple pour illustrer le problème et servir de base à la démonstration des solutions : http://williame.github.com/opt_rects/
Le code source est sur github et peut facilement être forké : https://github.com/williame/opt_rects
Il s'avère qu'il est difficile de créer une petite application de test avec suffisamment de changements d'état pour recréer le problème que je vois dans mon jeu complet. À un moment donné, vous devrez considérer comme acquis que les changements d'état peuvent être suffisamment coûteux. Ce qui est également important est de savoir comment accélérer l'index spatial (quadtree dans la démo) et l'approche globale.