![]() |
Performance Frage
Also ich habe folgende Frage:
Wenn ich irgendetwas darstellen will, zB Text mit Schatten oder so, macht es mehr Sinn dann ein Bild zu laden oder das selbst zu zeichnen? Oder zB bei Gradients oder sowas alles, was ist sinnvoller? Wenn mans selbst zeichnen kann selber zeichnen? |
Re: Performance Frage
wenn man selbst zeichnen kann würde ich selbst zeichnen da es vom Datenvolumen her weniger ist.
Zum Beispiel ein Text hat zwischen den Buchstaben Freiraum welcher mit gespeichert wird. In einigen Fällen muss dieser Freiraum (Hintergrund) dann noch Transparent dargestellt werden was wieder Rechenleistung kostet. Dann ist es bedeutend einfach einfach den Text zur Laufzeit auszugeben. Wenn es allerdings um Texte mit bestimmten Schriften geht ist ein Bild manchmal nicht vermeidbar weil die Schriften nicht auf jedem Zielsystem verfügbar sind. |
Re: Performance Frage
Hm ok, und wenn es jetzt nicht nur um Texte geht?
Weil ich meine das kostet doch sicher Rechenzeit wenn man irgendwelche Effekte zeichnen lässt oder so, andererseits will man ja vermeiden tausend verschiedene Bilder(->viele MB) zu verwenden, oder? |
Re: Performance Frage
Du musst das ganze ja nicht bei jedem zeichnen neu berechnen. Du kannst auch beim ersten zeichnen berechnen und das in ein Bitmap im speicher zwischenspeichern.
|
Re: Performance Frage
Klingt natürlich logisch ;-)
Dann hab ich dazu mal ne Frage: Kann ich in einer Variable die nur für eine Prozedur gilt, ein Bild speichern und es am Ende der Prozedur nicht freigeben, um dann beim nächsten Aufruf der Prozedur wieder darauf zuzugreifen? Also ist das Bild dann noch wie beim alten Prozeduraufruf? |
Re: Performance Frage
nein das kannst du nicht. das musst du dann schon global speichern.
|
Re: Performance Frage
Ok ;-) Danke
|
Re: Performance Frage
...das heißt: Du kannst auch mit lokalen Konstanten arbeiten.
Aber das ist nicht schön. Nicht machen! Trotzdem ein Beispiel:
Delphi-Quellcode:
Die Adresse des alloziierten Bitmaps ist dann immer in "storage" gespeichert und läuft dir nie aus dem scope.
procedure DoSomething;
const storage: Integer = 0; var bmp: TBitmap; ptr: Pointer; begin bmp := TBitmap(TObject(storage)); if bmp = nil then bmp := TBitmap.Create; //... //... ptr := @storage; Integer(storage^) := Integer(Pointer(bmp)); end; Aber machs nicht, wenn dus nicht unbedingt brauchst! Für deinen Zweck fallen mir mindestens 2 schönere Lösungen ein. |
Re: Performance Frage
@Luke: Hat der doppelte Cast einen Grund? (Also erst nach TObject casten um dann nach TBitmap zu casten)
Zudem geht die Variante auch nur wenn eingestellt ist das man konstanten einen Wert zuweisen darf (es also in wirklichkeit variablen sind) |
Re: Performance Frage
Ja, stimmt, das habe ich jetzt umgangen, glaube ich. Und das mit dem doppelten Cast... sollte eigentlich nicht nötig sein, stimmt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz