当Java在画布之外绘制某些东西时,它会影响性能吗?

时间:2015-05-16 22:40:01

标签: java performance

如果我用-80和-90之类的协调画一些东西会影响性能,就像它实际上是在里面绘制一样吗?
是否真的值得检查最终图像是否会出现在屏幕上? (如果没有,则不绘制)

3 个答案:

答案 0 :(得分:8)

如果我用-80和-90这样的协调绘制一些内容会影响性能,就像它实际绘制在内部一样吗?

有点,但不像它在屏幕内的那么多。

检查最终图像是否会出现在屏幕上真的值得吗? (如果赢了就不要画画

实际上从不值得在库中实现自己的剔除/裁剪,其中绘制越界不是错误/访问冲突,因为库已经必须进行检查以避免写入内存超出界限,并且通常明智的做法是让图书馆检查这种方式是聪明而快速的。

因此,如果您要在顶部添加自己的基本检查,那么现在您只是在常规的屏幕绘图中执行两项此类检查(您自己除了引擎盖下的任何内容之外)对于屏幕外情况,您的支票可能实际上比图书馆的速度慢(或者至少没有更好)。

现在我必须在这里强调基本剔除/剪裁。基本上,我的意思是检查每个形状绘制的每个形状。在那里,你更有可能损害性能。

加速结构和批量剔除

然而,在某些情况下,您可能拥有一个数据结构,可以同时对一千个三角形进行有效剔除,并使用单个边界框检查它是否在平截头体中,例如,在3D情况下像绑定卷层次结构的结构。游戏使用这些类型的数据结构,通过极少的检查大幅减少每帧所需的绘图请求量,并且您确实可以获得潜在的巨大性能优势。更基本的版本是检查包含三角形的对象/网格是否有一个位于屏幕内的边界框,从而消除了可能通过单个边界框检查单独剔除数千个三角形。

在具有剪裁的2D中,您可能能够使用诸如四叉树或固定网格之类的东西来仅选择性地绘制屏幕上的内容(并且还加速碰撞检测或点击检测,例如)。如果你可以通过一次检查消除许多多余的绘图调用,那么你实际上可以获得性能提升。但同样,我们使用的数据结构通过单一检查消除了大量不必要的绘图调用。这些是空间分区结构,其唯一的目的是避免在每个形状的基础上检查事物。

对于更基本的2D示例,如果您说,2D"小部件"为了绘制它,需要在屏幕上绘制几十种不同的形状,如果你可以通过一次检查来避免请求绘制几十个形状以查看包含整个小部件的矩形,那么你可以挤出性能增益在屏幕上。同样,你在那里进行一次检查以消除许多绘图调用。你不会在一个公平的比赛场地上获得性能提升,你可以在每个形状的基础上进行检查,但是如果你可以把很多支票变成一张支票,那么你就有机会。 / p>

答案 1 :(得分:4)

根据大多数常见绘制/填充的Graphics实现(即drawRectangle参见:source of Graphics on grepcode.com,他们首先检查宽度和高度是否大于零,然后进行更多操作,因此检查x,在最坏的情况下,y< 0正在进行相同数量的操作。

请记住,正如您所说,一个矩形从-80和-90开始,但宽度和高度,即200将显示在屏幕上。

答案 2 :(得分:3)

是的,它仍会影响性能,因为它仍然存在于程序中,它只是在屏幕上看不到