Bliting
-
Moin zusammen,
ich hätte eine kleine Frage. Ich habe mir folgende Funktion geschrieben, welches sehr gut funktioniert. Damit kopiere ich ein Bild in einen Buffer welcher dann als Grafik angezeigt wird.
void qBlit(unsigned int *buffer,struct image pict,int xPos,int yPos) { unsigned int i=0, bufferOffset=0, imageOffset=0; for (i=0;i<pict.imgH;i++) { memcpy(buffer+bufferOffset+yPos+xPos, pict.imgData+imageOffset, (pict.imgW*4)); bufferOffset+=(SCRX); imageOffset+=(pict.imgW); //int } return; }
Soweit so gut, ich habe zuerst alles "von Hand" umkopiert von einem Array in den nächsten, was natürlich viel Zeit gekostet hat, dafür aber volle kontrolle über die Pixel zuliess. Meine Frage lautet nun...
diese Funktion ist nun zwar schnell aber ich kann keine Transparenzen mehr angeben (Keycolor/Alpha etc.) oder sonstige SpecialEffects wie Multipy usw. Da es ja einfach nur ein "verschieben" ohne Abfragen ist.
Was wäre der schnellste Weg diese Effekte wieder hinzukriegen, natürlich möglichst performant?
-
schnellster Weg keine Ahnung, aber wenn dich prinzibel Alphablending interessiert:
http://turing.fh-landshut.de/~jamann/Alphablending.html
-
Danke für den Link.
Ich kenne natürlich die Theorie dahinter.
Aber ich weiss das ich sehr kompliziert denke und dementsprechen sind meine Programme, was sich meistens in der Performance zeigtIch kenne leider nicht alle C Befehle auswendig und schon gar nicht die Kniffs um sowas schnell zu machen. Ich muss ja für jedes Frame diese berechnung machen.
Ist es zB. sinnvoller von jedem Bild eine Kopie zu haben und den BG da hinein zu kopieren oder doch eher nur ein Bild in den BG kopieren usw usw...Leider habe ich im Web immer nur über das Hardware Blit von DirectX etc. Infos gefunden. Was ich suche ist eher sowas wie eine Blitererklärung aus dem Jahre 1995 oder so
-
wirklich schnell wirst du das "zu fuß" kaum hinbekommen. höchstens vielleicht so:
void qBlit (unsigned *buf, struct image *pict, int x, int y) { unsigned *dst,*src,*end,line_width,line_offs,i; line_width = pict->imgW; if(line_width==0) return; line_offs = line_width-pict->imgW; src = pict->imgData; dst = buf+x+SCRW*y; end = src+pict->imgH*line_width; while(src<end) { i=line_width; do { *dst=pixel_fx(*src++,*dst); dst++; } while(--i); dst+=line_offs; } }
-
@Konfusius
Vielen Dank!Jetzt weiss ich auch wieso Du den Loop so gemacht hast. Ich dachte bisher memcpy sein schnell...
Dieser Artikel hat mir etwas Aufklärung gebracht -> http://www.embedded.com/showArticle.jhtml?articleID=19205567Ich werde wohl einfach die verschiedenen Dinger ausprobieren und gucken was mir wann am meisten hilft.