 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
robbifan
Anmeldungsdatum: 18.05.2007 Beiträge: 43
|
Verfasst am: 28.05.2007, 10:21 Titel: grafik mit asm unter freebasic |
|
|
wer kann mir mal zeigen, wie man eine grafikroutine die in freebasic vorhanden (zb line) ist über einen asm befehl ansprechen kann?
oder wie sieht eine routine aus um zb nur einen pixel in asm zu setzen? |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 28.05.2007, 14:08 Titel: |
|
|
Den Bildschirm voll Pixeln:
Code: | Define ScrWid 320
#Define ScrHei 240
#Define ScrBpp 4
ScreenRes ScrWid, ScrHei, ScrBpp * 8
Dim As Integer x, y, c
Dim As Integer Ptr scrP
ScreenLock
scrP = ScreenPtr
For y = 0 To ScrHei - 1
For x = 0 To ScrWid - 1
c = RGB( Rnd * 255, Rnd * 255, Rnd * 255 )
Asm
mov eax , [scrP]
mov ebx , [c]
mov dword ptr [eax], ebx
End Asm
scrP += 1
Next
Next
ScreenUnLock
GetKey
|
Du musst dir halt jedes mal die Adresse des Pixels selbst berechnen.
Adresse = ScreenPtr + (y * xMax) + x
ScreenPtr ist eine FB-Funktion, siehe Referenz.
x und y sind deine Koordinaten.
xMax ist die Bildschirmbreite.
Vor dem ASM-Zugriff ScreenLock, sonst geht gar nix. Und danach mit ScreenUnlock entsperren, sonst wird das ganze zwar in den Speicher geschrieben, aber man sieht nix.
Have a nice day
Ciao
Dusky_Joe _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 28.05.2007, 14:49 Titel: |
|
|
dusky_joe, sicher dass das noch so ohne weiteres geht? das neue puffer-format von freeBASIC füllt die puffer ja immer so, dass die länge einer zeile durch 4 teilbar ist. wobei, SCREENs sind ja von natur aus durch 4 teilbar... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 28.05.2007, 15:54 Titel: |
|
|
Screen hat keine header, die Daten liegen direkt am ScreenPTR.
Somit sollte es auf diese Art gehen  _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 28.05.2007, 19:07 Titel: |
|
|
DAS weiß ich auch - aber soviel ich weiß, müssen die horizontalen pixeldaten immer durch 4 teilbar sein... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 01.06.2007, 22:50 Titel: |
|
|
Jojo hat schon recht - es gab mal diese Meldung, dass die Pixeldaten an Div-by-Four-Offsets liegen müssen. Ich denke aber, dass sich das nur auf ImageCreate-Puffer bezieht; wäre aber trotzdem einen Test wert....
Ja, auch folgendes Programm funktioniert:
Code: | #Define ScrWid 303
#Define ScrHei 240
#Define ScrBpp 1
ScreenRes ScrWid, ScrHei, ScrBpp * 8
Dim As Integer x, y, c
Dim As Byte Ptr scrP
ScreenLock
scrP = ScreenPtr
For y = 0 To ScrHei - 1
For x = 0 To ScrWid - 100
c = Rnd * 255
Asm
mov eax , [scrP]
mov ebx , [c]
mov byte ptr [eax], ebx
End Asm
scrP = ScreenPtr + (y * ScrWid) + x
Next
Next
ScreenUnLock
GetKey |
Und hier sind die Parameter so gelegt, dass es sich eben nicht um vierer-Offsets handelt.
Danke fürs Probelesen
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 02.06.2007, 10:39 Titel: |
|
|
auch nicht langsamer:
Code: | #Define ScrWid 303
#Define ScrHei 240
Screenres ScrWid, ScrHei, 8
Dim As Integer x, y, pitch
Dim As Byte Ptr scrP
'pitch hat immer die richtige Zeilenbreite in Byte
Screeninfo ,,,,pitch
Screenlock
scrP = Screenptr
For y = 0 To ScrHei - 1
For x = 0 To ScrWid - 1
scrP[x] = y * x
Next
scrP += pitch
Next
Screenunlock
Getkey |
viel Spass damit. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
robbifan
Anmeldungsdatum: 18.05.2007 Beiträge: 43
|
Verfasst am: 02.06.2007, 13:57 Titel: |
|
|
kannste die for-schleife auch mal in asm packen.
vielleicht wird es dann noch schneller. |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 02.06.2007, 20:38 Titel: |
|
|
Ich würd meinen, **** mach's selbst.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 02.06.2007, 23:15 Titel: |
|
|
bringt auch nichts, FBC schreibt schon guten ASM-code.
Das kann man, mit der Option -r, selber in der ASM-Datei nachprüfen. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 03.06.2007, 15:19 Titel: |
|
|
ASM...END ASM ist ja eh nur dazu eingebaut, um hochspezielle Berechnungen zu optimieren - wenn man bei zwei verschachtelten FOR-NEXT schon viel optimieren könnte, dann wäre FB sicher nicth so erfolgreich.
In diesem Fall ließe sich höchstens eines machen: Da sowiso der ganze Bildschirm gefüllt wird, kann man schreiben
FOR i = 0 To (ScrWid * ScrHei) - 1
Dann muss man aber anders auf die Farbwerte kommen.
Anyway, back to topic:
Um mit ASM zu zeichnen, musst du direkt in den Bildschirmpuffer schreiben. Dazu...
Musst du erst mal den Bildschirm sperren - SCREENLOCK
Das Offset deines Pixels manuell berechnen - siehe Formel ein paar Posts weiter oben
Das Start-Offset von Pixel (0, 0) bekommst du über SCREENPTR
An das berechnete Offset schreibst du den Farbwert. Das geht mit mov.
Nach dem Schreibvorgang gibst du den Bildschirm wieder frei, damit etwas angezeigt wird. Das geht mit SCREENUNLOCK.
Effektiv wird ASM erst, wenn du viele Speicherzugriffe zwischen SCREENLOCK und -UNLOCK hast. Beispiel: Du willst dir eine einege PUT-Routine schreiben. Wenn du jeden Pixel mit PSET anzeigst, ist es so, als würdest du für jeden Pixel einzeln S.Lock und S.Unlock aufrufen. kostet Zeit, und man kann dem Bildaufbau direkt zusehen. Wenn du dagegen erst lockst, dan die Pixel in den speicher schreibst, und dann unlockst, kannst du einiges an Zeit rausholen.
Jedenfalls gegenüber der Pset-Methode - die FB-eigene PUT-Routine ist noch mal ne ecke weiter optimiert, da sie z.T. prozessorspezifische Funktionen benutzt - Stichwort MMX.
Anyway, viel Spaß an diesem Themengebiet
Have a nice day
Ciao
Dusky_Joe _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
robbifan
Anmeldungsdatum: 18.05.2007 Beiträge: 43
|
Verfasst am: 04.06.2007, 18:43 Titel: |
|
|
ja, gute einweisung, habe wieder viel dazugelernt mit asm und freebasic.
mfg |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|