Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 18.06.2007, 22:45 Titel: poke/peek statt pset/point |
|
|
Hi,
nachdem ich viel mit ImageCreate arbeite und bisher diesen mit pset beschrieben bzw mit point ausgelesen habe, dachte ich eigentlich das es direkt mit peek und poke schneller gehen sollte,
http://www.freebasic-portal.de/fbporticula/15
hier hab ich einen kleinen Test gemacht, der leider nicht sehr vielversprechend ist.
Geht es noch besser/anders/schneller? _________________
 |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 19.06.2007, 00:01 Titel: |
|
|
Man braucht peek und poke gar nicht. Mach es doch einfach per Pointer, also ungefähr so:
Code: |
Screenres 800,600, 32
Dim As UInteger Ptr scptr
scptr = ScreenPtr
For x As Integer = 1 To 100
For y As Integer = 1 To 100
scptr[x + y*800] = RGBA(Int(RND*256), Int(RND*256), Int(RND*256), Int(RND*256))
Next y
Next x
Print "Der Pixel an der Position 10, 55 hat die Farbe &H" & Hex(scptr[10 + 55*800])
Pset(10, 10), &H12345678
Locate 10: Print "Der Pixel an der Position 10, 10 sollte die Farbe &H12345678 haben...";
If Hex(scptr[10 + 10*800]) = "12345678" Then
Print " ...die hat er auch."
Else
Print " ...leider hat er die Farbe &H" & Hex(scptr[10 + 10*800])
End If
Sleep
|
_________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 19.06.2007, 06:27 Titel: |
|
|
Danke, das vereinfacht natuerlich einiges, aber...
diese variante ist ja sogar noch langsamer als peek/poke _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 19.06.2007, 08:03 Titel: |
|
|
Code: | Screenres 800,600, 32
Dim As UInteger Ptr scptr
scptr = ScreenPtr
For y As Integer = 0 To 99
For x As Integer = 0 To 99
scptr[x] = &HFFFFFF00
Next x
scptr += 800
Next y | So immer noch langsamer?
Wenn du unter Windows die Laufzeiten misst, denke daran das du mit einem Multitasking System arbeitest.  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 19.06.2007, 08:23 Titel: |
|
|
jepp
Code: |
screen 19,32
Dim test1 as any ptr
test1=Imagecreate(100,100)
Dim test2 as uinteger ptr
test2=ImageCreate(100,100)
Dim test3 as ubyte ptr
test3=ImageCreate(100,100)
Dim XTime as double
sleep 100,1
XTime=Timer
for y as integer=0 to 99
for x as integer=0 to 99
pset test1,(x,y),&hFFFF0000
next x
next y
put (10,100),test1,pset
?Timer-Xtime
sleep 100,1
sleep 100,1
XTime=Timer
dim adr as integer
dim pitch as uinteger
pitch=peek(uinteger,test3+16)
for y as integer=0 to 99
for x as integer=0 to 99
adr=7+(x)+(y*(pitch/4))
test2[adr]=&hFFFF0000
next x
next y
put (120,100),test2,pset
?Timer-Xtime
sleep 100,1
XTime=Timer
dim adr1 as any ptr
dim pitch1 as uinteger
pitch1=peek(uinteger,test3+16)
for y as integer=0 to 99
for x as integer=0 to 99
adr1=test3+(32)+(x*4)+(y*pitch1)
poke uinteger,adr1,&hFFFF0000
next x
next y
put (230,100),test3,pset
?Timer-Xtime
sleep
imagedestroy(test1)
imagedestroy(test2)
imagedestroy(test3)
|
_________________
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 19.06.2007, 09:45 Titel: |
|
|
Sooooo
wenn man es richtig anstellt kann der direkte zugriff auf eine pointer adresse wirklich schneller sein, was bei groesseren schreib und lese prozessen sicher mehr als lohnenswert ist.
als eigene funktion bringt aber nicht wirklich etwas, im gegenteil, es ist erschreckend langsam. Mein schluss dazu ist, das es keine Perfekte allround rountine fuer dieses oder jenes gibt, sondern je nach zweck immer wieder nach der optimalen moeglichkeit gesucht werden muss...
diese beiden Codes zB bringen einen ganz klaren Sieger hervor
Code: |
'pset
' ~2.1s
Screen 19,32
Dim Test as uinteger ptr
Test=ImageCreate(100,100)
Dim XTimer as double
XTimer=Timer
for y as integer=0 to 99
for x as integer=0 to 99
PSet Test,(x,y),&hFFFF0000
next x
next y
?Timer-XTimer
put (100,100),Test,pset
ImageDestroy(Test)
sleep
|
Code: |
'PSet_ Function
' ~6.7s
Function PSet_ (ByRef Buffer as UInteger ptr,byval xpos as integer, _
byval ypos as integer, byval col as uinteger) as integer
dim adr as integer
dim pitch as uinteger
pitch=Buffer[4]/4
adr=7+(ypos*pitch)+xpos
Buffer[adr]=col
Return 0
End Function
Screen 19,32
Dim Test as uinteger ptr
Test=ImageCreate(100,100)
Dim XTimer as double
XTimer=Timer
for y as integer=0 to 99
for x as integer=0 to 99
PSet_ (Test,x,y,&hFFFF0000)
next x
next y
?Timer-XTimer
put (100,100),Test,pset
ImageDestroy(Test)
sleep
|
Edit: interessant ist auch, wenn man anstatt einer function eine sub benutzt es noch einmal um ein paar ms langsamer wird...
Edit: Sorry... btw.. bei direkten Pointer adressierungen muss man aufpassen was man tut, ich hab mir irgendwie auf den desktop geschrieben  _________________
 |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 19.06.2007, 14:53 Titel: |
