Autor: | Wojciech Muła |
---|---|
Dodany: | 6.02.2002 |
Lustrzane odbicie obrazu względem osi X polega na wymianie zawartości dwu poziomych linii (oczywiście mowa o jednej iteracji), czyli kod wygląda mniej więcej tak:
memcpy(image[y1], temp_buffer, img_width); // temp = a; memcpy(image[y1], image[y2] , img_width); // a = b; memcpy(image[y2], temp_buffer, img_width); // b = temp;
Ilość przesłanych bajtów to 3*img_width — oczywiście należałoby założyć, że funkcja memcpy została zoptymalizowana — co jednak nic nie znaczy, a przynajmniej znaczy bardzo mało.
Proponuję zrobić to tak:
; edi - image[y1] ; esi - image[y2] mov ecx, img_width/4 swap_lines: mov eax, [edi] mov ebx, [esi] mov edx, eax ; zamiast xchg eax, ebx mov eax, ebx ; mov ebx, edx ; mov [esi], eax mov [edi], ebx add edi, 4 add esi, 4 loop swap_lines
Powyższy kod przerzuca tylko 2*img_width bajtów. Aby zwiększyć transfer można użyć rejestrów MMX bądź FPU — według dokumentacji Intela przyrost wydajności to co najmniej 20%.