DOSferatu hat geschrieben:@freecrac: So eine Tabelle mit Zeilenanfängen habe ich ebenfalls seit Jahren in meinen Grafik-Units.
Beginnend mit der Programmierung in Assembler auf dem C64er waren dort Fließpunktberechnungen ohne FPU extrem langsam so das sich so eine vorher berechnete Tabelle immer anbot wenn es schnell gehen sollte.
Heute Frage ich mich jedoch ob der relativ langsame Speichtzugriff auf die Tabelle nicht lagsamer ist als eine direckte Berechnung mit der FPU auch wenn es schnell gehen soll. Ich habe hier auch noch eine Integer-Sinustabelle in der Sammlung die dann bei Bedarf nachgeladen werden kann.
Und meine neuere Unit, die 8it, 15bit, 16bit, 24bit und 32bit Grafik darstellen kann, benutzt als Bildbuffer den XMS. Ich habe dort auch so "Überblende" Dinge eingebaut - d.h. man kann mit 32bit Farben zeichnen, die unteren 3 Byte sind Blau,Grün,Rot - das oberste Byte ist "Alpha", also die Transparenz der Farbe, wobei bei mir 0=undurchsichtig und 255=maximale Transparenz ist. Wenn man in anderen Modi als 24bit/32bit zeichnet, wird das bei der Ausgabe heruntergerechnet - intern arbeitet das ganze Ding immer mit 32bit Farben. Ich habe dazu spezielle Subroutinen für jede der 5 Farbtiefen, die entsprechend zugewiesen werden, je nachdem, welchen Modus man einschaltet...
Was meinst du genau mit 5 Farbtiefen?
Und ja - in manchen Sachen, die ich programmiere, lese ich auch mal den Grafikspeicher aus. Ich weiß, daß das zwar langsamer ist als schreiben, aber wenn ich z.B. so etwas wie einen Mauspfeil benutze, rette ich eben dieses winzige Stück Grafik unterhalb des Mauszeigers in einen Puffer.
Für einen kleinen Mouszeiger genügt das bestimmt.
Anmerkung:
Ich habe in meinem Vorstellungs-Beitrag neben dem Beispiel einer Tastaturabfrage auch noch ein Beispiel für eine PS2-Mousabfrage hinzugefügt.
viewtopic.php?f=10&t=5829&p=15163#p15163Wie ich dort auch schon erwähnt habe kann ein damit verwendeter Mousezeiger beliebige Ausmaße und Formen besitzen und in einem 24Bit-Targa-Bild mit schwarzen Hintergrund bereitgestellt und verwendet werden.
Um die Mousezeiger-Routine etwas zu beschleunigen habe ich dort MMX-Befehle/Register für die Lese/Schreib-Operationen verwendet um die SIMD- und die Integer-Unit paralell zu benutzen. Das brachte schon sichtbare Erfolge.
(Das Laden des Targa-Bildes und das Aufbereiten zu einem Mouszeigers ist dort allerdings nicht im Beispiel enthalten, damit das Beispiel möglichst klein bleibt und damit hoffentlich etwas leichter zu verstehen ist.)
Wenn jedoch große Bereiche des Bildes fortlaufend flicker und ruckelfrei verändert werden sollen eignet sich Vesa hardware triple buffering. Die gewöhnliche Methode nur das Ende des Rasterstrahls abzufragen um dann im Grafikkartenspeicher die Änderungen direckt vorzunehmen stößt hier schnell an seine Grenzen. Schnell bewegte Objekte verschwinden im oberen Bildbereich und werden dort gar nicht mehr angezeigt, wenn unser Schreibvorgang zu lange dauert bis der nächste Rasterstrahl das Bild erneut zur Anzeige bringt. Mit dem triple buffering haben wir qausi drei komplette Bilder die wir zyklisch im Wechsel beschreiben müssen.
Für das Überblenden von einem Bild zu einem anderen Bild genügt es aber auch das Bild jeweils im Ram aufzubereiten und wenn fertig zum 'Grafikkartenspeicher zu kopieren.
(Getestet mit AMDK6-2@550mhz/MatroxMILL2(PCI,4MB) und Targa-Bildbetrachter unter Linux gebootet mit Framebuffer-Device(fb0) in 1024x768x32.)Dirk