Autor |
Beitrag |
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Mo 23.04.07 15:59
Also, ich habe ein Wator Programm geschrieben, dass die Anzahl an Haien und Fischen als Kurve ausgibt.
Das Problem hierbei, ist das das Programm, wenn es länger läuft anfängt langsamer zu werden, es liegt garantiert an der zeichenroutine, da das problem nicht auftritt, wenn ich den dazugehörigen Aufruf auskommentiere. Ich glaube, dass es daran liegt, dass das Bitmap zu groß wird und wollte jetzt fragen, ob jemand eine idee hat, wie man den code optimieren könnte, damit das problem nicht mehr auftritt.
Hier die zeichenroutine:
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: 27: 28: 29: 30:
| procedure tdiagramm.nextstep(neufische,neuhaie:integer); begin with imdiagramm.canvas do begin pen.width:=2; pen.color:=clyellow; moveto(count,round(600-(fische*0.4))); lineto(count+2,round(600-(neufische*0.4))); pen.color:=clBlack; moveto(count,round(600-(haie*0.4))); lineto(count+2,round(600-(neuhaie*0.4))); pen.width:=1; pen.Color:=clred; moveto(0,600); lineto(imdiagramm.width,600); moveto(0,400); lineto(imdiagramm.width,400); moveto(0,200); lineto(imdiagramm.width,200); moveto(0,0); lineto(imdiagramm.width,0);
end; fische:=neufische; haie:=neuhaie; count:=count+1; imdiagramm.width:=imdiagramm.width+1; bild.Canvas.copyrect(Rect, imdiagramm.canvas, mrect);
end; |
bild ist die canvas auf die das bitmap gezogen wird, imdiagramm das bitmap
Danke, an alle mit konstruktiven vorschlägen
|
|
uwewo
      
Beiträge: 154
|
Verfasst: Mo 23.04.07 17:36
Das schlimme an solchen Postings ist, man muss sich alle Infos zum klären der Frage selbst suchen.
Für alle die wie ICH nicht wissen was Wator ist www.stud.uni-hamburg...ava/wator/wator.html.
Ok nun erklär uns mal:
erstellst Du dauernd Neue Fische und gibst Sie nicht mehr frei oder was machsr Du genau??
Hast Du vielleicht etwas mehr Code als diesen?
|
|
DnC
      
Beiträge: 98
XP
Delphi 3,6,7,2005 PE
|
Verfasst: Mo 23.04.07 17:39
ist Copyrect zu langsam?
Ansonsten eben immer nur Teile des Diagramms zeichnen lassen... die letzte Zeit...
(klappt natürlich nur, wenn das Problem wirklich in der Zeichenroutine liegt...)
|
|
Jann1k 
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Mo 23.04.07 17:50
okay, also fische an sich existieren nicht sondern nur felder und deren anzahl bleibt gleich, ich änder nur ihre properties und daran kann es eigentlich nciht liegen, da das programm stundenlang gleich schnell läuft wenn ich nur (!) den aufruf der zeichenroutine auskommentier, der restliche code bleibt unverändert.
Nur den letzten Teil des Diagramms zeichnen, wäre eine Idee, aber ich wollte es doch komplett haben, also das man im Diagramm scrollen kann, dazu muss ich das bitmap ja ganz lassen.
Da fällt mir grade ein, dass ich ja nur die werte zeichnen könnte, die man gerade braucht und die restlichen nur abspeicher und bei bedarf abfrage. könnte das problematisch werden, dass sich so aber eine große zahl von integerwerten ansammelt?
|
|
uwewo
      
Beiträge: 154
|
Verfasst: Mo 23.04.07 17:55
Mach mal bitte ein ScreenShot von Deinem Diagramm, und hänge ihn an.
|
|
DnC
      
