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