x/image: vector.go 光栅化器在目标偏移且相对图像尺寸较小时会移动alpha掩码并变慢,

but5z9lq  于 2个月前  发布在  Go
关注(0)|答案(1)|浏览(29)

请在提交问题之前回答以下问题。谢谢!

您正在使用的Go版本是什么( go version )?

1.10.2

这个问题是否在最新版本中重现?

是的

您正在使用什么操作系统和处理器架构( go env )?

linux/amd64

您做了什么?

在golang.org/x/image/vector.go中有这个函数:
func (z *Rasterizer) Draw(dst draw.Image, r image.Rectangle, src image.Image, sp image.Point)
r 是用于渲染图像的目标矩形。当r是一个比目标图像dst的边界小得多的矩形,并且偏移到dst的中间时,会出现两个问题:
首先,alpha掩码,即Draw命令的全部意义,会随着目标矩形而不是固定在图像的左上角移动。我认为这不应该成为默认行为。它与其他光栅化器(如自由类型光栅化器)不一致。如果掩码随着目标移动,而您正在使用贝塞尔曲线渲染路径并希望将该路径绘制到图像上,您必须事先确定路径的确切边界并相应地调整坐标,因为现在,绘制在图像中间的目标总是相对于目标矩形的左上角绘制掩码。需要事先确定边界要求将曲线展平并存储结果线段或在实际渲染alpha掩码时重复该过程。将其保持在图像边界的左上角而不是与目标矩形一起移动要简单得多。
其次,无论目标矩形相对于整个图像的大小有多大,“累积步骤”都会遍历整个图像,当目标是图像的一小部分时,效率较低。
我在此处创建了一个修改后的光栅化器: https://github.com/srwiley/image
在vector_test.go文件中是TestBasicPathDstAlpha和TestBasicPathDstRGBA测试函数的修改版本。这些已更改为测试将alpha掩码固定在图像上而不是与目标一起移动。它们将在当前版本的vector.go中失败,但不会在分叉版本中失败。
还有一系列基准测试显示了当目标相对于目的Map像较小时的改进性能。这是基准测试输出的样子:

BenchmarkDrawPathBounds1000-16         	      30	  44412739 ns/op
BenchmarkDrawImageBounds1000-16        	      20	  53485352 ns/op
BenchmarkDrawPathBounds100-16          	    3000	    458989 ns/op
BenchmarkDrawImageBounds100-16         	      20	  53309779 ns/op
BenchmarkDrawPathBounds10-16           	  200000	      6054 ns/op
BenchmarkDrawImageBounds10-16          	      20	  55934650 ns/op
BenchmarkDrawPathBounds2-16            	 1000000	      1021 ns/op
BenchmarkDrawImageBounds2-16           	      20	  54077408 ns/op

BenchmarkDrawPathBoundsX 仅绘制指定半径X的六边形路径的路径边界,在一个2200x2200大小的图像中。BenchmarkDrawImageBoundsX 绘制整个图像,这就是当前vector.go文件所做的。因此,随着路径变小,速度差异增加。

您期望看到什么?

当目标相对于图像大小较小时,速度显著提高,且alpha掩码固定在目的Map像的左上角。

您看到了什么?

对于相对于图像大小较小的目标尺寸而言,效率低下的速度以及alpha掩码相对于目标矩形左上角而不是目的Map像边界固定。

相关问题