【发布时间】:2012-12-28 05:10:38
【问题描述】:
我有大量矩形,有些与其他矩形重叠;每个矩形都有一个绝对的 z 顺序和一个 颜色。 (每个“矩形”实际上是粒子效果、网格或纹理的轴对齐边界框,并且可能是半透明的。但只要您不尝试在其他矩形后面剔除矩形,就更容易抽象地思考彩色矩形,所以我将在问题描述中使用它:)
改变“颜色”的成本相当高;连续绘制两个蓝色矩形比绘制两个不同颜色的矩形要快得多。
绘制甚至不在屏幕上的矩形的成本也很高,应该避免。
如果两个矩形不重叠,它们相对于另一个的绘制顺序并不重要。只有当它们重叠时,z 顺序才重要。
例如:
1(红色)和4(红色)可以画在一起。 2(蓝色)和 5(蓝色)也可以一起绘制,3(绿色)和 7(绿色)也可以。但必须在 6(蓝色)之后绘制 8(红色)。因此,要么我们将所有三个红色一起绘制,然后将蓝色分成两组绘制,或者我们将所有蓝色绘制在一起并分成两组绘制红色。
有些矩形可能会偶尔移动。 (并非全部;已知一些矩形是静态的;其他已知是移动的。)
我将在 JavaScript/webGL 中绘制这个场景。
如何以合理的顺序绘制矩形以最小化颜色变化,并在 JavaScript 剔除代码与让 GPU 剔除之间取得良好的折衷?
(仅计算出哪些矩形重叠,哪些是可见的很昂贵。我有一个basic quadtree,这极大地加快了我的场景绘制速度(与仅发出整个场景的绘制操作相比);现在的问题是如何最小化OpenGL状态变化和尽可能串联属性数组)
更新我创建了一个非常简单的测试应用来说明问题并作为解决方案演示的基础:http://williame.github.com/opt_rects/
源代码在 github 上,可以很容易地 fork:https://github.com/williame/opt_rects
事实证明,制作一个具有足够状态更改的小测试应用程序来实际重现我在完整游戏中看到的问题是很困难的。在某些时候,您将不得不认为状态更改可能足够昂贵。同样重要的是如何加快空间索引(演示中的四叉树)和整体方法。
【问题讨论】:
-
你有多少个矩形?最大可能值。
-
我的脑袋:从拓扑排序的升序 z 顺序开始,只考虑重叠的矩形对。以重叠矩形的角为坐标,将重叠矩形分割成2或3个相同颜色的小矩形,其中一个将被完全遮挡(立即丢弃)或部分遮挡(部分可以稍后丢弃) .更新拓扑排序关系。重复直到拓扑排序关系为空。那时,不会有重叠,所以用相同的颜色来绘制。矩形的最终数量应该与原始数量成线性关系。
-
@Will 您能否为我们提供您当前方法的独立示例,以便我们进行基准测试和比较改进?
-
那么适当的指标是简单地绘制所有矩形所需的颜色更改次数,还是有更复杂的优化?
-
“最小化颜色变化”的目标很明确,但不清楚“剔除不可见的矩形”应该是什么意思。后者似乎是先于前者的一步。您是否有一个表示视图的轴对齐边界框,并且想要找到一个很好的数据结构来快速剔除完全在此 AABB 之外的框?四叉树似乎非常适合这一步。
标签: javascript algorithm math webgl spatial-index