Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 快速清除背景的方法_Java_Java 2d - Fatal编程技术网

Java 快速清除背景的方法

Java 快速清除背景的方法,java,java-2d,Java,Java 2d,我目前正在评测我的Java-2d-Application(用于学习的游戏引擎)。 因为我不能保证每一帧都被完全覆盖,所以我必须将每一帧的背景清除为纯色(即黑色) 我这样做的速度很慢(在我的环境中,大约40%的绘图时间用于清除背景) 首先,我从bufferStrategy中获取一个图形上下文,然后在绘制实际内容之前,在其上绘制一个全分辨率的[PickYourColor]矩形 // fill background with solid color graphics.setColor(Color.BL

我目前正在评测我的Java-2d-Application(用于学习的游戏引擎)。 因为我不能保证每一帧都被完全覆盖,所以我必须将每一帧的背景清除为纯色(即黑色)

我这样做的速度很慢(在我的环境中,大约40%的绘图时间用于清除背景)

首先,我从bufferStrategy中获取一个图形上下文,然后在绘制实际内容之前,在其上绘制一个全分辨率的[PickYourColor]矩形

// fill background with solid color
graphics.setColor(Color.BLACK);
graphics.fillRect(
                0,
                0,
                (int) bounds.getWidth(),
                (int) bounds.getHeight());
是否有一种更高效、独立于平台的方法,可以使用Java-2D将每个帧的背景清除为纯色(这不是LWJGL问题)

我要找的是一个图形。clearBackgroundToSolidColor(颜色)-方法

按要求:这里是完整的渲染方法(它不是SSCCE,但它非常简短且不言自明)


我不能解释为什么
fillRect
速度慢,但是您可以尝试创建
图像
并将其绘制为背景。但不确定是否会更快

尝试:

然后绘制
图像,而不是
fillRect

graphics.drawImage(bi, 0, 0, null);

告诉我是怎么回事(我对此表示怀疑)。

如果您想清除整个背景,请尝试
canvas.drawColor(color,PorterDuff.Mode.clear)
。应该快一点

我在所有的应用程序中都使用了
fillRect
,我从来没有遇到过性能问题。使用
setBackground(Color)
clearRect(int,int,int,int)
有什么改进吗?你确定
fillRect
速度慢吗?你能发布你的完整渲染方法吗?@realdonsuggest:那是去润滑的,我不喜欢使用它(而且它有完全相同的性能)@dimaligin:100%确定,因为如果我注释掉上面几行,我会得到大约40%的性能提升。当然,在其他环境或应用程序中,填充算法的百分比可能或多或少(@TameHog:这可能是您没有问题的原因),但在高分辨率(全高清及以上)上,填充算法很慢(在4台windows PC上测试),所以。。。基本上,您所做的是覆盖图形上下文的内部int[]-数组?只需绘制
图像
,而不是
fillRect
哦。。。好的;-)在您的代码中,我们必须在绘制(或事先转换)图像时将图像拉伸到帧宽度和高度。拉伸是一项昂贵的操作,尤其是在使用插值双线性或双三次插值时。因此,在您的示例中,缓冲图像必须使用我在发布此问题之前测试的帧的尺寸X创建。它的速度大约是fillRect的一半。也许fillRect是Java2D中最有效的方法sigh@Florian我仍然不知道你得到的FPS是多少,我以前在1080p
Canvas
上使用过
fillRect
,只得到了大约900fps的bg填充。@Florian如果你决定使用openGL,请确保使用openGL3+,而不是旧的
GL.begin()
方法。使用VAO而不是直接从VertexArray绘制,并且花时间编写自己的SLDL着色器,它们可以大大加快速度。
BufferedImage bi = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
int[] imageData =((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
Arrays.fill(imageData, 0);
graphics.drawImage(bi, 0, 0, null);