小切片容量居然能带来这么大的性能优化

以下是手写图像合成时AlphaBlend过程代码片段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
for x := range width {
	// 参考:image/draw/draw.go
	// “Small cap improves performance”
	// 从每帧2.6ms降到1.7ms。
	s := src[x*4 : x*4+4]
	d := dst[x*4 : x*4+4]
	a := s[3]
	switch {
	case a == 255:
		// copy(d, s[:4])
		*(*uint32)(unsafe.Pointer(&d[0])) = *(*uint32)(unsafe.Pointer(&s[0]))
	case a != 0:
		i := 255 - a
		d[0] = uint8((int(s[0])*int(a) + int(d[0])*int(i)) / 255)
		d[1] = uint8((int(s[1])*int(a) + int(d[1])*int(i)) / 255)
		d[2] = uint8((int(s[2])*int(a) + int(d[2])*int(i)) / 255)
		d[3] = 255
	}
}

参考了标准库的写法:https://github.com/golang/go/blob/9d8bad3bbd88ed75a6ea4a20fa633ede9d1bb0d9/src/image/draw/draw.go#L460

陪她去流浪 碎碎念 桃子