Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Images flakern... :( (https://www.delphipraxis.net/102973-images-flakern.html)

Lifthrasir 7. Nov 2007 18:02


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

dominikkv 7. Nov 2007 18:07

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?

Lifthrasir 7. Nov 2007 18:17

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??

patti 7. Nov 2007 18:26

Re: Images flakern... :(
 
Zitat:

Zitat von Lifthrasir
Und ja ich lade jedesmal von Pladde, da zu viele Images im Program doch dieses aufgehen lässt wie'n Hefeklos, oder??

Wie groß sind denn die Bilder (Ausmaße, Dateigröße)? Vielleicht würde sich anbieten, die Bilder in einer Ressourcen-Datei abzulegen. Wenn du die Bilder von der Festplatte lädst, musst du auch bedenken, dass jeder Benutzer/Spieler diese nach Belieben verändern kann.

zu doublebuffered: liegt die TImage-Komponente direkt auf dem Formular oder auf einem Panel?

P@Tti

halinchen 7. Nov 2007 18:26

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...

Lifthrasir 7. Nov 2007 18:39

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.......

patti 7. Nov 2007 18:43

Re: Images flakern... :(
 
Zitat:

Wollt doch meinem Delphi treu bleiben.......
Was du vorhast geht (wahrscheinlich) auch ziemlich gut mit Delphi. Schau mal in meinen Post weiter oben und beantworte die zwei Fragen von mir. Oder du beschreibst kurz, was genau du vorhast. Vielleicht gibts dann noch mehr tipps...

P@Tti

Lifthrasir 7. Nov 2007 18:46

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

patti 7. Nov 2007 18:49

Re: Images flakern... :(
 
Hast du im OnCreate der Form schon folgendes versucht:

Delphi-Quellcode:
    self.doublebuffered := true;
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).

Lifthrasir 7. Nov 2007 18:54

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

halinchen 7. Nov 2007 19:00

Re: Images flakern... :(
 
Du fügst in der Form ein:

Delphi-Quellcode:
MeinBild : TBitmap;
OnCreate:
Delphi-Quellcode:
MeinBild := TBitmap.Create;
MeinBild.LoadFromFile('FileName');
OnDestroy:
Delphi-Quellcode:
MeinBild.Free

Entweder du bleibst bei deinen Images oder ich würde dir folgende Methode empfehlen:
Delphi-Quellcode:
Form.Canvas.Draw(X,Y,MeinBild)
Du müsstest jetzt den X und Y wert berechnen und dann zeichnest du.
vor dem Zeichnen solltest du
Delphi-Quellcode:
Form.Refresh
aufrufen.

Bei Images:
Delphi-Quellcode:
Image.Picture.Bitmap.Assign(MeinBild);

patti 7. Nov 2007 19:03

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.

Lifthrasir 7. Nov 2007 19:05

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 ;)

mimi 8. Nov 2007 10:23

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.

DeddyH 8. Nov 2007 10:47

Re: Images flakern... :(
 
Panel.Canvas? :gruebel:

mimi 8. Nov 2007 10:50

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)).

Progman 8. Nov 2007 10:53

Re: Images flakern... :(
 
Es gibt speciell gestrickte Panel-Komponenten, die einen Canvas haben. Das Standard-Panel hat keinen veröffentlichten.

mimi 8. Nov 2007 12:28

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...

thkerkmann 8. Nov 2007 12:39

Re: Images flakern... :(
 
Naja, gibts dafür nicht die Paintbox ?

mimi 8. Nov 2007 12:55

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