DrawImage vs. DrawPic
Übersicht

![]() |
KryanBetreff: DrawImage vs. DrawPic |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-BITGast |
![]() Antworten mit Zitat |
|
---|---|---|
Hmmm....
Langsamer als welcher andere ? Toni |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
deine Funktion ist langsamer. DrawImage ist Hardwarebeschleunigt und optimiert | ||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
um wieviel ist er bei euch langsamer? | ||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
dubitat |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich nehm nur goto statt funktionen ![]() |
||
Erare humanum est - Irren ist Menschlich |
AvaGast |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich wollte ja nur wissen, um wieviel es langsamer es ist | ||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
![]() |
MVB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es ist grundsetzlich so, schreibe nie eine Funktion die es in der Programmiersprache sowieso schon gibt. Das kann nur langsamer werden. | ||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group