DrawImage vs. DrawPic

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Kryan

Betreff: DrawImage vs. DrawPic

BeitragDo, März 04, 2004 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Function DrawPic(bild,x,y)
iw=ImageWidth(bild)
ih=ImageHeight(bild)
ib=ImageBuffer(bild)
For pixelX=1 To iw
 For pixelY=1 To ih 
  CopyPixel pixelX,pixelY,ib,pixelx+x,pixely+y,0
 Next
Next
End Function

Hmm, das ist mein DrawImage, ist der langsamer als der andre oder nit?
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!
 

HOT-BIT

Gast

BeitragDo, März 04, 2004 19:34
Antworten mit Zitat
Hmmm....

Langsamer als welcher andere ?

Toni

TheShadow

Moderator

BeitragDo, März 04, 2004 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
deine Funktion ist langsamer. DrawImage ist Hardwarebeschleunigt und optimiert
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Kryan

BeitragDo, März 04, 2004 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
um wieviel ist er bei euch langsamer?
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

Jolinah

BeitragDo, März 04, 2004 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab 500 mal das selbe Bild mit 3 Funktionen gezeichnet:

DrawPic: 6174 ms

DrawBlock: 1 ms

DrawImage: 2 ms


Ich denke das sagt alles *g*

DrawImage ist bisschen langsamer weil es auf die Transparenz achtet.
Ab und zu krieg ich aber auch mit DrawImage nur 1 ms.

Mein Code:
Code: [AUSKLAPPEN]

Graphics 800,600,0,2
SetBuffer BackBuffer()

m = LoadImage("test.bmp")

dif1 = 0
dif2 = 0
dif3 = 0
time = 0

Delay(1000)


Cls
   
   time = MilliSecs()
   For i = 1 To 500
      DrawPic(m,20,20)
   Next
   dif1 = MilliSecs() - time

Flip
   
   
Cls   

   time = MilliSecs()
   For i = 1 To 500
      DrawBlock m, 20, 20
   Next
   dif2 = MilliSecs() - time

Flip


Cls   

   time = MilliSecs()
   For i = 1 To 500
      DrawImage m, 20, 20
   Next
   dif3 = MilliSecs() - time

Flip


EndGraphics()

Print "DrawPic: " + dif1
Print "DrawBlock: " + dif2
Print "DrawImage: " + dif3
WaitKey()

End

   
FreeImage m


;------------------------------------------
Function DrawPic(bild,x,y)
iw=ImageWidth(bild)
ih=ImageHeight(bild)
ib=ImageBuffer(bild)
For pixelX=1 To iw
For pixelY=1 To ih
CopyPixel pixelX,pixelY,ib,pixelx+x,pixely+y,0
Next
Next
End Function

Blatolo

BeitragDo, März 04, 2004 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke der Funktionsaufruf macht schon einen gewissen Geschwindigkeitsunterschied aus, denn dieser benötigt einige Zeit und das wird dann ja mit 500 multipliziert.
Man müsste das mal testen wenn man die Funktion direkt in die Schleife schreibt.
Wird zwar immer noch um einiges langsamer sein aber nicht mehr so stark wie jetzt.

Jolinah

BeitragFr, März 05, 2004 2:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Soviel macht ein Funktionsaufruf auch nicht aus:


code direkt in der for schleife und diverse variablen vorgespeichert so das sie nicht immer neu ermittelt werden müssen (bildbreite, höhe und buffer)

Code: [AUSKLAPPEN]

Graphics 800,600,0,2
SetBuffer BackBuffer()

m = LoadImage("test.bmp")

dif1 = 0
dif2 = 0
dif3 = 0
time = 0
x = 20
y = 20

iw=ImageWidth(m)
ih=ImageHeight(m)
ib=ImageBuffer(m)


Delay(1000)


Cls

time = MilliSecs()
For i = 1 To 500
   For pixelX=1 To iw
      For pixelY=1 To ih
         CopyPixel pixelX,pixelY,ib,pixelx+x,pixely+y,0
      Next
   Next
Next
dif1 = MilliSecs() - time

Flip


Cls

time = MilliSecs()
For i = 1 To 500
DrawBlock m, 20, 20
Next
dif2 = MilliSecs() - time

Flip


Cls

time = MilliSecs()
For i = 1 To 500
DrawImage m, 20, 20
Next
dif3 = MilliSecs() - time

Flip


EndGraphics()

Print "DrawPic: " + dif1
Print "DrawBlock: " + dif2
Print "DrawImage: " + dif3
WaitKey()

End


FreeImage m


Seltsamerweise brauchts bei mir jetzt noch mehr Zeit als mit ner Funktion Very Happy

Durchschnitt:

DrawPic: 6200 ms
DrawBlock: 1 ms
DrawImage: 1 ms