Beiträge: 98
XP
Delphi 3,6,7,2005 PE
|
Verfasst: Mo 23.04.07 17:59
tja, dann hängt die Frage, wann das Programm langsamer wird, an deinem Arbeitsspeicher...
du musst bei langen Zeiträumen eben nur die wichtigen Werte speichern, die, die interessant sind. (bzw. starke Veränderungen eben)
Wie viel du selektieren musst, hängt von der Laufzeit einer solchen Simulation ab, von der ich ehrlich gesagt sowieso keine Ahnung hab^^
Mit dem Diagramm... das Zeichnen darf ja auch ne Weile dauern, wenn du die Simulation beendet hast. Da ist ein riesiges Bitmap ja kein Problem. Während des Simulierens ist es sicher günstig, nur die letzten Werte zu malen...
|
|
Jann1k 
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Mo 23.04.07 18:08
so hier die beiden pics. wundert euch nicht, das das diagramm den rahmen des formulars sprengt es ist noch nicht skaliert
Einloggen, um Attachments anzusehen!
|
|
uwewo
      
Beiträge: 154
|
Verfasst: Mo 23.04.07 18:14
Hi Sebastian,
dachte eigentlich ich sehe irgendwo ein ScrollBar an deinem Diagramm.
Sorry, aber auf was zeichnest Du eigentlich? Panel, Form, Image, PaintBox etc.
Wie oft aktualisiertst Du das Diagramm, oder zeichnest Du nur am Ende weiter?
Kommt kein TChart Liniendiagramm in Frage?
Gib uns bitte noch ein paar Infos.
Danke
|
|
Jann1k 
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Mo 23.04.07 18:25
Ja, hatte es mal mit TScrollbox (oder wie hieß das) versucht, aber irgendwie hat das nicht geklappt.
Deswegen:
Gescrollt wird mit den Pfeiltasten, die steuern quasi die Position des Rechtecks, dass dann für copyrect genutzt wird um eben den bestimmten Teil von TBitmap auf ein TImage zu zeichnen.
Aktualisiert wird laufend (das ganze funktioniert mit einem Timer; interval=20), weil der User auch sehen soll, wie sich die Population entwickelt, wenn er sich das Diagramm anschaut und das eigentliche Programm im hintergrund ist.
TChart Liniendiagramm hab ich noch nie gehört, ich schau mal in der Delphi Hilfe nach.
|
|
battledevil
      
Beiträge: 96
WinXP, Win7
C#, C++, VBNET
|
Verfasst: Mo 23.04.07 18:27
Ist ganz klar, das Programm wird langsamer, weil Du das Image des Diagramms immer größer werden läßt und jedesmal kopierst:
Delphi-Quelltext 1: 2:
| imdiagramm.width:=imdiagramm.width+1; bild.Canvas.copyrect(Rect, imdiagramm.canvas, mrect); |
Das einfachste an dieser Stelle wäre es, wenn Du deine Werte für den Graph in ein TChart reinsteckst, der malt Dir dann automatisch einen Graph.
|
|
DnC
      
Beiträge: 98
XP
Delphi 3,6,7,2005 PE
|
Verfasst: Mo 23.04.07 18:29
okay, wenn alle 20 Sekuden ein [evtl] riesiges Bitmap gezeichnet werden soll... kann es shcon zu performanceproblemen kommen...
probier nur Ausschnitte zu malen oder optimiere die Zeichenfunktion (BitBlt?) [auch die der Fische/Haie] *an Assemblerleute/Optimierer übergeb*^^
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 23.04.07 18:37
Moin!
Jann1k hat folgendes geschrieben: | Da fällt mir grade ein, dass ich ja nur die werte zeichnen könnte, die man gerade braucht und die restlichen nur abspeicher und bei bedarf abfrage. |
Das hier ist sicher die beste Idee, die du in diesem Zusammenhang bisher hattest.
Jann1k hat folgendes geschrieben: | könnte das problematisch werden, dass sich so aber eine große zahl von integerwerten ansammelt? |
Große Bitmaps sind sicher noch problematischer, also große Int-Arrays.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Jann1k 
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Mo 23.04.07 18:37
Gut, dass es wegen dem größer werdenden Bitmap wird, hab ich mir gedacht, die Lösung lautet also TChart, kennt jemand ein gutes Basistutorial dafür oder kann kurz erklären, wie man TChart benutzt, habe gerade die Delphi Hilfe benutzt und da ist massig Text, falls nicht werd ich mich wohl mal etwas einarbeiten müssen...
achja, falls jemand noch ne andere Lösung kennt, immer her damit xD
|
|
uwewo
      
Beiträge: 154
|
Verfasst: Mo 23.04.07 18:39
Oder benutze eine PaintBox und zeichne im OnPaint Ereignis immer den neuen Bereich.
|
|
|