Schrift
[thread]5198[/thread]

Perl Tk Canvas Objekt lahmt: GUI wird immer langsamer

Leser: 1


<< >> 10 Einträge, 1 Seite
Johnnz
 2006-06-01 20:35
#45541 #45541
User since
2006-06-01
4 Artikel
BenutzerIn
[default_avatar]
Ich hab ein Spiel (das weniger bekannte Brettspiel "Take it easy") implementiert und dabei das Problem, dass die GUI immer langsamer wird, je mehr Spiele ich spiele ... meine Vermutung ist, dass ich zu viele Objekte kreiere bzw. an Events "bind()"-e.

Nach jedem Spielzug zeichne ich das gesamte Brett neu. Mein Hauptfenster besteht nur aus einem Canvas-Objekt, auf welches ich beim Neuzeichnen 19-mal die Methode createPolygon() und 57-mal die Methode createLine() aufrufe. Da das alte Feld dabei überzeichnet wird, muss ich zudem auf alle Felder

$canvas->bind(FeldXY, "<Button-1>", \&selectField);

aufrufen, damit es auf Mausklicks reagiert.

Nach einigen Spielen (jedes besteht aus 19 Zügen und folglich 19 Repaints) wird die GUI ziemlich lahm. Woran könnte das liegen? Bleiben Objekte die ich mit "createXY" erzeugt habe im Speicher liegen und ich hab unwissentlich noch tausende aktiv und an Mausklicks gebunden? Oder liegts einfach an den unzähligen Binds, die dadurch entstehen?

Grüße,
Johannes
renee
 2006-06-01 20:55
#45542 #45542
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich kenne das Spiel nicht, aber sind wirklich immer Neuzeichnungen nötig? Reicht nicht ein move?

"Zerstörst" Du alte Objekte?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Johnnz
 2006-06-01 21:17
#45543 #45543
User since
2006-06-01
4 Artikel
BenutzerIn
[default_avatar]
Naja, das komplette Neuzeichnen war die erstbeste Lösung, weil ich mangels Erfahrung nicht geahnt habe dass das so teuer wird.

Ich zerstöre keine Objekte, nein. Ich hab selbiges versucht, indem ich destroy() auf die von createXY() erzeugten Objekte aufgerufen habe, aber das funktioniert so nicht. Das Canvas-Objekt jedesmal zu zerstören wenn ein Zug gemacht wird halte ich für nicht so geschickt ... hm, vielleicht probier ich's einfach mal damit, für ein neues Spiel immer ein neues Canvas-Objekt zu erzeugen. Interessant wäre es aber dennoch, wie ich mich alter Objekte, die durch canvas->createXY() entstanden sind, entledigen kann.
renee
 2006-06-01 21:40
#45544 #45544
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst einen sehr kleinen Scope für die Objekte wählen. Und versuch mal die move-Methode (siehe CPAN:Tk::Canvas).

Benutzt Du Wiki:strict und warnings??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2006-06-01 23:36
#45545 #45545
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Welche Tk-Version benutzt du? Bei Tk800 gab es auf jeden Fall ein Problem mit der Performance, wenn man andauernd Canvas-Items zerstört und erzeugt hat. Das Wiederverwenden von Canvas-Items hilft enorm. Möglicherweise hat sich das mit Tk804 gebessert.
Johnnz
 2006-06-02 00:09
#45546 #45546
User since
2006-06-01
4 Artikel
BenutzerIn
[default_avatar]
Ich weiß nicht genau welches Tk ich verwende, aber schätzungsweise das Neuste, denn meine Ubuntu-Linux Installation, bei der das standardmäßig dabei war, ist noch nicht so alt ("Breezy Badger").

Das Canvas-Objekt habe ich bisher nie zerstört, daher kann es nicht daran gelegen haben. Allerdings hab ich jetzt eine Lösung für mein Problem gefunden, indem ich nun doch beim Starten eines neuen Spiels, das Canvas-Objekt zerstöre und neu erzeuge.

Generieren createPolygon() und Konsorten denn nun eigentlich Objekte oder zeichnen sie nur irgendwas? Da ich schließlich Mausklicks an die daraus entstandenen Objekte gebunden habe, sollten es Objekte sein, und folglich zerstörbar, oder?
ptk
 2006-06-02 00:53
#45547 #45547
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Johnnz,01.06.2006, 22:09]Ich weiß nicht genau welches Tk ich verwende, aber schätzungsweise das Neuste, denn meine Ubuntu-Linux Installation, bei der das standardmäßig dabei war, ist noch nicht so alt ("Breezy Badger").
[/quote]Sag das nicht. Bei Debian wird schließlich auch noch das alte Tk800.025 verwendet. Und Ubuntu und Debian sind ja verwandt.

Quote
Das Canvas-Objekt habe ich bisher nie zerstört, daher kann es nicht daran gelegen haben. Allerdings hab ich jetzt eine Lösung für mein Problem gefunden, indem ich nun doch beim Starten eines neuen Spiels, das Canvas-Objekt zerstöre und neu erzeuge.


Ich meinte nicht, dass du das gesamte Objekt zerstörst, sondern nur einzelne Items (mit $canvas->delete)

Quote
Generieren createPolygon() und Konsorten denn nun eigentlich Objekte oder zeichnen sie nur irgendwas? Da ich schließlich Mausklicks an die daraus entstandenen Objekte gebunden habe, sollten es Objekte sein, und folglich zerstörbar, oder?


Was verstehst du unter "Objekt"? Letztendlich werden im Tk-Core C-Strukturen für die Canvas-Items erzeugt.
Dubu
 2006-06-02 10:17
#45548 #45548
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=ptk,01.06.2006, 22:53]Sag das nicht. Bei Debian wird schließlich auch noch das alte Tk800.025 verwendet. Und Ubuntu und Debian sind ja verwandt.
[/quote]
In Debian stable, ja. In testing und unstable liegt aber die 804.027, dann ist Ubuntu garantiert auch nicht älter.\n\n

<!--EDIT|Dubu|1149229099-->
ptk
 2006-06-02 10:24
#45549 #45549
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Genaueres wird wohl nur
Code: (dl )
perl -MTk\ 99999

verraten.
Johnnz
 2006-06-02 12:21
#45550 #45550
User since
2006-06-01
4 Artikel
BenutzerIn
[default_avatar]
Der Befehl liefert

"Tk version 99999 required--this is only version 804.027".

Ich bin also auf dem neusten Stand. 8)

Das mit Canvas->delete probier ich mal.
<< >> 10 Einträge, 1 Seite



View all threads created 2006-06-01 20:35.