|
|
zeig mal den code zum letzten edit, bitte  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 19.06.2007, 20:50 Titel: |
|
|
mit den source kann ich nicht mehr dienen, da mir das ganye auch erst spaeter aufgefallen ist
Hier aber ein kleiner Screenshot... die roten Streifen, gehoeren da nicht hin  _________________
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 19.06.2007, 22:41 Titel: |
|
|
jepp... IE sollte man wenigstens zum Testen haben, auch wenn ich meistens FF benutze...
btw: ne, bin kein Artwaever nutzer, das Programm ist Muell!! Hab das auch nur ausprobiert... _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 19.06.2007, 23:17 Titel: |
|
|
sag mal Eternal_pain, was hast du für nen PC?
Zitat: | 'PSet_ Function
' ~6.7s | kann nur ein Ablesefehler sein?
Das gleiche Prog dauert bei mir 0.0005808sec
Und so:
Code: | ' 0.00009219sec
Screen 19,32
Dim As Uinteger Ptr Test = ImageCreate(100,100)
Dim As Double XTimer = Timer
Dim As Uinteger adr = 7, pitch = Test[4]\4
For y As Integer=0 To 99
For x As Integer=0 To 99
Test[adr+x]=&hFFFF0000
Next x
adr += pitch
Next y
?Timer-XTimer
Put (100,100),Test,Pset
Sleep
ImageDestroy(Test) | also 6x schneller (und ohne Desktopmalerei ) _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 19.06.2007, 23:24 Titel: |
|
|
hmm.. ja, die 6sec erschienen mir auch nicht wirklich realistisch, aber so hat ers mir angezeigt
ja, das direkte schreiben aehnlich wie in deinem Beispiel hab ich auch versucht, und das ist dann tatsaechlich sogar schneller als mit pset, das die funktion zum setzen eines einzelnen pixels allerdings nicht dafuer geeignet ist wohl die staendige neurechnung der adresse...
wobei man wohl davon ausgegehn kann das man ein Buffer selten bis gar nicht pixelweise ausfuellt  _________________
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 19.06.2007, 23:51 Titel: |
|
|
ääh,
dir wird dort 6.89 *10^-4 angezeigt, also 0.000698sec  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 20.06.2007, 11:43 Titel: |
|
|
Ich wollte schon sagen oO
Direkter Speicherzugriff ist vieeeel schneller als PSET.
Jetzt könnte man denken, wieso macht FB das nicht so schnell?
Ganz einfach: Pset ausserhalb des Bereiches könnte bei direktem Speicherzugriff das Programm zum Absturz bringen, PSET macht unzählige Überprüfungen, bevor gezeichnet wird. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 20.06.2007, 11:58 Titel: |
|
|
Ich wundere mich bei diesem Thread höchstens, dass anscheinend direkter (oder höchstens pseudo-direkter) Speicherzugriff möglich ist, denn sonst sperrt ja der Windows-Kernel die Hardware und damit den physischen Videospeicher der Grafikkarte vollständig und abstrahiert das Ganze mit den Routinen des Grafiktreibers und damit der GDI-Schnittstelle. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 20.06.2007, 12:53 Titel: |
|
|
Das findet doch noch im System-RAM statt, was hier getan wird...
und wird dann via fbgfx über Systemfunktionen (Unter Windows DirectDraw & GDI, unter Linux XWindow) übertragen...
wär ja zu schön wenn man die Hardware direkt steuern könnte... |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 20.06.2007, 13:20 Titel: |
|
|
Jepp, man schreibt in den FB internen Buffer.
Ich glaube, jede FreeBASIC exe hat automatisch 1 zusätzlichen Thread, in dem immer der Bildbuffer "geupdated" wird. Desswegen sollte man immer Screenlock/Screenunlock verwenden, wenn man mehrere Sachen in den Buffer zeichnet (mit den FB funktionen (PSET, etc)), denn sonst wird bei jedem Aufruf der gesamte Bildbuffer (was bei 1024*768*4= 3MB lange dauert) kopiert. Wenn man den Screen vorher sperrt, wird der Buffer erst beim entsperren kopiert. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 20.06.2007, 14:49 Titel: |
|
|
Wieso extra Thread?
Kann ich mir schwer vorstelln... |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 20.06.2007, 17:23 Titel: |
|
|
Auf Single-Core-Systemen ist es definitiv nicht schneller.
Wenn du dir nur kurz überlegst, was für ein "Aufwand" betrieben werden muss, damit ein Thread gewechselt wird.
Es ist lediglich eine sauberere Möglichkeit. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
|