![]() |
Images flakern... :(
Hi Leudde ^^
Nach langer langer Pause bin ich endlich wieder online (wurde ja auch Zeit) und habe da gleich einmal eine einfache aber schwerwiegende Frage an euch: Also, ich will n kleines Minispiel proggen, also nutz ich für meine bunten Bildchen ein Image das je nach dem, den Inhalt (das Bild) läd/ wechselt.. Nun habe ich aber folgende 2 Probs: 1. Das Bild flimmert und zweitens frisst diese Aktion ja unmengen an Speicher, sprich, das Prog läuft sehr langsam.. Was kann ich da tun? Ich hab gehört man kann den Pixelshedder verstellen, hab ich versucht, oder was verdoppeln, aber leider kamen wir in der SChule nie über TLabel und TEdit hinaus, und so bleibt mir als "Hobbybastler" nur noch hier bachtufragen.. Bitte helft mir^^ Danke und mit freundlichen Grüßen Lif |
Re: Images flakern... :(
setze Doublebuffered des Parents des Image auf true (wahrscheinlich ist das parent deine form).
lädst du die bilder immer wieder von festplatte? |
Re: Images flakern... :(
also ich hab schonmal n doubblepuffer auf true gesetzt, aber irgendwie war keine Verbesserung zu merken..
Und ja ich lade jedesmal von Pladde, da zu viele Images im Program doch dieses aufgehen lässt wie'n Hefeklos, oder?? |
Re: Images flakern... :(
Zitat:
zu doublebuffered: liegt die TImage-Komponente direkt auf dem Formular oder auf einem Panel? P@Tti |
Re: Images flakern... :(
Ich würde alle Bitmaps am Start ins Programm laden. Die Festplatte ist im Gegensatz zum RAM viel langsamer.
edit: Ich weiß aber nicht ob das nun spürbare Unterschiede macht. edit2: zu lahm... |
Re: Images flakern... :(
hmmmm.. na da bin ich ja noch nicht weiter ^^
Gibt's manchmal sonst ne andere möglichkeit? Oder würdest du sagen: "Junge für buntes Popup nimm Flash!" Wollt doch meinem Delphi treu bleiben....... |
Re: Images flakern... :(
Zitat:
P@Tti |
Re: Images flakern... :(
Aso ja sorry :oops:
Also, die Größen Varieren von 50 * 50 Pixel bis 300 * 300 Pixel. Die Images liegen direkt auf dem Form |
Re: Images flakern... :(
Hast du im OnCreate der Form schon folgendes versucht:
Delphi-Quellcode:
Wenn es immernoch flackert, würde ich die Bilder wirklich vor/während dem Starten des Programms in den Zwischenspeicher laden und dann entsprechend anzeigen. (es sei denn, es handelt sich um sehr viele bilder).
self.doublebuffered := true;
|
Re: Images flakern... :(
das mit self.doublebuffed hab ich schon mal ausprobiert und es hat trotzdem geflackert.
Aber mal ne Frage: Wie speichert man Bilder in den Zwischenspeicher? ^^ Und, was noch ganz wichtig ist: Die Bilder sollen sich ja auch bewegen, sprich, wenn ne 10+10 Schneeflocke von oben via Timer nach unten dackelt soll des net ruckeln |
Re: Images flakern... :(
Du fügst in der Form ein:
Delphi-Quellcode:
OnCreate:
MeinBild : TBitmap;
Delphi-Quellcode:
OnDestroy:
MeinBild := TBitmap.Create;
MeinBild.LoadFromFile('FileName');
Delphi-Quellcode:
MeinBild.Free
Entweder du bleibst bei deinen Images oder ich würde dir folgende Methode empfehlen:
Delphi-Quellcode:
Du müsstest jetzt den X und Y wert berechnen und dann zeichnest du.
Form.Canvas.Draw(X,Y,MeinBild)
vor dem Zeichnen solltest du
Delphi-Quellcode:
aufrufen.
Form.Refresh
Bei Images:
Delphi-Quellcode:
Image.Picture.Bitmap.Assign(MeinBild);
|
Re: Images flakern... :(
Wenn es sich um viele "Schneeflocken" handelt, würde ich diese in der Zeichen-Routine zunächst auf ein neu erzeugtes Bitmap zeichnen und dieses wiederum auf das Canvas zeichnen. Sollte die ganze Geshcichte noch etwas "ruckelfreier" machen.
|
Re: Images flakern... :(
hmm.. ich werd das mal versuchen..
Vielen Dank für deine Bemühungen! Heute komm ich bloß leider nicht mehr an's Delhpi.. sollte ich aber weitere probs haben meld ich mich, versprochen ;) |
Re: Images flakern... :(
Ich würde alle BitMap in einer Liste beim Start des Programm laden.
Jetzt habe ich einen TBitMap als Buffer, das ist das Spiel Feld. Ersteinmal unsichtbar, um es sichtbar zu machen musst du dich entscheiden Zwischen einen Panel, einer Paintbox oder einem TImage. Meiner Erfahrung nach ist das Panel zum Zeichnen am schnellsten, warum weiß ich nicht. Jetzt kannst du z.b. mit Panel1.Canvas.Draw(0,0,Buffer) die gesammte Grafik kopieren. Wenn du nur Stückweise Kopieren möchtest, solltest du CopyRect von TCanvas nehmen oder bitblt die Winapi Variante.... Was davon schneller ist kann ich dir nicht sagen, es heißt das bitblt schneller ist als copyRect, aber letztendlich ist copyrect mit Sicherheit auch nix anders als bitblt. |
Re: Images flakern... :(
Panel.Canvas? :gruebel:
|
Re: Images flakern... :(
ja, unter Lazarus geht das, unter Delphi nicht ?
dann musst du eine eigene Klasse erstellen die du vom Panel ableitests und dort die Paint Methode Überschreiben, dann sollte es auch gehen. Unter Lazarus ist das zeichnen auf ein Panel am schnellsten, abgehen von SDL oder so...... das weiß ich nicht. (Ich habe aber gesehen, das unter Delphi nicht alle Komponenten ein public canvas haben, das ist evlt. auch nur unter Lazarus so.... dort kann ich sogar das canvas von der TScrollbox ansprechen, was ich unter Delphi nicht kann(wie ich vor einigen Tagen gesehen habe)). |
Re: Images flakern... :(
Es gibt speciell gestrickte Panel-Komponenten, die einen Canvas haben. Das Standard-Panel hat keinen veröffentlichten.
|
Re: Images flakern... :(
naja wie gesagt unter Lazarus schon.... Unter Delphi müsste man halt eine eigene Klasse von einem Panel ableiten und gut ist.... Das dürfte das schnellste sein...
|
Re: Images flakern... :(
Naja, gibts dafür nicht die Paintbox ?
|
Re: Images flakern... :(
Die ist leider langsamer als ein Panel, habe ich bemerkt... aber für die meisten zwecke reicht die schon aus.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 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