我正在做一个我想要输出选项以转到视频叠加层的东西。有些支持rgb565,如果这么甜,只需将数据复制过来。
如果不是,我必须通过转换复制数据,并且一次是一个帧缓冲区。我将尝试一些事情,但我认为这可能是优化者热衷于尝试挑战的事情之一。
通常最容易支持的各种 YUV 格式是 Y 平面,然后是交错的或单独的 UV 平面。
使用 Linux / xv,但在我处理的级别上,它只是字节和 x86。
我将以质量为代价专注于速度,但可能有数百种不同的路径可供尝试。那里有一个平衡点。
我查看了 mmx 但我不确定那里是否有任何有用的东西。没有什么让我觉得特别适合这项任务,而且要将事情放到寄存器中的正确位置需要大量的洗牌。
尝试使用 Y = Green*0.5 + R*0.25 + Blue*notmuch 的粗略版本。U 和 V 在质量方面更不值得关注。你可以在这些频道上逃脱谋杀。
对于一个简单的循环。
loop:
movzx eax,[esi]
add esi,2
shr eax,3
shr al,1
add ah,ah
add al,ah
mov [edi],al
add edi,1
dec count
jnz loop
当然,每条指令都取决于之前的指令,而单词读取并不是最好的,因此交错两条指令可能会有所收获
loop:
mov eax,[esi]
add esi,4
mov ebx,eax
shr eax,3
shr ebx,19
add ah,ah
add bh,bh
add al,ah
add bl,bh
mov ah,bl
mov [edi],ax
add edi,2
dec count
jnz loop
一次用 4 个就很容易做到这一点,也许是为了一个好处。
任何人都可以想出更快更好的东西吗?
一个有趣的方面是一个像样的编译器是否可以产生类似的代码。