Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

poke/peek statt pset/point
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 18.06.2007, 22:45    Titel: poke/peek statt pset/point Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 19.06.2007, 00:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 19.06.2007, 06:27    Titel: Antworten mit Zitat

Danke, das vereinfacht natuerlich einiges, aber...
diese variante ist ja sogar noch langsamer als peek/poke
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 19.06.2007, 08:03    Titel: Antworten mit Zitat

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. verwundert
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 19.06.2007, 08:23    Titel: Antworten mit Zitat

jepp mit dem Kopf durch die Mauer wollen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 19.06.2007, 09:45    Titel: Antworten mit Zitat

Sooooo grinsen

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 grinsen

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: durchgeknallt Sorry... btw.. bei direkten Pointer adressierungen muss man aufpassen was man tut, ich hab mir irgendwie auf den desktop geschrieben durchgeknallt
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 19.06.2007, 14:53    Titel: Antworten mit Zitat

zeig mal den code zum letzten edit, bitte durchgeknallt
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 19.06.2007, 20:50    Titel: Antworten mit Zitat

mit den source kann ich nicht mehr dienen, da mir das ganye auch erst spaeter aufgefallen ist durchgeknallt



Hier aber ein kleiner Screenshot... die roten Streifen, gehoeren da nicht hin grinsen
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 19.06.2007, 22:38    Titel: Antworten mit Zitat

[OT]
neeeeiiiinnnn!!! msie 7.0!!!!


obwohl.... firefox auch da grinsen

ahh mal wieder ein artweaver nutzter *artweaver toll find*
[/OT]
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 19.06.2007, 22:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 19.06.2007, 23:17    Titel: Antworten mit Zitat

sag mal Eternal_pain, was hast du für nen PC?
Zitat:
'PSet_ Function
' ~6.7s
kann nur ein Ablesefehler sein? weinen
Das gleiche Prog dauert bei mir 0.0005808sec grinsen
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 happy )
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 19.06.2007, 23:24    Titel: Antworten mit Zitat

hmm.. ja, die 6sec erschienen mir auch nicht wirklich realistisch, aber so hat ers mir angezeigt grinsen



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 durchgeknallt
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 19.06.2007, 23:51    Titel: Antworten mit Zitat

ääh, durchgeknallt
dir wird dort 6.89 *10^-4 angezeigt, also 0.000698sec grinsen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 20.06.2007, 11:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 20.06.2007, 11:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 20.06.2007, 12:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 20.06.2007, 13:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 20.06.2007, 14:49    Titel: Antworten mit Zitat

Wieso extra Thread?
Kann ich mir schwer vorstelln...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 20.06.2007, 15:03    Titel: Antworten mit Zitat

weils auf mutlicoreeren dann schneller is zwinkern und selbst auf SC-Systemen ist es schnelller....
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 20.06.2007, 17:23    Titel: Antworten mit Zitat

Auf Single-Core-Systemen ist es definitiv nicht schneller. peinlich
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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
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.

 Impressum :: Datenschutz