Bitte um Speed und crash test von meiner Lupen Funktion !!!!
Übersicht

![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe leider nichts dazu gefunden, wie man Images aus Banks macht, aber ich habe mal einen Speed-Test zusammengestellt für alle Arten, wie man generierte Bilder auf den Schirm kriegt:
BlitzBasic: writeCycles = Input("Writes: ") Die Eingabeparameter sind: "Writes": Wie viele Bilder neu erstellt werden. "Draws per Write": Wie oft jedes dieser Bilder gezeichnet wird. Damit kann man sowohl den Fall testen, dass es in jedem Frame eine Änderung gibt (wildes Herumgeschmiere) als auch dass das Bild eine längere Zeit gleich bleibt. Zuerst mal zu den einzelnen Methoden: -Direct Write: Jedes Pixel wird mittels WritePixelFast einzeln auf den Frontbuffer gezeichnet. Das Bild wird nicht zwischengespeichert. Jedes Mal wird das Bild neu auf den Frontbuffer gezeichnet. (Das ist das, was dein Programm momentan macht, nur mit dem Backbuffer, soweit ich verstehe). -Draw from RAM: Das Bild wird mit WritePixelFast in ein Bild-Handle geschrieben, das sich im Scratch-Modus befindet (=das Bild liegt im RAM). Beim Zeichnen wird das Bild dann mit DrawBlock (um Masking zu verhindern) auf den Frontbuffer gezeichnet. -Draw from VRAM: Gleich wie Draw from RAM, nur dass sich das Bild im Dynamic-Modus befindet, was heißt, dass das Bild im VRAM liegt. -Blit RAM to VRAM: Zuerst wird das Bild in ein Scratch-Bild im RAM gezeichnet und das gesamte Bild wird dann in ein Dynamic-Bild im VRAM geschrieben (mittels DrawBlock). Beim Zeichnen wird das VRAM-Bild auf den Frontbuffer geschrieben -Managed Image: So wie Draw from RAM, nur dass es sich um ein Bild im Managed-Mode handelt, das sowohl im RAM als auch im VRAM liegt. Ich habe zwei verschiedene Tests auf beiden Grafikkarten laufen lassen. Der erste Test war 1 Write, 100 Draws per Write, also ein Bild wird erstellt und 100 Mal gezeichnet. Der zweite Test war 100 Writes, 1 Draw per Write, also 100 Bilder werden erstellt und je 1 Mal gezeichnet. Das sind die Ergebnisse: Code: 1/100
Nvidia 635M: -Direct Draw: 4615 -Draw from RAM: 796 -Draw from VRAM: 51 -Blit RAM to VRAM: 39 -Managed Image: 25 Intel HD 4000: -Direct Draw: 6485 -Draw from RAM: 796 -Draw from VRAM: 84 -Blit RAM to VRAM: 65 -Managed Image: 40 100/1 Nvidia 635M: -Direct Draw: 4636 -Draw from RAM: 1311 -Draw from VRAM: 2385 -Blit RAM to VRAM: 2839 -Managed Image: 1077 Intel HD 4000: -Direct Draw: 6478 -Draw from RAM: 1305 -Draw from VRAM: 3302 -Blit RAM to VRAM: 3671 -Managed Image: 1005 Was als erstes auffällt ist, dass das direkte auf den Bildschirm malen mit Abstand die langsamste Lösung ist, selbst wenn sich das Bild jedes Frame ändert. Das nächste ist, dass Draw from RAM auf beiden Karten fast genau gleich schnell ist. Das liegt daran, dass hier der Flaschenhals der RAM ist. Bei stark veränderlichen Bildern ist die RAM-Lösung recht gut, aber wenn das Bild längere Zeit (100 Frames sind bei Normalbetrieb knapp über 1.5 Sekunden) unverändert bleibt, dann ist es deutlich hinter den anderen Methoden. Vom VRAM zeichnen ist sehr schnell, aber in den VRAM schreiben braucht leider seine Zeit, und davon nicht zu knapp. Diese Methode hilft nur wirklich, wenn das Bild länger unverändert bleibt. In den RAM schreiben und den dann als Ganzes in den VRAM schieben rennt schneller als vom VRAM zeichnen, solange das Bild ein paar Frames gleich bleibt. Das sieht man in den Tests hier nicht, kann man aber ja recht leicht nachmachen. Ist aber bei Änderungen in jedem Frame ein Stück langsamer. Solange das aber nicht die Norm ist, rennt diese Methode bislang am Schnellsten. All das wird allerdings hinfällig, sobald man zu den Managed-Bildern kommt. Die liegen sowohl im RAM als auch im VRAM (und verbrauchen somit ein wenig mehr Speicher). Es ist im Grunde eine native Implementierung von meinem Blit-Versuch und rennt verdammt schnell. Interessanterweise ist diese Methode sowohl dann am Schnellsten, wenn sich das Bild oft verändert, als auch dann, wenn es sich gar nicht verändert. Mit denen solltest du dein Programm zwischen 5 und 500 mal schneller kriegen. Ich habe auch einen Test laufen lassen, was passiert, wenn ich 1:1000 zeichnen lasse. Das ist ungefähr äquivalent dazu, dass der Nutzer ~17 Sekunden lang auf den Bildschirm schaut, ohne etwas zu verändern (kommt zumindest bei mir öfters mal vor). Der Unterschied war dramatisch. In Direct Draw hat das Ding 46 Sekunden gebraucht. Vom RAM aus waren es noch 7.8 Sekunden, vom VRAM 776 ms, mit meinem Blitter 168 ms und mit einem Managed Image gerade mal 101 ms. Das ist ein Faktor von fast 500! |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bin jetzt zwar etwas spät, aber ich muss meinen Senf auch noch abgeben:
Wieso Read/WritePixelFast? Eine einfache Vergrösserung kriegt man auch mittels DrawImageRect ![]() ![]() ![]() ![]() Hier ein Code, der zwar in Blitz2D geschrieben wurde, aber auf BlitzPlus übertragbar sein sollte. BlitzBasic: Graphics 800,600, 0, 2 Zugegeben: Die DrawPixelFast-Variante ist nicht optimiert. Aber ich behaupte jetzt mal, dass die mit allen möglichen Optimierungen nicht an die DrawImageRect-Variante heran kommt ![]() MfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Silbersurfer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Holzchopf
Zitat: zugegeben: Die DrawPixelFast-Variante ist nicht optimiert. Aber ich behaupte jetzt mal, dass die mit allen möglichen Optimierungen nicht an die DrawImageRect-Variante heran kommt
Da gebe Ich dir recht, deine Variante ist schneller Rect draw 2 ms, meine lupe braucht 3-4 ms und deine Read/Write Variante 18 ms. Eine Super Idee das ich da nicht selber drauf gekommen bin, danke Holzchopf für deinen wink mit dem Zaunpfahl ![]() Ich werde mal testen wie sich deine Variante in meinen Proggy macht Dak Zitat: Ich habe leider nichts dazu gefunden, wie man Images aus Banks macht, aber ich habe mal einen Speed-Test zusammengestellt für alle Arten, wie man generierte Bilder auf den Schirm kriegt:
Entweder wieder mit Writepixel oder direkt im Speicher Poken habe dazu was im Englischen Forum gefunden leider komm Ich damit nicht so klar, und das Demo gibt bei mir einen MAV Zu deinen Speedtest. Bei mir ergaben diese Code: 1/100
ATI HD6950: -Direct Draw: 4207 -Draw from RAM: 277 -Draw from VRAM: 46 -Blit RAM to VRAM: 34 -Managed Image: 17 100/1 ATI HD6950: -Direct Draw: 4209 -Draw from RAM: 732 -Draw from VRAM: 2088 -Blit RAM to VRAM: 2204 -Managed Image: 617 Also ist mit abstandt Holzchopf seine Variante am schnellsten |
||
-------------------------------------------------------
XP 2000+ 512DDR Radeon 9800 XL 340GB HD Hompage : http://home.arcor.de/silbersurfer01/ Is Bob engine http://home.arcor.de/silbersur.../Isbob.zip |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du must dabei bedenken, mein Speedtest misst (mit den gegebenen Einstellungen) die Zeit, die es braucht, 100 Mal zu zeichnen, wärend Holzchopfs Variante nur 1 Bild misst. Du musst sein Ergebnis also mal 100 rechnen, um es mit meinem Speedtest vergleichen zu können, oder meinen Speedtest mit 1/1 starten. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
Silbersurfer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Edit So, nun habe ein keines Problem, ich bin jetzt bei der erstellung einer Undo Funktion.
Die ich in einer Bank angelegt habe soweit so gut. Nun habe ich das Undo auf 10 schritte begrenzt, sobald die grenze erreicht ist, soll der erste eintrag in der Bank gelöscht werden und der rest der bank um einen zurück geschoben werden. Das wollte ich so erledigen BlitzBasic: If undopointer>9 FreeImage PeekInt(bank,0) : CopyBank bank,12,bank,0,108 :undopointer=undopointer-1 Komisch ist, alles klappt soweit nur das der vorletzte eintrag falsche werte hat(1-8) ok 9 falsch ![]() was mache ich da falsch Bankgrösse ist 120 Byte schrittweite 12 Byte Kann mir da Jemand einen Rat geben Dak Zitat: Du must dabei bedenken, mein Speedtest misst (mit den gegebenen Einstellungen) die Zeit, die es braucht, 100 Mal zu zeichnen
Ja stimmt, aber anhand der ms sieht man das auch schon Dak, habe die art von Holzchopf jetzt übernommen und auf mein Proggy Angepasst voilà nochmal 15-20% mehr leistung. An dieser Stelle ein dank an Holtzchopf BlitzBasic: Local startx%,starty%,writex%,writey%,counter% Durch diese Änderung kommen die Nvidia-Karten auch besser damit klar... Nun kann Ich mich um andere sachen in meinen Proggy kümmern Danke Leute für die mithilfe |
||
SilbersurferBetreff: So nun habe Ich alles Optimiert was ging |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Habe jetzt, dank Holzchopf nochmal 15-20% mehr aus der Lupe rausholen können,
gleichzeitig habe Ich noch einiges wieder eingebaut, auf meinen Systemen ist damit flüssiges Arbeiten möglich. Ich denke das es auf älteren Rechner nicht so gut laufen wird. Hier nochmal der Aktuelle Download von BlitzPaint http://home.arcor.de/silbersur...intneu.zip ![]() Der derzeitige Stand meines Proggys ! ![]() ![]() ![]() ![]() werkzeuge fertiggestelt ! ![]() ![]() ![]() ![]() ![]() ![]() ![]() was noch fehlt ! ![]() ![]() ![]() ![]() ![]() ![]() ![]() Bevor jetzt die frage aufkommt warum Ich ein Malprogramm schreibe, es gibt ja schon so Viele und sicherlich viel leistungfähiger wie meines. Der Grund ist, Ich wollte ein Simples und gut zu bediendes Malproggy schreiben womit man einfach Pixel kann, nichts mit Ebenen oder Layer alpha kanälen oder der gleichen.. Mein Proggy errinnert Stark an alte Amiga Zeiten alla D Paint, Personal Paint und Co und genau das soll auch so sein Würde mich über anregungen und Kretik wie immer sehr Freuen |
||
-------------------------------------------------------
XP 2000+ 512DDR Radeon 9800 XL 340GB HD Hompage : http://home.arcor.de/silbersurfer01/ Is Bob engine http://home.arcor.de/silbersur.../Isbob.zip |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group