[Monkey] Performance bei TileMaps
Übersicht

DukeS87Betreff: Performance bei TileMaps |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Heyho Leute, Ich bin gerade dabei ein Risiko Game zu programmieren. Dafür hab ich jetzt eine frühe Version des Editors fertiggestellt.
Die Gesamte Karte soll eine TileMap größe von (mind.) 180x180 Tiles haben. Jetzt hab ich gerade einmal meine Karte zu 15% oder so fertig und es beginnt schon die framerate drastisch in den Keller zu gehen. Zunächst habe ich die DrawRect befehle durch DrawImage ersetzt (gab irgendwie keinen erhofften Performance Gewinn). Ich denke mal der Knackpunkt wird in der Funktion: BlitzMax: [AUSKLAPPEN] Method DrawFields(_X:Int,_Y:Int,_CntX:Int,_CntY:Int) liegen. _X,_Y sind dabei die TileMap Koordinaten (oben links mit Scroll) und CntX,cntY die anzahl der Tiles in die jeweilige Richtung. (Da ich den Editor nur mit 50x50 Tiles benutze anstelle der gesamten Karte. Ich habe dabei die Liste der Regionen durch ein array ersetzt, ergab genausowenig einen Performance gewinn ![]() Meine konkreten Fragen: 1.kostet der SetColor Befehl einen nennenswerten Performanceverlust? dann würde ich vllt. versuchen immer Regionenweise (Felder mit gleicher Farbe) hintereinander zu zeichnen. sodass statt 50x50 Cls nur noch 80 Cls für 80 Regionen angewendet werden muss. 2. Ist es irgendwie möglich die Felder nur dann zu zeichnen wenn sich etwas verändert hat? Der Editor (und später das Spiel dazu) ist ja nur ein Teil dieser Zeichnung, sodass der Cls Befehl irgendwie alles ausser der Karte selbst löscht? Was mir dabei aufgefallen ist, Wenn ich keine Karte geladen habe, hab ich 60fps, wenn ich sie lade, sinkt es auf 20. Unabhängig davon ob nun der DrawImage teil ausgeführt wird, oder nicht. Also egal ob innerhalb der DrawFields(...) Methode nun Tiles auftauchen oder nicht. das finde ich merkwürdig. Ich würde ja erwarten, dass die Performance erst dann sinkt, wenn überhaupt irgendwelche Rechtecke gezeichnet werden? Momentan lasse ich meine Karte so zeichnen: BlitzMax: [AUSKLAPPEN] Method Draw() Ich hoffe ich konnte mein Problem einigermaßen verständlich rüberbringen mfG Stephan |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Setcolor ist langsam wenn du es jedesmal wieder ausführst.
ein Beispiel: Code: [AUSKLAPPEN] Method OnRender() Cls() Local start:Int = Millisecs() For Local i:Int = 0 Until 30 SetColor(255, 0, 0) DrawText("das ist ein Text", 50, 0 + i * 10) Next DrawText("MS: " + (Millisecs() -start), 0, 0) End achte mal auf die MS wenn du das setcolor rausnimmst ![]() denke der Fehler sollte dann bei dir hier zu finden sein: Code: [AUSKLAPPEN] Maniac_Color(RegionArray[regID+1].Color)
Code: [AUSKLAPPEN] #Rem If RegionArray[regID+1] <> Null Maniac_Color(RegionArray[regID+1].Color) 'DrawRect(X + (x-ScrollX)*fW,Y + (y-ScrollY)*fH,fW,fH) DrawImage imgField,X + (x-ScrollX)*fW,Y + (y-ScrollY)*fH,0,fW/imgField.Width(),fH/imgField.Height() EndIf #End Für die 2te frage bin ich zu unerfahren mit Monkey. Tut mir leid Gruß Dottakopf |
||
DukeS87 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Antwort, aber selbst wenn ich auf ...until 1000 setze, hab ich in beiden fällen 56 - 59 ms.
und meine Maniac_Color Funktion ist nicht anderes , als eine Sammlung von Farben: BlitzMax: [AUSKLAPPEN] Function Maniac_Color(_Color:Int) usw usf. hab bisher 80 Farben (8 Hauptfarben mit je 10 helligkeitsstufen im select abgefangen. Also glaube ich, liegt das eher am Grund-Design der TileMap, bzw. der Darstellung eben dieser. mfG welche Werte kommen denn bei dir, wenn du SetColor drin hast und nicht? |
||
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab kein Monkey, also kann ichs nicht selber testen, aber probier vielleicht mal die Schleifen zu vertauschen. Also außen Y und innen X. Das kann dir eventuell wegen Caching eine bessere Performance bringen (kommt drauf an, wie die Datenstrukturen im RAM liegen). Kann natürlich auch sein, dass sich nix verändert ![]() |
||
DukeS87 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Interessante Idee. Werd ich morgen gleich mal ausprobieren. Auch wenn ich mir irgendwie nicht so richtig vorstellen kann was sich dann aendern soll. Meine naechste idee waere irgendwie groessere flaechen mit gleicher regionsId zu finden und das zu zeichnende rechteck irgendwie so zu zeichnen das es meinetwegen 10x10 drawimages ersetzt. Hab nur noch nichtmal den hauch hauch einer idee wie das gehn soll. | ||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir fällt da grad nur eins auf:
Code: [AUSKLAPPEN] For Local oReg:Region = EachIn ListRegion
If oReg.ID = regID Sowas lässt sich mit einer sinnvollen Datenstruktur deutlich beschleunigen! |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
hä ? ich hab da 300 MS sobald ich setcolor einbaue ![]() Hab natürlich zuhause nur das HTML Target getestet ![]() |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
DukeS87 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
... Und ich hab nur glfw2 getestet ... Da ham wa aepfel mit birnen verglichen. Aber trotzdem konisch das es da sone unterschiede gibt. | ||
DukeS87 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok, hab jetzt mal ein kleines Beispiel nur mit der Map programmiert, und hab ich dann recht konstant 60 fps.
Also liegt es höchst wahrscheinlich an meiner eigenen GUI oder so. mit Q/A könnt ihr zoomen, mit den Pfeiltasten Scrollen. Aber vorsicht, noch wird kein Array-Überlauf abgefangen, also immer schön innerhalb der 180x180 bleiben ![]() HTML ist natürlich deutlich langsamer. Die Regionen werd ich in zukünftigen Versionen dann in einem Array abspeichern, da das durchlaufen der Liste sicherlich mehr Zeit kostet als ein einfacher array[][] befehl. Aber vllt. fällt euch ja trotzdem was am Design auf- was falsch ist, oder abgeändert werden sollte. mfG BlitzMax: [AUSKLAPPEN] Import mojo |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
1. Das ist ziemlich viel Code, um mal einfach so durchzuschauen. Zumal du offenbar schon einige Tipps erhalten hast und umsetzen konntest. Für eine einfache Stil-Kritik mag das ja gehen, aber solltest du mal ernsthaft wieder wo anstehen, wirst du wahrscheinlich länger warten müssen, bis sich einer erbarmt.
2. Code: [AUSKLAPPEN] map = New cMap(3,DH*0.1,DW*0.8-6,DH*0.85,180,180)
180x180 Tiles sind schon recht viel (immerhin 32400). 3. Code: [AUSKLAPPEN] For Local oReg:Region = EachIn ListRegion
If oReg.ID = regID Für jedes Tile wird also statt der Region nur die Regions-ID gespeichert und bei jedem zeichnen soll er für jedes Tile die ganze Liste durchgehen, um die entsprechende Region zu finden? Das ist äusserst unästhetisch und zudem auch unnötig langsam. Verwende doch anstatt einem Int-Array einfach ein Region-Array und erspare dir den Umweg über die ID ![]() (Edit: Oh, das weisst du ja schon) Und so nebenbei: Wenn du so "Suche in ungeordneter Liste genau einem Wert"-Sachen hast, dann verlasse die Schleife, sobald der Wert gefunden wurde. 4. Code: [AUSKLAPPEN] DrawFields(ScrollX,ScrollY,ViewMapX,ViewMapX)
Das zweite ViewMapX sollte wohl ein ViewMapY sein ![]() 5. Wieso verwendest du in Maniac_Color im Select-Statement nicht die Konstanten, die du definiert hast? 6. Die Drw_Grid Funktion ist in meinen Augen falsch konzipiert: Ein Gitter besteht nach meinem Verständnis aus Linien. Und zwar ViewMapX vertikalen und ViewMapY horizontalen linien ![]() mfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
DukeS87 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Au danke für die Ausführliche Antwort.
Ja das mit der Regionenliste hab ich ja schon erwähnt, werde ich zu Array's abändern. Aber trotzdem komisch, in meiner Version hatte ich da eigentlich ein "Exit" eingebaut. ist beim neuschreiben scheinbar auf mysteriöse weise verschwunden ![]() Ja und mit dem Grid, oops, da hast du natürlich auch recht. Das mir das noch nie aufgefallen ist. dabei benutze ich die Funktion schon locker n halbes Jahr ![]() Muss wohl noch etwas mehr Fleiß an den Tag legen beim überprüfen meiner Codes. Danke soweit erstmal. Ich denke damit wurde mir insgesamt genug geholfen. mfG Stephan |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group