amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Fensterinhalt schnell löschen [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

01.12.2006, 12:31 Uhr

Honitos
Posts: 200
Nutzer
Moin,

ich möchte den Inhalt eines Fensters (nicht den Rahmen) schnell löschen.
Geht das nur manuell, also mit RectFill_ oder kann ich irgendwie den Rastport mit der gewünschen Hintergrundfarbe löschen/setzen ?

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 12:51 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Ich glaube dafür gibt's SetRast(), aber ob's schneller als RectFill() ist kann Ich dir leider nicht sagen.

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 12:53 Uhr

Honitos
Posts: 200
Nutzer
@DariusBrewka:
Es sollte schneller sein, weil ich bei RectFill_ ja die Koordinaten des Rechtecks erst manuell berechnen muss.

Danke !

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 13:09 Uhr

thomas
Posts: 7675
Nutzer
Zitat:
Original von Honitos:
Es sollte schneller sein, weil ich bei RectFill_ ja die Koordinaten des Rechtecks erst manuell berechnen muss.


Du solltest dir erstmal überlegen, was hier schnell sein soll. Schneller als RectFill wird nicht gehen. Wenn dir deine Programmiersprache zu langsam ist ("manuelle" Berechnungen), solltest du lieber darüber nachdenken, ob Basic vielleicht doch nicht die richtige Wahl ist.

Du könntest beim Öffnen des Fensters das Flag WFLG_GIMMEZEROZERO setzen, dann gehört der Rahmen nicht zum Zeichenbereich und kann nicht überschrieben werden.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 13:35 Uhr

Honitos
Posts: 200
Nutzer
@thomas:
Es geht hier sowieso nur um Peanuts.

Im Augenblick werden in Inline-ASM die Dimensionen berechnet, also Rahmen von Fensterbreite/-Höhe abziehen und in die Register für RectFill_ geschrieben.

Das fällt (zumindest für mich) bei SetRast_ weg.

Ich erwarte keine großartigen Steigerungen - die brauche ich auch nicht.

Aber warum nicht die Funktionen nutzen, die sowieso da sind...

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 13:49 Uhr

Honitos
Posts: 200
Nutzer
@thomas:
Es geht hier sowieso nur um Peanuts.

Im Augenblick werden in Inline-ASM die Dimensionen berechnet, also Rahmen von Fensterbreite/-Höhe abziehen und in die Register für RectFill_ geschrieben.

Das fällt (zumindest für mich) bei SetRast_ weg.

Ich erwarte keine großartigen Steigerungen - die brauche ich auch nicht.

Aber warum nicht die Funktionen nutzen, die sowieso da sind...

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 16:01 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von Honitos:
@thomas:
Es geht hier sowieso nur um Peanuts.

Im Augenblick werden in Inline-ASM die Dimensionen berechnet, also Rahmen von Fensterbreite/-Höhe abziehen und in die Register für RectFill_ geschrieben.

Das fällt (zumindest für mich) bei SetRast_ weg.

Ich erwarte keine großartigen Steigerungen - die brauche ich auch nicht.

Aber warum nicht die Funktionen nutzen, die sowieso da sind...


SetRast() füllt nunmal den gesamten RastPort, das ist also bei den normalen Fenstern der gesamte Bereich inkl. Rahmen. Das kannst Du nur verhindern, in dem Du entweder ein GZZ-Fenster benutzt (mit noch viel größerem Overhead) oder einen Clipping-Bereich setzt, den Du aber genauso von den Dimensionen her berechnen musst. Außerdem verlagerst Du damit die Operation ja nur an eine andere Stelle.

Mir ist nur nicht klar, warum Du meinst, die Dimensionen jedes Mal "berechnen" zu müssen. Die Größe des Fensterrahmens ändert sich doch überhaupt nicht.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 17:37 Uhr

Honitos
Posts: 200
Nutzer
@Holger:
Hallo Holger,

das ist richtig. Ich habe nicht nachgedacht.
Ist bin grade dabei, einen alten reassemblierten Source zu verbessern.
Und da war es so, dass vor dem RectFill_ immer alles neu berechnet wurde.
Inzwischen habe ich es so umgestellt, dass die Dimensionen halt einmal berechnet und gesichert werden...

Sven

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 17:38 Uhr

bubblebobble
Posts: 707
Nutzer
Honitos, das ist doch einfach:

X-Treme Lazy Way:
code:
WCLS


Basic Way:
code:
WBox WLeftOff,WTopOff,InnerWidth,InnerHeight,0


C Style Way:
code:
*win.Window = Peek.l(Addr Window(Used Window)) ; oder woher auch immer der Pointer für das Fenster kommt...
RectFill_ *win\RastPort,*win\BorderLeft,*win\BorderTop,*win\Width-*win\BorderRight-1,*win\Height-*win\BorderBottom-1,0


Mit SetRast kannst du nicht viel anfangen, es sei denn du legst schnell eine Clipreagion um den Fensterinhalt oder nimmst ein GZZ Window.
Schneller ist das aber mit Sicherheit nicht.

@Basiczweifler
Die Koordinaten des Rechtecks zu berechnen ist Peanuts.
Amiblitz dürfte hier genauso schnell wie C sein, wie in so ziemlich allem. Auch ohne inline ASM. Grrr.

Wenn das Fenster ein Background Pattern hat, geht das aber nicht, weil
du ja die Farbe 0 implizit als Background annimst.
Dann nimmst du einfach EraseRect_, was genau dafür gedacht ist.
Es benutzt die BackFillHook zum löschen.
Ich denke WCLS macht das auch, aber WBox und Rectfill_ nicht.

Also mein ultimativer Vorschlag:

code:
*win.Window = Peek.l(Addr Window(Used Window)) ; oder woher auch immer der Pointer für das Fenster kommt...
EraseRect_ *win\RastPort,*win\BorderLeft,*win\BorderTop,*win\Width-*win\BorderRight-1,*win\Height-*win\BorderBottom-1


und du bist auf der sicheren Seite. Koordinaten speichern würde ich niemals machen, das ist unnötige Redundanz und kann zu Grafikfehler führen, wenn sich die Fensterdimensionen ändern. *winBorderXXX ist genau dafür gemacht, also warum nochmal irgendwo speichern ?

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ Dieser Beitrag wurde von bubblebobble am 01.12.2006 um 18:00 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 18:56 Uhr

Honitos
Posts: 200
Nutzer
@bubblebobble:
Sehr gute Idee.
Würde ich bei neuem Code auch machen.

Aber da es der ollde ASM-Kram ist, muß ich den Gegebenheiten Tribut zollen. Ich kann das zwar so machen wie Du beschrieben hast, allerdings habe ich dann immer die "Kontextwechsel" zwischen dem ASM-Teil und dem Basic-Teil, d.h. alles auf den Stack packen und zurück etc.

Die Werte werden natürlich nach jeder Änderung am Fenster neu berechnet - aber nicht mehr bei jedem refreshen des Inhalts (dazu wurden nicht etwa die Borders benutzt, sondern die Fontgröße !)

Mittelfristig fliegt der ASM-Teil ja raus, aber im Augenblick wollte ich auf die Schnelle und einfach einige unnötige ASM-Befehle einsparen.

---
Ich möchte hier keine Diskussion bzgl. Speed C-Basic-ASM sehen.
Ich hatte nur die Frage nach SetRast_ gestellt :D , obvor ich den Code komplett angeschaut hatte :(


[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 20:24 Uhr

malte2
Posts: 148
Nutzer
SetRast, EraseRect, RectFill etc. basieren alle auf BltPattern.

[ - Antworten - Zitieren - Direktlink - ]

01.12.2006, 23:12 Uhr

bubblebobble
Posts: 707
Nutzer
@malte:
EraseRect ruft die Backfill Hook auf.
Die kann machen was sie will, z.B. auch gar nichts, oder ein Bildchen malen oder einfach solid füllen, das ist nicht notwendigerweise bltpattern.

@Honitos:
Ich würde das mit OS Befehlen ersetzen (am besten der letzte Vorschlag), Stack hin oder her, Speicher gibts genug.
Früher oder später kannst du auch das ASM dazwischen ersetzen.
Lesbarkeit des Codes sollte Vorrang haben, der Editor ist keine zeitkristische Anwendung, und jeder der damit entwickelt hat wohl genug Rechenpower um ab und an A5-A7 zu retten. Zeit kostet das so gut wie keine.

Mit dem Vorschlag von oben brauchst du dir keine Werte zu merken, das macht alles Intuition für dich und es kann nichts schief gehen.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

02.12.2006, 10:51 Uhr

malte2
Posts: 148
Nutzer
@bubblebobble:

Ist mir schon klar, was EraseRect() alles machen *könnte* aber per default ist es ein RectFill ;-)

[ - Antworten - Zitieren - Direktlink - ]

02.12.2006, 14:00 Uhr

MaikG
Posts: 5172
Nutzer
Setrast ist etwa 0.01s bei 300 durchläufe scheller als CLS in Basic.
Rectfill ist etwa 25% schneller als CLS mit unveränderlicher fenstergröße.
Hängt aber noch von anderen Faktoren ab, wie GFX System weil die
verändern ja die Originalfunktionen.

[ - Antworten - Zitieren - Direktlink - ]

02.12.2006, 14:27 Uhr

uho
Posts: 114
Nutzer
Hallo,

deutlich schneller als RectFill() ist EraseRect(). Damit habe ich bei
meinem Wator noch einige Prozent herauskitzeln können, obwohl der
Anteil an der Gesamtrechenzeit da nicht allzu groß ist...


Gruß

uho

[ - Antworten - Zitieren - Direktlink - ]

02.12.2006, 18:12 Uhr

bubblebobble
Posts: 707
Nutzer
Was nun schneller ist kann man schwer sagen, hängt vom GFX system ab.
Per default macht aber EraseRect und RectFill das gleiche, sollte also auch etwa gleich schnell sein.
Das hat auch nichts mit Basic oder ASM oder C zu tun, die Funktionen sind immer gleich schnell. CLS in einem Basic Dialekt mag u.U. was ganz anderes machen wie CLS in einem zweiten Dialekt.
In AB2 rüft WCLS (oder besser InnerCLS) vermutlich EraseRect auf, und berechnet vorher noch schnell die Koordinaten (in ASM).

@Honitos:
EraseRect ist die sauberste Lösung, und so ist es auch vom OS her gedacht, wenn du einen Hintergrund clearen willst.
Du kannst die Koos so wie oben beschrieben berechnen, das erspart dir jegliches zwischenspeichern von Werten und deine Koos sind immer Konsistent mit dem Fenster.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

03.12.2006, 00:59 Uhr

malte2
Posts: 148
Nutzer
Genaugenommen macht EraseRect() einen BltBitMap-Aufruf mit Minterm 0. RectFill() hingegen ruft erstmal BltPattern() auf, welches widerrum den entsprechenden Blit veranlasst. Dementsprechend kann EraseRect() tatsächlich schneller sein.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Fensterinhalt schnell löschen [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2022 by amiga-news.de - alle Rechte vorbehalten.
.