透明颜色绘图的java性能影响?

标签 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?

最佳答案

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

正如评论中指出的:这要看情况。

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

举个例子:在普通的 Windows 机器上,您可以使用 -Dsun.java2d.opengl 明确指定是否需要 OpenGL 加速图形管道或基于 Direct3D 的图形管道。或-Dsun.java2d.d3d旗帜。这可能会导致实际的 g.fillRect调用相应的 D3DRenderer 结束或OGLRenderer方法 (*) - 从那时起,驱动程序就需要确定它是否实际上必须为此调用执行某些操作(考虑到当前颜色是透明的)。

<小时/>

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

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

<小时/>

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

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

为了避免对 g.fillRect 进行数百万次调用的循环,这可能会比 fillRect 执行的实际操作施加更高的计算负载(特别是:在 CPU 上)。调用(在 GPU 上的硬件中完成)。

<小时/>

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

关于透明颜色绘图的java性能影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28326958/

相关文章:

java - 帕斯卡三角递归

Java 卡布局。多张卡中的一个组件

javascript - 重叠的半透明 div 没有 alpha 加起来?

java.lang.OutOfMemoryError : Java heap space, 如何释放内存?

tomcat中的Java应用程序?

java - 绘制扩展 JPanel 的类

HTML/CSS 背景透明度

openCV:为 IplImage 添加透明度

java - 我怎样才能把它变成一个循环?

java - 是否可以从 AWT 组件中获取像素?