Autor Beitrag
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 154



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 98

XP
Delphi 3,6,7,2005 PE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 154



BeitragVerfasst: Mo 23.04.07 17:55 
Mach mal bitte ein ScreenShot von Deinem Diagramm, und hänge ihn an.
DnC
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 98

XP
Delphi 3,6,7,2005 PE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 154



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 98

XP
Delphi 3,6,7,2005 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 23.04.07 18:37 
Moin!

user profile iconJann1k 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. :idea: ;)

user profile iconJann1k 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. :P

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Jann1k Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 154



BeitragVerfasst: Mo 23.04.07 18:39 
Oder benutze eine PaintBox und zeichne im OnPaint Ereignis immer den neuen Bereich.