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" 答案,但至少可能有帮助:
正如评论中指出的那样:视情况而定。
JavaGraphics
class是一个非常厚的抽象层。您可以使用它在每个操作系统、每个 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 上完成)。
(*) 我不完全确定这些是否 真的 正确的方法 - 同样,抽象层非常厚...
有谁知道用完全透明的颜色 (alpha = 0) 填充矩形是否会影响性能?或者它是否经过优化并完全跳过? 我说的是这样的代码:
Graphics g;
....
g.setColor(new Color(0xFF,0xFF,0xFF,0x00));
g.fillRect(0, 0, width, height); // <= does this take any CPU?
不确定这是否可以被视为 "acceptable" 答案,但至少可能有帮助:
正如评论中指出的那样:视情况而定。
JavaGraphics
class是一个非常厚的抽象层。您可以使用它在每个操作系统、每个 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 上完成)。
(*) 我不完全确定这些是否 真的 正确的方法 - 同样,抽象层非常厚...