| Autor |
Beitrag |
klausiemausie
      
Beiträge: 98
Win XP, Win Vista Ultimate
Delphi 6
|
Verfasst: Di 10.02.09 16:59
ich habe folgendes problem: ich habe ein spiel programmiert, in dem man europa erobern muss, jedes land europas liegt in einer image, mit transparentem hintergrund. wenn nun einheiten verschoben werden, und ein land erobert wird, wird ein bild in das image reingeladen, das funktioniert auch alles, nur läuft mein ram voll, je länder ich das spiel spiele, desto mehr ram brauch das, woran liegt das? und wie kann ich den ram freigeben?
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 10.02.09 17:01
Du erzeugst anscheinend irgendwo Bitmaps oder andere speicherintensive Objekte, gibst sie aber nicht mehr frei, wenn du sie nicht mehr benötigst.
Schau mal in deinen Code. Immer wenn irgendwo create steht, muss irgendwo auch wieder ein free auftreten.
_________________ We are, we were and will not be.
|
|
klausiemausie 
      
Beiträge: 98
Win XP, Win Vista Ultimate
Delphi 6
|
Verfasst: Di 10.02.09 17:36
naja wie gesagt, in meiner form 1 sind mehrere images, die immer mit einem neuen bild geladen werden, aber anscheind, schreibt delphi einfach nur das neue bild in den speicher, aber nimmt dafür einen neuen speicher, wie schreib ich denn dann, dass da der alte speicher freigegeben werden soll?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 10.02.09 17:40
BitmapX.Free, wenn es eine TBitmap ist. Generell musst du im Normalfall überall wo du etwas mit Create erzeugst auch genau ein Free dazu haben.
Zudem gibt es noch FreeImage. Das entfernt nur das Bild aus dem Speicher.
|
|
klausiemausie 
      
Beiträge: 98
Win XP, Win Vista Ultimate
Delphi 6
|
Verfasst: Di 10.02.09 17:42
gut schreib ich das hin bevor, er das neue bild lädt, oder danach?
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 10.02.09 17:48
Danach wäre das neue Bild ja weg und nicht das alte. Grundsätzlich ist die Frage vor allem, ob du jedesmal die Bitmap ganz neu erstellst?
Mit FastMM kann man z.B. nach Speicherlecks suchen, wenn man die entsprechende Option anschaltet.
|
|
klausiemausie 
      
Beiträge: 98
Win XP, Win Vista Ultimate
Delphi 6
|
Verfasst: Di 10.02.09 17:50
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Di 10.02.09 17:52
klausiemausie hat folgendes geschrieben : | | gut schreib ich das hin bevor, er das neue bild lädt, oder danach? |
Poste doch mal ein paar Abschnitte aus deinem Code
An sonsten: Normal prüft man, ob Speicher schon reserviert wurde (z.B. if Assigned(myBitmap) then ...) und falls ja, gibt man ihn frei, bevor man neuen reserviert (Es bietet sich FreeAndNil(myBitmap); an.)
Ok, deinem Code zufolge liegt das Problem nicht da, das Image sollte kein Speicherleck verursachen.
Rufst du irgendwo mal etwas wie aVar := TmyObject.Create; auf? Poste entsprechende Stellen mal.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
klausiemausie 
      
Beiträge: 98
Win XP, Win Vista Ultimate
Delphi 6
|
Verfasst: Di 10.02.09 18:40
also ich hab mal nach geguckt, an welcher stelle, sich die speichernutzung erhöht, das passiert, wenn ich einheiten verschiebe, wenn ich einheiten verschieben will klick ich auf einen button, es öffnet sich ein fenster, mit showmodal, und da kann man in einer combobox das land auswählen, und in ein editfeld schreiben, wieviel einheiten man verschieben will. hier mal der code dazu, wenn mir mal jemand erzählen würde, wie man die delphi tags hinzufügt, das wär herrlich.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| if anzahl<0 then form48.showmodal; if (anzahl<=form1.Region[7]) and (anzahl>=0) then begin if form1.zielland=74 then begin if form1.zugehoerigkeit[7]<>form1.zugehoerigkeit[4]then begin a:=form1.region[4]; b:=anzahl; a:=a-b; if a>=0 then form46.ShowModal; a:=0; b:=0; form1.region[4]:=(round(form1.region[4]*1.2)-anzahl); form1.Region[7]:=form1.region[7]-anzahl; end else if form1.zugehoerigkeit[7]=form1.zugehoerigkeit[4]then begin form1.verschieben[4]:=form1.verschieben[4]+anzahl; form1.Region[7]:=form1.region[7]-anzahl; end end;
if form1.region[4]<0 then begin form1.Region[4]:=0-form1.region[4]; form1.zugehoerigkeit[4]:=form1.zugehoerigkeit[7]; form5.klick:=1; form45.ShowModal; end; if form1.zugehoerigkeit[4]=1 then begin form1.Frankreich.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + ('\Länder\Frankreich_1.png')); end; if form1.zugehoerigkeit[4]=2 then begin form1.Frankreich.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + ('\Länder\Frankreich_2.png')); end; |
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Di 10.02.09 19:20
Mal was anderes: Wieso brauchst du so viele Forms? Ein MessageDlg oder ShowMessage würde doch reichen in den meisten Fällen.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
klausiemausie 
      
Beiträge: 98
Win XP, Win Vista Ultimate
Delphi 6
|
Verfasst: Di 10.02.09 19:26
für jedes land, aus dem ich einheiten verschieben kann, hab ich eine extra vverschiebungsform, weil ichs nich besser wusste als delphianfänger, wie man das mit einer form lösen könnte, dann kommen noch einige forms hinzu, für interne fehlermeldungen, wie zum beispiel negative einheiten eingegeben, kein land ausgewählt, etc. dann noch ein möchten sie wirklich beenden , ein introvideo, eine form, wo beide spieler ihren namen eingeben etc. deswegen kommen so viele forms zustande.
|
|
klausiemausie 
      
Beiträge: 98
Win XP, Win Vista Ultimate
Delphi 6
|
Verfasst: Fr 13.02.09 20:36
ok, problem gelöst, ich hab den grund gefunden, warum mein prog soviel speicher gefressen hat, und zwar hatte ich ja für jedes land ein Bild gehabt, allerdings war das riesig gross, mit 1900 noch was pixeln, und nur oben in der linken ecke war das land, was dann reingeladen wurde, und das brachte den speicher natürlich zum überlaufen.
danke für eure antworten trotzdem
|
|
|