用透明色绘制的java性能?

时间:2015-02-04 16:52:42

标签: java awt alpha-transparency

有人知道填充矩形是否具有完全透明的颜色(alpha = 0)会产生性能影响吗?还是优化并完全跳过? 我在说这样的代码:

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

1 个答案:

答案 0 :(得分:2)

不确定这是否可以被视为“可接受的”答案,但至少可能有用:

正如评论中所指出的:这取决于。

Java Graphics类是非常厚的抽象层。您可以使用它在每个操作系统上,每个JVM,每个图形卡,每个驱动程序,甚至是使用不同的方法进行渲染。

作为示例:在通常的Windows计算机上,您可以明确指定是否需要具有-Dsun.java2d.opengl-Dsun.java2d.d3d标志的OpenGL加速图形管道或基于Direct3D的图形管道。这可能会导致实际的g.fillRect调用以相应的D3DRendererOGLRenderer方法(*)结束 - 从那里开始,这是一个问题驱动程序,以确定它是否实际上必须为此调用做一些事情(考虑到当前颜色是透明的)。


有趣的是,您的评论说// <= does this take any CPU?。在大多数情况下, CPU 不会关心颜色是否透明。它只会将调用转发给渲染管道。所以毫无疑问,它会对 GPU 造成负担。

对于完全不透明的颜色,填充矩形是微不足道的:现有的像素只是被替换为一个块。颜色是透明的这一事实使事情变得更加困难:新颜色必须与已经存在的像素的颜色“混合”。在完全透明颜色的情况下,这不是必需的,但我怀疑这被视为特殊情况。


通常,绘制单个矩形(无论颜色如何)都不应该产生明显的性能影响:在GPU上需要几微秒。如果您要绘制许多矩形(实际上很多),那么这个问题可能会变得更相关 - 但在这种情况下,您宁愿添加一个像

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

为了避免对g.fillRect进行数百万次调用的循环,这可能会导致更高的计算负荷(特别是:在CPU上),而不是由于fillRect而导致的实际操作调用(在硬件上完成,在GPU上完成)。


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