Edit: Also wenn ich es mehrmals mit beiden Teste bekomme ich mit beiden ungefähr den selben Wert. Der Unterschied ist höchstens mal 50ms.

Blatolo

BeitragFr, März 05, 2004 7:18
Antworten mit Zitat
Benutzer-Profile anzeigen
hätte mit mehr Zeit dafür gerechnet.
Aber wie kann es denn ohne Funktion langsamer sein?
Aber das Drawpic um einiges langsamer ist wäre damit ja wohl beweiesen.
Wenn etwas vorgegeben ist, ist es meistens schneller als selbst gecodete Sachen.
Denn wie TheShadow schon sagte sind die vorgefertigten Hardwarebeschleunigt und optimiert.

Jolinah

BeitragFr, März 05, 2004 11:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja ich denke mit Funktionen ist es schon ein paar ms langsamer. Die Werte schwanken halt sehr.

Trotzdem seh ich keinen Grund wieso eine Funktion auch viel langsamer sein sollte.

Rein von Assembler her gesehen ist der Unterschied zu ner Sprungmarke vielleicht das die Parameter der Funktion mit push gespeichert werden, dann gesprungen wird, und in der Sprungmarke wieder gelesen werden mit pop. Und Funktionen haben nen Return Wert, das heisst es wird wieder was gespeichert bevor zurück zur alten Position gesprungen wird.

Also denke ich liegt der grösste Geschwindigkeitsverlust von Funktionen bei den Parametern.

Falls das komplett Falsch ist was ich mir da gedacht hab dann berichtigt mich Smile

TheShadow

Moderator

BeitragFr, März 05, 2004 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Geschw.verlust durch Funktion in dem Fall liegt bei 0,00001%

Selbst wenn der Code in ASM konvertiert wird, ist der Overhead viel zu groß (Bremse ist hier Schleife und VRAM-Zugriff).
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

regaa

BeitragFr, März 05, 2004 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
http://www.blitzbase.de/tutorials/shadow_4.htm hat Folgendes geschrieben:

#25 - Gosub statt Function
Der Befehl Gosub ist wesentlich schneller als Function. Der Unterschied ist sogar sehr gewaltig. Darum nehmt besser Gosub. Dies kann aber oft zu unübersichtlichen Programmen führen.
Wink

Kryan

BeitragFr, März 05, 2004 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
aber meins würde auch ein bild malen, wenn kein Graphics Modus an ist , nicht?
nagut, ein bild laden muss man mit graphics aber danach kann man doch das bild laden und blablabla oder geht ImageBuffer() nur im gfx-modus?
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

TheShadow

Moderator

BeitragFr, März 05, 2004 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@regaa

Man muss unterscheiden wann es zutrifft - da du die Funktion nur paar hundert mal aufrufst, hast du dadurch nix gewonnen oder verloren. GOTO ist dann gut, wenn du 10000de (oder 100000de) Sprünge hast, dann merkst du den Unterschied schon eher

Die Schleife verbratet hier die ganze Rechenzeit
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

regaa

BeitragFr, März 05, 2004 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, hast Recht, ich denk spielt sich in einer schleife wirllich um irgendwelche 100stel von 1 ms, das den unterschied ausmacht, und sowieso, was fürn depp nutzt denn gosub Rolling Eyes .
 

dubitat

BeitragSa, März 06, 2004 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
ich nehm nur goto statt funktionen Very Happy (scherz nein aber wo es sich nicht vermeiden lässt nehme ich ein goto...
Erare humanum est - Irren ist Menschlich
 

Ava

Gast

BeitragSa, März 06, 2004 11:41
Antworten mit Zitat
Wie kommt man eigentlich auf die Idee, so eine unsinnige Funktion zu schreiben?
Das sie um vieles langsamer ist, als ein Standartbefehl, kann man auf den ersten Blick erahnen, oder? denke ich...
Frag mich halt grad, wo da der Nutzen für Dich ist? bzw. mit welcher Überlegung Du die gecodet hast, war Dir das drawBlock zu langsam?

PS: soweit ich weis, ist drawImage einen Tick schneller als drawBlock, wenn lohnenderweise viele Transparentpixel wegfallen. Ich denke, so pauschal kann man das gar nicht sagen, was da schneller ist und was nicht.

Kryan

BeitragSa, März 06, 2004 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
ich wollte ja nur wissen, um wieviel es langsamer es ist
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

MVB

BeitragSa, März 06, 2004 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist grundsetzlich so, schreibe nie eine Funktion die es in der Programmiersprache sowieso schon gibt. Das kann nur langsamer werden.

TheShadow

Moderator

BeitragSa, März 06, 2004 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
hm nicht unbedingt... ich habe eine Skalierroutine gecodet, die schneller als die von BB ist... die Skalierroutine hat wahrscheinlich Mark selbst gecodet - glaube nicht, dass es sowas in DX gibt...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group