java 透明色绘图的性能下降?

java performance hit of drawing with transparent color?

有谁知道用完全透明的颜色 (alpha = 0) 填充矩形是否会影响性能?或者它是否经过优化并完全跳过? 我说的是这样的代码:

Graphics g;
....
g.setColor(new Color(0xFF,0xFF,0xFF,0x00));
g.fillRect(0, 0, width, height);    // <= does this take any CPU?

不确定这是否可以被视为 "acceptable" 答案,但至少可能有帮助:

正如评论中指出的那样:视情况而定。

JavaGraphicsclass是一个非常厚的抽象层。您可以使用它在每个操作系统、每个 JVM、每个图形卡、每个驱动程序上进行渲染,即便如此,仍然可以使用不同的方法。

举个例子:在普通的Windows机器上,您可以使用-Dsun.java2d.opengl or -Dsun.java2d.d3d flags. This might cause the actual g.fillRect call to either end up in the corresponding D3DRenderer or the OGLRenderer方法(*) - 从那时起,驱动程序需要确定它是否真的需要为此调用做一些事情(考虑到当前颜色是透明的)。


有趣的是,您的评论是 // <= does this take any CPU?。大多数情况下,CPU不会关心颜色是否透明。它只会将调用转发到渲染管道。所以有疑问,它对GPU施加了负载。

对于完全不透明的颜色,填充一个矩形是微不足道的:现有像素被简单地替换为一个块。颜色是透明的这一事实使事情变得有点困难:新颜色必须 "mixed" 与已经存在的像素的颜色相同。在完全透明色的情况下,这不是必需的,但我怀疑这是否被视为特殊情况。


通常,绘制单个矩形(无论颜色如何)根本不会对性能产生明显影响:在 GPU 上需要几微秒。如果您要绘制 many 个矩形(实际上 many),那么这个问题可能会变得更相关 - 但在这种情况下,您更愿意添加查询

if (color.getAlpha() > 0) paintMillionsOfRectangles();

为了避免对 g.fillRect 进行数百万次调用的循环,这可能会比由于fillRect 次调用(在硬件、GPU 上完成)。


(*) 我不完全确定这些是否 真的 正确的方法 - 同样,抽象层非常厚...