我有大量矩形,有些与其他矩形重叠;每个矩形都有一个绝对的 z 顺序和一个颜色。(每个“矩形”实际上是粒子效果、网格或纹理的轴对齐边界框,并且可能是半透明的。但只要您不尝试在其他矩形后面剔除矩形,就更容易抽象地思考彩色矩形,所以我将在问题描述中使用它:)
改变“颜色”的成本相当高;连续绘制两个蓝色矩形比绘制两个不同颜色的矩形要快得多。
绘制甚至不在屏幕上的矩形的成本也很高,应该避免。
如果两个矩形不重叠,则它们相对于彼此的绘制顺序并不重要。只有当它们重叠时,z 顺序才重要。
例如:
1(红色)和4(红色)可以画在一起。2(蓝色)和 5(蓝色)也可以一起绘制,3(绿色)和 7(绿色)也可以。但必须在 6(蓝色)之后绘制 8(红色)。所以要么我们将所有三个红色画在一起,然后将蓝色画成两组,或者我们将所有蓝色画在一起,然后将红色画成两组。
一些矩形可能会偶尔移动。(不是全部;已知一些矩形是静态的;其他已知是移动的。)
我将在 JavaScript/webGL 中绘制这个场景。
如何以合理的顺序绘制矩形以最小化颜色变化,并在 JavaScript 剔除代码与让 GPU 剔除之间取得良好的折衷?
(仅仅计算出哪些矩形重叠,哪些是可见的很昂贵。我有一个基本的四叉树,这极大地加快了我的场景绘制速度(与仅发出整个场景的绘制操作相比);现在的问题是如何最小化 OpenGL状态变化并尽可能连接属性数组)
更新我创建了一个非常简单的测试应用程序来说明问题并作为解决方案演示的基础: http ://williame.github.com/opt_rects/
源代码在 github 上,可以很容易地被分叉:https ://github.com/williame/opt_rects
事实证明,很难制作一个具有足够状态更改的小测试应用程序来实际重现我在完整游戏中看到的问题。在某些时候,您将不得不认为状态更改可能足够昂贵。同样重要的是如何加快空间索引(演示中的四叉树)和整体方法。