![]() |
Rechenintensiven Code bei OnMouseMove optimieren - aber wie?
Hi,
also ich programmiere gerade eine Art "Map-Editor". Ich habe die Spielfläche in 2600 Teile (Tiles) eingeteilt. Diese sind im Editor jeweils Weiß umrahmt, sollen aber, wenn man mit der Maus über ein Tile geht rot werden. Mit dem folgenden Code erstelle ich die weißen Rechtecke, die die einzelnen Teils voneinander abtrennen.
Code:
Bei "OnMouseMove" der Oberfläche frage ich ab, welches der Tiles rot markiert werden muss. Die anderen werden in der Zwischenzeit wieder weiß gezeichnet (logischerweise).
for X := 0 to XWert do
for Y := 0 to YWert do Rectangle(x*12,y*12,x*12+12,y*12+12); Mein Problem: Da 2600 Tiles doch schon sehr viel sind, ist die ganze Procedure sehr rechenintensiv. Wie könnte ich das denn besser verarbeiten? Falls jemand mein Problem nicht verstanden hat, kann ich ja mit eventuellen Screenshots weiterhelfen. Gruß Christian |
Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
Moin Yheeky,
warum beschränkst Du Dich nicht darauf, das Tile, über dem sich der Cursor befindet rot einzufärben, und nur die maximal acht die um dieses Tile herum sind wieder mit einem weissen Rahmen zu versehen? Alle anderen behalten ja sowieso ihren weissen Rahmen. Du würdest dann, im Prinzip, einen 3x3 Tile grossen Rahmen, bei dem immer die Mitte rot eingefärbt ist, über Deine Map bewegen. |
Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
Guter Ansatz...das werde ich mal probieren. Danke dir!
Gruß Christian |
Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
Mhmm, naja funktioniert nicht so, wie ich mir das erhofft hatte. Vom Prinzip her kein Problem, da funktioniert es, aber wenn man die Maus schneller bewegt und aus dem "Zeichenbereich" rauskommt, sind nunmal die alten Markierungen wieder da. Wenn ich den Zeichenbereich erhöhe, tritt das alte Problem der Geschwindigkeit wieder auf.
Gibt´s da vielleicht noch andere Möglichkeiten? |
Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
Moin Yheeky,
Du könntest während gezeichnet wird die MouseMove Prozedur deaktivieren, und sobald Du mit dem Zeichnen fertig bist wieder zur Verfügung stellen. |
Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
Wie kann ich sie denn deaktivieren?
|
Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
Moin Yheeky,
so sollte es gehen, dann wird erst mal die Routine deaktiviert, gezeichnet, und die Routine neu aktiviert.
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var mmSave : TMouseMoveEvent; begin mmSave := self.FormMouseMove; self.OnMouseMove := nil; try // Zeichnen finally self.OnMouseMove := mmSave; end; end; |
Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
Mhmm, ne, funktioniert nicht. :(
|
Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
Moin Yheeky,
und wenn Du Dir zusätzlich merkst, wo Du zuletzt das rote Feld gezeichnet hast, und dieses dann zuerst mal wieder mit einem weissen Rahmen versiehst, bevor Du das neue zeichnest? Eventuell könntest Du noch prüfen, dass das neue Feld <> dem alten ist, damit es nicht unnötig flackert. |
Re: Rechenintensiven Code bei OnMouseMove optimieren - aber
Das mit dem Prüfen des Feldes war meine erste Idee. Die hatte damals auch nicht so richtig funktioniert, aber vielleicht jetzt mit der neuen Funktion zusammen. Ich probier´s mal eben...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 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 by Thomas Breitkreuz