ビデオオーバーレイに移動する出力オプションが必要な作業を行っています。rgb565 をサポートしているものもあります。よろしければ、データをコピーしてください。
そうでない場合は、変換を使用してデータをコピーする必要があり、一度にフレーム バッファーになります。いくつかのことを試してみますが、これはオプティマイザーがちょっとした挑戦に熱心に取り組むことの 1 つかもしれないと思いました.
一般的に最も簡単にサポートされるさまざまな YUV 形式があります。Y の平面と、それに続く UV のインターリーブまたは個別の平面です。
Linux / xvを使用していますが、私が扱っているレベルでは、バイトとx86だけです。
品質を犠牲にして速度を重視しますが、何百もの異なる方法を試すことができる可能性があります。どこかバランスが取れている。
mmx を見ましたが、そこに役立つものがあるかどうかはわかりません。このタスクに特に適していると思われるものは何もなく、レジスターの適切な場所に物事を入れるには多くのシャッフルが必要です。
Y = Green*0.5 + R*0.25 + Blue*notmore の粗いバージョンを試してみます。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
もちろん、すべての命令は前の命令に依存しており、単語の読み取りは最適ではないため、2 つをインターリーブすると少し得られる可能性があります。
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つでそれを行うのは非常に簡単です.
誰もがより速く、より良いものを思いつくことができますか?
これに対する興味深い点は、適切なコンパイラが同様のコードを生成できるかどうかです。