Moin!
Nicht wegen der Registerbreite sondern eher mit der Breite des Datenbusses. Da dieser 32 Bit gross ist und wenn dann noch die Daten an einer durch 4 teilbaren Adresse liegen, dann kann die CPU alle 4 Byte komplett mit einem Lesezyklus lesen. Wenn du nun aber einen 24 Bit Bild hast, dann liest die CPU (abhängig vom Modell) entweder einmalig 32 Bit und schmeisst ein Byte weg, oder er liest ein Word und danach nochmal ein Byte. Dieses sind dann schon 2 Lesezyklen. Die heutigen Prozessoren würden da die erste Methode nutzen. Nun aber zu dem Problem dahinter: Wenn du nun Anfang der Zeile mit Pixelwerten a 24 Bit stehst und diese Adresse ist aligned auf eine gerade 32 Bit Adresse (die die CPU perfekt in einem Zyklus lesen kann) liegt und jetzt den 2. Pixel lesen willst, dann ist Stress angesagt:
1. Pixel: gerade Adresse (32 Bit aligned) (Offset 0000)
2. Pixel: ungerade Adresse (Offset 0003)
3. Pixel: gerade Adresse (aber nicht 32 Bit aligned) (Offset 0006)
4. Pixel: ungerade Adresse (Offset 0009)
5. Pixel: gerade Adresse (32 Bit aligned) (Offset 0012)
Daher. Bei dem 2. und 4. Pixel muss der Prozessor noch 2 extra Lesezyklen einschieben um den Wert aus dem
RAM zu lesen, beim 3. einen extra (2x 1 Word lesen) und nur den 1. und 5. Pixel kann er in einem Rutsch auslesen.
Bei den älteren Prozessoren waren Daten die nicht an eine gerade 32 Bit Adresse angepasst waren fast schon Performance-tödlich. Heutzutage sorgen Data Prefetch und Cache Management dafür, das der Cache die Daten sich schon vorher besorgt - aber trotzdem sind es Geschwindigkeitseinbussen.
Zu dem 4. Byte bei 32 Bit: Die normalen
WinAPI Funktionen ist das 4. Byte egal. Die AlphaBlend() Funktion hingegen arbeitet schon damit und nutzt es als Alphachannel für die Pixel.
DirectX wiederrum nutzt das 4. Byte auch - z.T: auch anders und nicht als Alphachannel... Hauptvorteil von 32 Bit: an gerade 32 Bit Adresse angelegte Daten. Selbst Windows sorgt dafür, das der erste Pixel
pro Zeile an einer 32 Bit gerade Adresse liegt bei den 32 Bit Bitmaps...
MfG
Muetze1