Cześć,
zastanawiam się czy jest możliwe rozwiązanie pewnego problemu.
W skrócie: uzyskać optymalną wydajność wypełniając bufor nie tylko linia po lini ale i kolumna po kolumnie.
Poniżej opis:
Dany jest bufor graficzny (tzn. z przeznaczeniem do trzymania bitmapy)
#define WIDTH 320
#define HEIGHT 256
typedef struct
{
unsigned char r,g,b;
}sRGB;
sRGB* bufor_1;
main()
{
bufor_1 = (sRGB*)malloc(WIDTH*HEIGHT*sizeof(sRGB));
}
Problemu nie ma w przypadku wypełniania go poziomo linia po linii, gdyż jest to przypadek 'cache friendly', czyli najlepszy, np. raycastowanie podłogi i sufitu:
main()
{
bufor_1 = (sRGB*)malloc(WIDTH*HEIGHT*sizeof(sRGB));
for (int y = 0; y < HEIGHT; ++y)
{
for (int x = 0; x < WIDTH; ++x)
{
bufor_1[x+y*WIDTH].r = 100;
}
}
}
Różnica w wydajności pojawia się, gdy taki bufor chcemy uzupełnić pionowo czyli kolumna po kolumnie, np. raycastowanie ścian które tak się właśnie odbywa, tj.
main()
{
bufor_1 = (sRGB*)malloc(WIDTH*HEIGHT*sizeof(sRGB));
for (int x = 0; x < WIDTH; ++x)
{
for (int y = 0; y < HEIGHT; ++y)
{
bufor_1[x+y*WIDTH].r = 100;
}
}
}
Pytanie jakie się pojawia, to czy można jakoś połaczyć wydajne uzupełnianie linia po lini i kolumna po kolumnie.
Z paru testów, które przeprowadziłem wyszło że jeżeli przedstawi się bufor jako dwuwymiarowy tj. bufor_2**
wypełnianie kolumna po kolumnie jest nawet szybsze niż linia po linii w jednowymiarowym - ale wtedy jest na odwrót czyli wypełnieni takiego dwuwymiarowego bufora linia po lini będzie mało wydajne.
Rozwiązania o których myślałem:
- obrócić bufor o 90 stopni, niestety to zabiera zbyt dużo czasu, przynajmniej algorytmami które sprawdzałem,
chyba że istnieje jakiś mega szybki sposób N(1)
- jakieś przemapowanie bufora tak żeby jakaś tablica zawierała wskażniki do kolejnych pixeli w kolumnie, ale to chyba też nie bedzie 'cache friendly' albo nawet gorzej - nie sprawdzalem w każdym razie